我最初设置我的网站使用我的本地ISP通过我的网站发送电子邮件。我想改变这一点,并开始通过我的VPS发送电子邮件。根据在线文档(来自我的vps提供商),我有“SMTP身份验证前的POP”。那么,我不需要身份验证,也不需要安全连接。
我在用于通过本地ISP发送电子邮件的代码中更改了一些内容。这就是我所拥有的:
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.
您是否在此信息中看到任何奇怪的内容?我不太明白为什么在使用相同的用户名和密码对Pop3进行身份验证时身份验证失败。
答案 0 :(得分:1)
SMTP身份验证之前的POP基本上意味着您需要能够证明您可以使用POP3(使用适当的身份验证)获取邮件,然后才允许您使用SMTP发送邮件(无需身份验证)。
使用Java Mail API,您可以像这样对POP3服务器进行身份验证:
Store store = ssn.getStore("pop3");
store.connect("mailhost", Username, Password);
您应该在连接到SMTP服务器之前执行这些呼叫,因此在连接到SMTP服务器之前(没有用户名和密码),这样
t.connect();
确保先连接到商店。
在您的代码段中,当您提供用户名/密码时,您仍在对smtp进行身份验证。
另一个选择是使用Commons Email,它在smtp身份验证之前内置了对pop的支持。在http://commons.apache.org/email/apidocs/org/apache/commons/mail/Email.html
中查看以下方法email.setPopBeforeSMTP(true,popHost,popUsername,popPassword);
使用commons电子邮件,您无需在代码中进行弹出管道(在发送之前连接)。
答案 1 :(得分:0)
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");
欲了解更多信息,请访问:
http://www.itpian.com/Coding/314-SENDING-EMAILS-THROUGH-JAVAMAIL.aspx
答案 2 :(得分:0)
检查提供程序实现(pop3.jar)是否在buildpath / classpath中。