将 Gmail SMTP 服务器与 JavaMail 一起使用:必须先发出 STARTTLS 命令(JavaMail 版本 1.4.1)

Using Gmail SMTP servers with JavaMail: Must issue a STARTTLS command first (JavaMail version 1.4.1)

我在网上阅读了很多资料和发帖前建议的问题,但找不到适合我的东西。

在过去的 5 天里,我一直在寻找解决这个问题的方法,但一直找不到。

相关代码:

private void sendMail(){

  final String username = "foo";
  final String password = "bar";

  Properties props = System.getProperties();
  props.put("mail.smtp.starttls.enable", true); // added this line
  props.put("mail.smtp.host", "smtp.gmail.com");
  props.put("mail.smtp.user", username);
  props.put("mail.smtp.password", password);
  props.put("mail.smtp.port", "587");
  props.put("mail.smtp.auth", true);
  props.put("mail.debug", "true");

  Session session = Session.getInstance(props,null);
  MimeMessage message = new MimeMessage(session);

  System.out.println("Port: "+session.getProperty("mail.smtp.port"));

  // Create the email addresses involved
  try {
    InternetAddress from = new InternetAddress(username);
    message.setSubject("Yes we can");
    message.setFrom(from);
    message.addRecipients(Message.RecipientType.TO, InternetAddress.parse("ardilgulez@gmail.com"));

    // Create a multi-part to combine the parts
    Multipart multipart = new MimeMultipart("alternative");

    // Create your text message part
    BodyPart messageBodyPart = new MimeBodyPart();
    String htmlMessage = "Our html text";
    messageBodyPart.setContent(htmlMessage, "text/html");

    // Add html part to multi part
    multipart.addBodyPart(messageBodyPart);

    // Associate multi-part with message
    message.setContent(multipart);

    // Send message
    Transport transport = session.getTransport("smtp");
    transport.connect("smtp.gmail.com", username, password);
    System.out.println("Transport: "+transport.toString());
    transport.sendMessage(message, message.getAllRecipients());
  } catch (MessagingException e) {
    e.printStackTrace();
  }

}

邮件调试日志文件:

调试:JavaMail 版本 1.4.1 ..... 调试:!anyLoaded

调试:未加载资源:/META-INF/javamail.address.map

调试:未加载文件:C:\Java\JDK16~1.0_4\jre\lib\javamail.address.map

DEBUG: java.io.FileNotFoundException: C:\Java\JDK16~1.0_4\jre\lib\javamail.address.map (系统找不到指定的文件)

端口:587

调试:getProvider() 返回 javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]

调试 SMTP:useEhlo 为真,useAuth 为假

DEBUG SMTP:尝试连接到主机 "smtp.gmail.com",端口 587,isSSL false 220smtp.gmail.comESMTP t2sm2978726wme.0-gsmtp

调试 SMTP:连接到主机 "smtp.gmail.com",端口:587

EHLO FOO

250-smtp.gmail.com 为您服务,[212.156.0.126]

250-尺寸 35882577

250-8BITMIME

250-STARTTLS

250-增强状态代码

250-流水线

250-分块

250 SMTPUTF8

DEBUG SMTP:找到扩展名 "SIZE",arg“35882577”

DEBUG SMTP:找到扩展名“8BITMIME”,参数“”

DEBUG SMTP:找到扩展名 "STARTTLS",arg“”

DEBUG SMTP:找到扩展名 "ENHANCEDSTATUSCODES",arg“”

DEBUG SMTP:找到扩展名 "PIPELINING",arg“”

DEBUG SMTP:找到扩展名 "CHUNKING",arg“”

调试 SMTP:找到扩展名 "SMTPUTF8",arg“”

传输:smtp://foo@smtp.gmail.com

DEBUG SMTP: use8bit false

邮件发件人:

530 5.7.0 必须先发出 STARTTLS 命令。 t2sm2978726wme.0 - gsmtp

DEBUG SMTP:收到响应代码 530,响应:530 5.7.0 必须先发出 STARTTLS 命令。 t2sm2978726wme.0 - gsmtp

因为您使用的是 非常 旧版本的 JavaMail,您需要使用这个:

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

注意引号。

更好的是,upgrade to a current version

哦,没有 mail.smtp.password 属性,并且您不需要 mail.smtp.host 和 mail.smtp.user 属性,因为您将它们传递给连接显式方法。