将 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)
我在网上阅读了很多资料和发帖前建议的问题,但找不到适合我的东西。
- 关于使用 gmail 的 JavaMail 常见问题解答
- Whosebug 问题
- JavaMail 教程
- google 搜索的任何其他结果
在过去的 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 属性,因为您将它们传递给连接显式方法。
我在网上阅读了很多资料和发帖前建议的问题,但找不到适合我的东西。
- 关于使用 gmail 的 JavaMail 常见问题解答
- Whosebug 问题
- JavaMail 教程
- google 搜索的任何其他结果
在过去的 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 属性,因为您将它们传递给连接显式方法。