我正在使用以下代码通过SMTP(使用邮件提供商web.de)发送电子邮件:
package form.controll;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class NotificationControllerTest {
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void test() {
NotificationController aNotifi = new NotificationController( "smtp.web.de", "587" );
aNotifi.sendEmail( "TARGETEMAIL@blabla.de", "SENDERSEMAIL@web.de", "THESENDERSPASSWORD", "New User Registration Notification", "New User has just been registered to blabla" );
}
}
这很好,但是如果我在PROXY上下文中使用相同的方法,
我总是得到错误:
535身份验证凭据无效
-为什么会这样?
-如何修复电子邮件发送?
最佳答案
您应该阅读this FAQ answer
JavaMail当前不支持通过以下方式访问邮件服务器:
Web代理服务器。使用代理服务器的主要原因之一是
允许来自公司网络内的HTTP请求通过
公司防火墙。防火墙通常会阻止大多数访问
Internet,但将允许来自代理服务器的请求通过
通过。另外,公司网络内部的邮件服务器将
对电子邮件执行类似的功能,通过SMTP接收邮件并
将它们转发到Internet上的最终目的地,以及
接受传入消息并将其发送到适当的位置
内部邮件服务器。
如果您的代理服务器支持SOCKS V4或V5协议
(http://www.socks.nec.com/aboutsocks.html,RFC1928)并允许
匿名连接,并且您正在使用JDK 1.5或更高版本以及JavaMail
1.4.5或更高版本,可以通过将“ mail.smtp.socks.host”属性设置为每个会话,每个协议来配置SOCKS代理。
在com.sun.mail.smtp软件包的javadocs中进行了介绍。类似
存在“ imap”和“ pop3”协议的属性。
如果您使用的是JDK或JavaMail的旧版本,则可以知道
Java运行时将所有TCP套接字连接定向到SOCKS
服务器。有关最新的信息,请参见网络属性指南。
socksProxyHost和socksProxyPort属性的文档。
这些是系统级属性,而不是JavaMail会话属性。
可以在调用应用程序时从命令行设置它们,
例如:java -DsocksProxyHost = myproxy...。此功能可以是
用于将JavaMail的SMTP,IMAP和POP3通信定向到
SOCKS代理服务器。请注意,设置这些属性将指导所有
SOCKS代理的TCP套接字,这可能会对
应用程序的其他方面。
如果没有此类SOCKS服务器,则要使用JavaMail进行访问
邮件服务器间接位于防火墙之外,您也许可以使用
诸如Corkscrew之类的程序,或连接至隧道TCP连接
通过HTTP代理服务器。 JavaMail不支持直接访问
通过HTTP代理Web服务器。