【问题标题】:TLS issue when sending to gmail through JavaMail通过 JavaMail 发送到 gmail 时的 TLS 问题
【发布时间】:2011-09-24 15:23:21
【问题描述】:

事实证明,JavaMail 比我想象的更令人沮丧。我在网上查看了几个关于如何通过 Gmail 的服务器(但不是通过 SSL)发送简单 SMTP 电子邮件的示例。在尝试了几个不同的代码示例后,当我调用transport.connect() 时,我一直得出相同的示例异常。我不断得到这个堆栈跟踪:

Exception in thread "main" com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. l10sm302158wfk.21
     at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2057)
     at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1580)
     at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1097)
     at SendEmail.main(SendEmail.java:47)

有人可以告诉我应该添加什么或做什么来解决这个问题吗?

这是我的代码:

    Properties props = new Properties();
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.host", "smtp.gmail.com");
    props.put("mail.user", "blahblah@gmail.com");
    props.put("mail.password", "blah");
    props.put("mail.port", "587");

    Session mailSession = Session.getDefaultInstance(props, null);
    Transport transport = mailSession.getTransport();

    MimeMessage message = new MimeMessage(mailSession);
    message.setSubject("This is a test");
    message.setContent("This is a test", "text/plain");
    message.addRecipient(Message.RecipientType.TO, new InternetAddress("blahblah2@gmail.com"));

    transport.connect();
    transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
    transport.close();

【问题讨论】:

    标签: java email smtp gmail jakarta-mail


    【解决方案1】:

    您需要启用STARTTLS。在您的配置中再添加一个属性:

    props.put("mail.smtp.starttls.enable", "true");
    

    【讨论】:

    • 感谢您解决了 STARTTLS 问题,但我现在遇到了这个异常。你能帮助我吗?线程“主”com.sun.mail.smtp.SMTPSendFailedException 中的异常:530-5.5.1 需要身份验证。在 530 5.5.1 mail.google.com/support/bin/answer.py?answer=14257g2sm368231pbh.15 了解更多信息...我查看了它包含的网站,但没有找到任何有用的信息。
    • 呸,是的,您还需要将mail.smtp.auth 属性设置为true
    • 再次感谢! Noooooooow 我收到此错误...“连接失败,未指定密码?”...我知道我已经提供了密码,正如您从上面的代码中看到的那样。但是密码的属性标签是否命名为我未正确提供的其他名称?
    • 好的,也许您应该使用Authenticator 而不是配置凭据。删除 mail.usermail.password 键。然后,不要将null 作为第二个参数传递给Session.getDefaultInstance,而是创建并传递一个覆盖getPasswordAuthentication 方法的Authenticator 的实现——细节很简单。
    • Uhg,所以这个程序在我的开发桌面上运行得非常好。但是当我将它移到我的服务器机器上并运行它时,我收到了这个错误:javax.mail.MessagingException: Could not convert socket to TLS;嵌套异常是:java.io.IOException:使用套接字工厂类 null:主机,端口:smtp.gmail.com,25 的 startTLS 中的异常;异常:java.security.ProviderException:无法初始化 NSS com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1880) com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:648).. . 有什么想法吗?
    【解决方案2】:
    import java.util.*;
    import javax.mail.*;
    import javax.mail.internet.*;
    import javax.activation.*;
    
    public class CopyOfSendMail {
    
    private static String SMPT_HOSTNAME = "my smtp port no";
    private static String USERNAME = "root";
    private static String PASSWORD = "root";
    
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("mail.smtp.host", SMPT_HOSTNAME);
        props.put("mail.from","aaa@gmail.com");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.debug", "true");
    
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USERNAME, PASSWORD);
            }
        });
        try {
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom();
            msg.setRecipients(Message.RecipientType.TO,
                              "bbb@gmail.com");
            msg.setSubject("JavaMail hello world example");
            msg.setSentDate(new Date());
            msg.setText("Hello, world!\n");
            Transport.send(msg);
         } catch (MessagingException mex) {
            System.out.println("send failed, exception: " + mex);
         }
        }
    }
    

    【讨论】:

    • 感谢罗伯和布赖恩!在你们的帮助下,我将整个代码放在这里...正在寻找 4 创建简单邮件发件人的任何 1 都可以使用上面的代码,它会很好地工作。
    【解决方案3】:

    这里是使用 MSN-SMTP 服务的邮件发件人

    我的主机是 smtp.live.com,端口是 587。

    official doc of Java Mail 中所述,您可以在此处获得有关发送和接收邮件的最佳 Java Mail 机制的更多信息。

    邮件客户端的属性是:

      Properties mailProps = new Properties();
      mailProps.put("mail.smtp.user",mailID);
      mailProps.put("mail.smtp.host",host);
      mailProps.put("mail.smtp.auth", "true");
      mailProps.put("mail.smtp.port",port);
      mailProps.put("mail.smtp.starttls.enable", "true");
      Session mailSession = Session.getInstance(mailProps,null);
    

    发送机制是:

     SMTPTransport t=(SMTPTransport)mailSession.getTransport("smtp");
     System.out.println(" Taking protocol! ");
     t.connect(host, mailID, password);
     System.out.println(" Connection Successfull! ");
     t.sendMessage(mimMessage,mimMessage.getAllRecipients());
    

    注意:
    代码在本地 印度服务器上运行良好。 但这在 Azur Congo 上没有响应:两者都是 Linux 服务器。

    错误是:

     com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first
    

    即使手动设置系统属性:

     java -Dmail.smtp.starttls.enable=true SendAMai
    

    @Rob Harrop 和@Brian 的分数也得到保证

    if you're on Linux ensure that you have libnss3 and openssl installed
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多