Java Mail异常错误

12

我的代码:

import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendMailTLS {
public static void main(String[] args) {
    final String username = "myemailid@gmail.com";
    final String password = "myemailpassword";
    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.port", "587");
    Session session = Session.getInstance(props,
      new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
      });

    try {
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("myemailid@gmail.com"));
        message.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse("myfriedemail@ymail.com"));
        message.setSubject("Testing Subject");
        message.setText("Dear Mail Crawler,"+
 "\n\n No spam to my email,please!"); 
        Transport.send(message);
        System.out.println("Done");
    } catch (MessagingException e) {
        throw new RuntimeException(e);
    }
}
}

我的错误:

主线程中的异常java.lang.RuntimeException:javax.mail.MessagingException:
未知的SMTP主机:smtp.gmail.com;
嵌套异常是:
java.net.UnknownHostException:smtp.gmail.com
at Mail.SendMailTLS.main(SendMailTLS.java:56)
引起的原因是:javax.mail.MessagingException:未知的SMTP主机:smtp.gmail.com;
嵌套异常是:
java.net.UnknownHostException:smtp.gmail.com
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1970)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:642)
at javax.mail.Service.connect(Service.java:317)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:125)
at javax.mail.Transport.send0(Transport.java:194)
at javax.mail.Transport.send(Transport.java:124)
at Mail.SendMailTLS.main(SendMailTLS.java:51)
引起的原因是:java.net.UnknownHostException:smtp.gmail.com
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:177)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:525)
at java.net.Socket.connect(Socket.java:475)
at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:319)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:233)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1938)
... 7 more
Java结果:1

我使用本地代理172.17.0.4:8080,用户名为:user1,密码为:user2
请问有什么解决方案?


2
什么情况?我在想为什么你同时添加了Swing和SWT标签。然后当我检查源代码顶部的导入时,我又在想为什么你要添加其中任何一个。能否澄清一下? - Andrew Thompson
1
尝试对服务器进行ping测试,并检查您是否能够通过代理访问Gmail。 - Phani
你最终解决了这个问题吗? - Vlad
我曾经遇到过与pop.gmail.com类似的问题——代码可以正常工作,但是在一段时间后出现了异常,尝试了几次之后又恢复正常了。因此,故障可能不在你这边 :) - kiedysktos
6个回答

15

请尝试使用以下服务器:

smtp.googlemail.com


12

如果您使用代理,我认为您不能使用Java Mail。

来源: oracle.com

问:如何配置JavaMail通过我的代理服务器工作?

答:JavaMail目前不支持通过Web代理服务器访问邮件服务器。使用代理服务器的主要原因之一是允许企业网络内的HTTP请求通过企业防火墙。防火墙通常会阻止对Internet的大多数访问,但会允许代理服务器发出的请求通过。此外,企业网络内的邮件服务器将执行类似的功能,接受通过SMTP发送的消息并将其转发到Internet上的最终目标,接受传入的消息并将其发送到适当的内部邮件服务器。


更新

问:如何配置JavaMail通过我的代理服务器工作?[已更新!]

答:从JavaMail 1.6.0开始,JavaMail支持通过Web代理服务器访问邮件服务器。设置“mail.protocol.proxy.host”和“mail.protocol.proxy.port”属性以针对代理服务器进行配置。通过设置“mail.protocol.proxy.user”和“mail.protocol.proxy.password”属性支持代理服务器基本身份验证。

此外,如果您的代理服务器支持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支持通过设置“java.net.socks.username”和“java.net.socks.password”系统属性(因此适用于所有SOCKS连接)来对SOCKS服务器进行身份验证,具体描述详见JDK网络属性文档。
如果您正在使用旧版本的JDK或JavaMail,则可以告知Java运行时将所有TCP套接字连接定向到SOCKS服务器。有关socksProxyHost和socksProxyPort属性的最新文档,请参阅网络属性指南。这些是系统级属性,而不是JavaMail会话属性。它们可以在应用程序被调用时从命令行设置,例如:java -DsocksProxyHost=myproxy....。此功能可用于将JavaMail的SMTP、IMAP和POP3通信定向到SOCKS代理服务器。请注意,设置这些属性将所有TCP套接字定向到SOCKS代理,这可能会对应用程序的其他方面产生负面影响。
当使用旧版本的JavaMail并且没有这样的SOCKS服务器时,如果您想间接地使用JavaMail访问防火墙外的邮件服务器,则可以使用像connect这样的程序通过HTTP代理服务器隧道传输TCP连接。将JavaMail配置为使用connect实例作为SOCKS服务器。

3

1
尽管这是一个旧答案,但我想说它只在某些情况下才是正确的。在我的情况下,虽然 lesssecureapps 已经打开,但代理仍然是一个问题。似乎没有好的方法来解决这个问题。 - shemekh

1

仅供开发目的,您可以尝试通过代理打开通往smtp.gmail.com的隧道。

proxytunnel -q -p proxy_host:proxy_port -d smtp.gmail.com:465 -a local_port

并在您的代码中使用

props.put("mail.smtp.host", "localhost");
props.put("mail.smtp.port", "local_port");

如何打开隧道? - Amit Kumar

1

你可以尝试使用 props.put("mail.smtp.host", "gmail.com"); 而不是 smtp.gmail.com


0

当您将 javamail 升级到 1.6.2 版本时,它可以正常工作。


你的回答可以通过添加额外的支持信息来改进。请编辑以添加更多细节,如引用或文档,以便其他人可以确认你的回答是正确的。你可以在帮助中心找到有关如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接