java gmail 在windows环境下可以正常发邮件在liunx下报错534 基本上试遍了各种方案都没用,开启IMPA,https://myaccount.google.com/lesssecureapps安全性低,被阻止等等都没有问题。
主要代码如下:
Properties prop = new Properties();
//协议
prop.setProperty("mail.transport.protocol", protocol);
//服务器
prop.setProperty("mail.smtp.host", host);
//端口
prop.setProperty("mail.smtp.port", port);
//使用smtp身份验证
prop.setProperty("mail.smtp.auth", "true");
//使用SSL,企业邮箱必需!
//开启安全协议
/* MailSSLSocketFactory sf = null;
try {
sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
} catch (GeneralSecurityException e1) {
e1.printStackTrace();
}*/
//ssl对应465端口
// prop.put("mail.smtp.ssl.enable", "true");
// prop.put("mail.smtp.ssl.socketFactory", sf);
//tsl对应587端口
prop.put("mail.smtp.starttls.enable", "true");
Session session = Session.getDefaultInstance(prop, new MyAuthenricator(account, pass));
session.setDebug(true);
MimeMessage mimeMessage = new MimeMessage(session);
//发件人
//mimeMessage.setFrom(new InternetAddress(account,"contacthutv")); //可以设置发件人的别名
mimeMessage.setFrom(new InternetAddress(account)); //如果不需要就省略
//收件人
mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
//主题
mimeMessage.setSubject(subject);
//时间
mimeMessage.setSentDate(new Date());
//容器类,可以包含多个MimeBodyPart对象
Multipart mp = new MimeMultipart();
我用的是587端口,因为465端口在liunx上 telnet smtp.gmail.com 465 不同,具体原因没查因为没太大关系。
报错内容如下:
DEBUG: setDebug: Jakarta Mail version 1.6.5
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: need username and password for authentication
DEBUG SMTP: protocolConnect returning false, host=smtp.gmail.com, user=root, password=<null>
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
220 smtp.gmail.com ESMTP 28sm7815703qkr.96 - gsmtp
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587
EHLO ns541077.ip-xxx.net
250-smtp.gmail.com at your service, [xxx]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
EHLO ns541077.ip-xxx.net
250-smtp.gmail.com at your service, [xxx]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
DEBUG SMTP: protocolConnect login, host=smtp.gmail.com, user=xxx@gmail.com, password=<non-null>
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2
DEBUG SMTP: Using mechanism LOGIN
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN failed
javax.mail.AuthenticationFailedException: 534-5.7.14 <https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbv
534-5.7.14 IJzdEuiobyncGRnANmxfyP-urV98ruNP9NLb2wjuOWOYSdTVzZr2py8AUoH7d8t8NORSI
534-5.7.14 KdLh31dy7cS6k0c7AWkB592T4YSJhd-SMoQCW9lSKZMKX1cr7W0DcRmrwjCoJxjR>
534-5.7.14 Please log in via your web browser and then try again.
534-5.7.14 Learn more at
534 5.7.14 https://support.google.com/mail/answer/78754 28sm7815703qkr.96 - gsmtp
根据报错内容找到的答案基本都是说没开IMAP啊,安全性低,被阻止等等。都没能解决。
最后根据最主要的报错信息DEBUG SMTP: AUTH LOGIN failed 找到了答案。登录失败。那就是密码问题咯?
很多人说是要用授权码而不是登录密码。这些人应该是没有用过gmail发邮件的。用了你就知道gmail跟163和qq不一样的。
最终的解决方案是google账号有一个功能叫做“两步验证”https://myaccount.google.com/lesssecureapps这个链接告诉你这么开启,不完全一样但基本差不多,开启两步验证之后最后一步就是设置设置“应用专用密码”设置完复制密码,到代码里面替替换掉gmail的登录密码就好了。
令我百思不得其解的“为什么windows上可以发出去,为什么liunx登录失败?如果密码问题那windows应该也是登录失败的啊”。