JavaMail通过vps发送电子邮件,不需要身份验证,但获取AuthenticationFailedException-为什么?
我最初将我的网站设置为使用本地ISP通过我的网站发送电子邮件。我想改变这一点,并开始通过我的VPS发送电子邮件。根据在线文档(来自我的vps提供商),我有“SMTP认证前的POP”。因此,此时我不需要身份验证,也不需要安全连接 我对通过本地ISP发送电子邮件的代码做了一些修改。以下是我所拥有的:JavaMail通过vps发送电子邮件,不需要身份验证,但获取AuthenticationFailedException-为什么?,java,email,authentication,smtp,jakarta-mail,Java,Email,Authentication,Smtp,Jakarta Mail,我最初将我的网站设置为使用本地ISP通过我的网站发送电子邮件。我想改变这一点,并开始通过我的VPS发送电子邮件。根据在线文档(来自我的vps提供商),我有“SMTP认证前的POP”。因此,此时我不需要身份验证,也不需要安全连接 我对通过本地ISP发送电子邮件的代码做了一些修改。以下是我所拥有的: Transport t = null; try { String Username = "mrsmith@mydomain.com"; String Password = "so
Transport t = null;
try {
String Username = "mrsmith@mydomain.com";
String Password = "somepassword";
InternetAddress from = new InternetAddress("mrsmith@mydomain.com", "Bob Smith");
Properties props = new Properties();
//commented out, since I don't want to use authentication
//props.setProperty("mail.smtp.auth", "true");
props.put("mail.pop3.host", "mydomain.com";
props.put("mail.smtp.host", "mydomain.com");
String protocol = "smtp";
Session ssn = Session.getInstance(props, null);
ssn.setDebug(true);
t = ssn.getTransport(protocol);
Store s = ssn.getStore();
s.connect();
t.connect(SMTP,Username,Password);
//Create the message
Message msg = new MimeMessage(ssn);
msg.setFrom(from);
msg.addRecipient(Message.RecipientType.TO, to);
msg.setSubject(subject);
msg.setContent(body, "text/html");
t.sendMessage(msg, msg.getAllRecipients());
t.close();
s.close();
我联系了我的vps提供商,在按照他们的指示调整代码后,我仍然得到“身份验证失败”。这是在成功连接到端口25上的主机后进行的
有人能指出我遗漏了什么吗
编辑以添加其他信息
在我添加store.connect(“mailhost”、用户名、密码)之后;声明的代码,我得到了比以往任何时候都更进一步
下面是一些打印到tomcat提示符的信息-
DEBUG : getProvider() returning javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc.]
POP3: connecting to host "mydomain.com", port 110, isSSL false
server ready
OK User name accepted, password please
Password somepassword
OK Mailbox open, 0 messages
DEBUG: geProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smpt.SMTPTransport,Sun Microsystems, Inc.]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "mydomain.com", port 25, isSSL false
220 mydomain.com ESMTP Sendmail 8.14.3/8.14.3; DEC 2010 29
DEBUG SMTP: connected to host "mydomain.com", port: 25
( a lot of additional debug information was here )
DEBUG SMTP: Attempt to authenticate
AUTH LOGIN
535 5.7.0 authentication failed
javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:319)
at javax.mail.Service.connect(Service.java:169)
... continues with more 'at's.
DEBUG:getProvider()返回javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,sun Microsystems,Inc.]
POP3:连接到主机“mydomain.com”,端口110,isSSL错误
服务器就绪
确定接受用户名,请输入密码
密码
确定邮箱已打开,0封邮件
调试:geProvider()返回javax.mail.Provider[传输,smtp,com.sun.mail.smpt.SMTPTransport,sun Microsystems,Inc.]
调试SMTP:useEhlo true,useAuth false
调试SMTP:尝试连接到主机“mydomain.com”,端口25,isSSL false
220 mydomain.com ESMTP Sendmail 8.14.3/8.14.3;2010年12月29日
调试SMTP:已连接到主机“mydomain.com”,端口:25
(这里有很多额外的调试信息)
调试SMTP:尝试进行身份验证
身份验证登录
535.7.0身份验证失败
javax.mail.AuthenticationFailedException
在javax.mail.Service.connect(Service.java:319)
在javax.mail.Service.connect(Service.java:169)
... 继续使用更多的“at”。
你在这些信息中看到什么奇怪的东西了吗?我不太明白为什么当Pop3使用相同的用户名和密码进行身份验证时,身份验证失败了。
SMTP身份验证之前的POP基本上意味着您需要能够证明您可以使用POP3(使用正确的身份验证)获取邮件,然后才能允许您使用SMTP(无身份验证)发送邮件 使用Java Mail API,您可以像这样对POP3服务器进行身份验证:
Store store = ssn.getStore("pop3");
store.connect("mailhost", Username, Password);
您应该在连接到SMTP服务器之前执行这些调用,因此在连接到SMTP服务器之前(不带用户名和密码),如下所示
t.connect();
确保先连接到商店
在您的代码段中,您仍然在根据smtp进行身份验证,因为您正在提供用户名/密码
另一种选择是使用Commons电子邮件,它在smtp身份验证之前内置了对pop的支持。在中检查以下方法
使用commons电子邮件,无需在代码中执行pop管道(发送前连接)
有关更多信息,请访问:
检查提供程序实现(pop3.jar)是否在您的构建路径/类路径中。VPS上的邮件日志中有什么内容?12月28日15:48:40 motokarz saslauthd[20304]:do_auth:auth failure:[user=mrsmith][service=smtp realm mydomain.com][mech=pam][reason=pam auth error]您知道如何在我的web应用程序中禁用SMTP身份验证吗?我尝试了您指示的方法-我将代码放在t.sendMessage()之前和t.connect()之后。。。。但我还是得到了同样的例外。。。请注意,根据您的建议,我在上面的原始帖子中所做的更改(请查看代码段)。在您的代码中,您在通过POP进行身份验证之前连接到SMTP。t、 connect(SMTP、用户名、密码)已连接到SMTP服务器,而不是sendMessage(),好的,进行了更改,现在我收到一个javax.mail.NoSuchProviderException,协议无效:null我假设我缺少了其他内容,但什么?你得到了。。。我编辑了答案。您是否使用ssn.getStore(“pop3”)而不是ssn.getStore()?感谢您继续帮助我:)我刚刚尝试将其更改为ssn.getStore(“pop3”),我再次收到AuhenticationFailedException。然后我将“pop3”改为“pop3”,只是为了尝试一下,然后我得到了“NoSuchProviderException:No provider for pop3”。
email.setPopBeforeSMTP(true,popHost,popUsername,popPassword);
Properties props = new Properties();
props.put("mail.smtp.host", "mailserver.com");
Session s = Session.getInstance(props,null);
InternetAddress from = new InternetAddress("mail@mail.com");
InternetAddress to = new InternetAddress(recepeint@server.com");