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, [email protected], 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應該也是登錄失敗的啊”。