【问题标题】:sending email with ssl using javax.mail使用 javax.mail 使用 ssl 发送电子邮件
【发布时间】:2014-12-20 07:11:49
【问题描述】:

我想使用 gmail 作为 smtp 服务器发送电子邮件。

这是我的代码,我不能让它工作...... 运行 testSettings() 后,我得到调试输出,然后它就停止了。没有超时,没有错误,什么都没有……

public void testSettings() {
    final String username = Settings.get("benutzername");
    final String password = Settings.get("passwort");

    Properties props = new Properties();
    props.put("mail.transport.protocol", "smtps");

        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.socketFactory.port", Settings.get("port"));
        props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");

    props.put("mail.smtp.auth", "true");

    props.put("mail.smtp.host", Settings.get("server"));
    props.put("mail.smtp.port", Settings.get("port"));
    props.put("mail.smtp.timeout", "10000");

    props.put("mail.smtp.ssl.checkserveridentity", "false");
    props.put("mail.smtp.ssl.trust", "*");
    props.put("mail.smtp.connectiontimeout", "10000");

    props.put("mail.smtp.debug", "true");
    props.put("mail.smtp.socketFactory.fallback", "false");
    Session session = Session.getInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });
    session.setDebug(true);
    try {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("myemail@gmail.com"));
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("myemail@gmail.com"));
        message.setSubject("Testing Subject");
        message.setText("test");
        Transport transport = session.getTransport("smtps");
        transport.send(message);
        // Transport.send(message);

        System.out.println("Done");

    } catch (MessagingException e) {
        // throw new RuntimeException(e);
    }
}


DEBUG: setDebug: JavaMail version 1.4.7
DEBUG: getProvider() returning     javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle]
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false

出现以下错误: http://pastie.org/private/rkoknss6ppiufjd9swqta

【问题讨论】:

  • 你试过this answer提供的解决方案了吗?
  • 是的,没有任何变化...仍然没有错误..它只是挂起
  • 请查看我的编辑以获取错误消息。

标签: java email


【解决方案1】:

我的问题在于计算机名称,它包含西里尔符号。为了了解您的问题的原因,请添加

props.put("mail.debug", "true");

另见工作代码here

【讨论】:

    【解决方案2】:

    如果您使用 Windows 并且有任何防病毒或防火墙禁用它并尝试。

    【讨论】:

      【解决方案3】:

      阅读本文: http://www.oracle.com/technetwork/java/javamail/faq-135477.html#commonmistakes

      使用

      props.put("mail.smtp.socketFactory.class",
              "javax.net.ssl.SSLSocketFactory");** 
      

      和

      props.put("mail.smtp.socketFactory.port", "465");
      

      有点过时了。为了简化代码,请使用:

      properties.put("mail.smtp.port", "465");
      properties.put("mail.smtp.ssl.enable", "true");
      

      【讨论】:

        【解决方案4】:

        而不是

        props.put("mail.transport.protocol", "smtps");

        传输传输 = session.getTransport("smtps");

        使用

        props.put("mail.transport.protocol", "smtp");

        传输传输 =session.getTransport("smtp");

        使用 smtp,而不是 smtps

        我使用了 JDK 8、Netbeans 8、JavaMail 1.5.2,这个例子运行良好:

        public static void main(String[] args) {
            Properties props = new Properties();
            props.put("mail.smtp.host", "smtp.gmail.com");
            props.put("mail.smtp.socketFactory.port", "465");
            props.put("mail.smtp.socketFactory.class",
                    "javax.net.ssl.SSLSocketFactory");
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.port", "465"); 
            Session session = Session.getDefaultInstance(props,
                new javax.mail.Authenticator() {
                                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication("username@gmail.com","password");
                    }
                });
        
            try {
        
                Message message = new MimeMessage(session);
                message.setFrom(new InternetAddress("frommail@gmail.com"));
                message.setRecipients(Message.RecipientType.TO,
                        InternetAddress.parse("tomail@gmail.com"));
                message.setSubject("Testing Subject");
                message.setText("Test Mail");
        
                Transport.send(message);
        
                System.out.println("Done");
        
            } catch (MessagingException e) {
                throw new RuntimeException(e);
            }
        }
        

        如果您无法连接端口 465,请尝试端口 587

        【讨论】:

        • 是的,我相信这行得通。几天前我在我的笔记本电脑上测试了这个,但在我的桌面上我无法让它工作......我不知道为什么......
        • 我刚刚复制了您的代码,创建了一个新的 java 项目,填写了我的数据,然后对其进行了测试。它仍然没有发生任何事情。
        • 我使用 java 8、netbeans 8 和 JavaMail API 1.5.2 测试并且工作没有任何问题,并且自己发送邮件,一切正常。检查您与 smtp.gmail com 465 端口的连接,您可以使用 telnet 进行连接。最新的 JavaMail API:java.net/projects/javamail/pages/…
        • mhhh,当我使用 putty 远程登录 smtp.gmail.com 465 时,会打开一个空白屏幕,也没有任何反应:
        • 这说明你有连接,用什么java版本?如果java版本和api版本不同,可能会出现一些问题
        猜你喜欢
        • 2018-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多