1

在发布之前,我在互联网上阅读了很多东西和建议的问题,但找不到任何适合我的东西。

  • 关于使用 gmail 的 JavaMail 常见问题解答
  • 堆栈溢出问题
  • JavaMail 教程
  • 谷歌搜索的任何其他结果

在过去的 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 true,useAuth false

调试 SMTP:尝试连接到主机“smtp.gmail.com”,端口 587,isSSL false 220 smtp.gmail.com ESMTP t2sm2978726wme.0 - gsmtp

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

埃洛福

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

250 尺寸 35882577

250-8BITMIME

250-STARTTLS

250 增强状态代码

250-流水线

250 分块

250 SMTPUTF8

调试 SMTP:找到扩展名“SIZE”,arg“35882577”

调试 SMTP:找到扩展名“8BITMIME”,arg“”

调试 SMTP:找到扩展“STARTTLS”,arg“”

调试 SMTP:找到扩展“ENHANCEDSTATUSCODES”,arg“”

调试 SMTP:找到扩展“管道”,arg“”

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

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

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

调试 SMTP:use8bit false

发件人:< foo >

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

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

4

1 回答 1

3

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

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

注意引号。

更好的是,升级到当前版本

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

于 2015-11-05T07:07:42.817 回答