私は、Javaでメールを送信するためのこの機能に慣れていません。パスワードをリセットするためのメールの送信中にエラーが発生します。あなたが私に解決策を与えることができることを願っています。
以下は私のコードです:
public synchronized static boolean sendMailAdvance(String emailTo, String subject, String body)
{
String Host = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-ADDRESS");
String userName = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-USERNAME");
String password = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-PASSWORD");
String port = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-PORT");
String starttls = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-STARTTLS");
String socketFactoryClass = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-SOCKET-CLASS");
String fallback = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-ALLOW-FALLBACK");
try
{
Java.util.Properties props = null;
props = System.getProperties();
props.put("mail.smtp.user", userName);
props.put("mail.smtp.Host", Host);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.debug", "true");
if(!"".equals(port))
{
props.put("mail.smtp.port", port);
props.put("mail.smtp.socketFactory.port", port);
}
if(!"".equals(starttls))
props.put("mail.smtp.starttls.enable",starttls);
if(!"".equals(socketFactoryClass))
props.put("mail.smtp.socketFactory.class",socketFactoryClass);
if(!"".equals(fallback))
props.put("mail.smtp.socketFactory.fallback", fallback);
Session session = Session.getDefaultInstance(props, null);
session.setDebug(true);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(userName));
msg.setSubject(subject);
msg.setText(body, "ISO-8859-1");
msg.setSentDate(new Date());
msg.setHeader("content-Type", "text/html;charset=\"ISO-8859-1\"");
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo));
msg.saveChanges();
Transport transport = session.getTransport("smtp");
transport.connect(Host, userName, password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
return true;
}
catch (Exception mex)
{
mex.printStackTrace();
return false;
}
}
次のエラーをスローします。
デバッグ:setDebug:JavaMailバージョン1.4.1ea-SNAPSHOT
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.Sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
SMTPのデバッグ:useEhlo true、useAuth true
デバッグSMTP:ホスト「smtp.gmail.com」、ポート465、isSSL false 220 mx.google.com ESMTP m4sm5929870pbg.38-gsmtpに接続しようとしています
デバッグSMTP:ホスト "smtp.gmail.com"に接続、ポート:465
EHLOファチン
サービスの250-mx.google.com、[175.139.198.14]
250-サイズ35882577
250-8BITMIME
250-AUTHログインPLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN
250の強化されたステータスコード
250チャンキング
デバッグSMTP:拡張機能「SIZE」、引数「35882577」が見つかりました
デバッグSMTP:拡張機能「8BITMIME」、引数「」が見つかりました
デバッグSMTP:拡張機能「AUTH」、引数「LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN」が見つかりました
デバッグSMTP:拡張機能「ENHANCEDSTATUSCODES」、引数「」が見つかりました
デバッグSMTP:拡張機能「CHUNKING」、引数「」が見つかりました
SMTPのデバッグ:認証の試行
AUTHログイン
334 VXNlcm5hbWU6
YWNjb3VudEBibG9vbWluZy5jb20ubXk =
334 UGFzc3dvcmQ6
Ymxvb21pbmc = 535-5.7.8ユーザー名とパスワードは受け入れられません。 535 5.7.8で詳細をご覧ください http://support.google.com/mail/bin/answer.py?answer=14257
m4sm5929870pbg.38-gsmtp
[STDOUT] javax.mail.AuthenticationFailedException
[STDOUT] at javax.mail.Service.connect(Service.Java:319)
[STDOUT] at javax.mail.Service.connect(Service.Java:169)
[STDOUT] at com.vlee.util.mail.SendMail.sendMailAdvance(SendMail.Java:283)
[STDOUT] at com.vlee.servlet.ecommerce.DoMemberLogin.fnSendPwd(DoMemberLogin.Java:251)
[STDOUT] at com.vlee.servlet.ecommerce.DoMemberLogin.doPost(DoMemberLogin.Java:72)
ポートを587
に変更する必要があります。コードをテストしましたが、正常に動作しています
それでもエラーが発生する場合は、セッション変数を次のコードに変更してください。
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
この問題は、Gmailアカウントの保護が原因である可能性があります。下のリンクをクリックして、セキュリティ設定を無効にしてください。動作します。 https://www.google.com/settings/security/lesssecureapps
デフォルトでは、Gmailアカウントは高度に保護されています。 Gmail以外のツールからGmail SMTPを使用すると、メールがブロックされます。ローカル環境でテストするには、Gmailアカウントの安全性を低くします
ほとんどのAuthenticationFieldExceptionエラーは、サインインが妨げられたときに発生します。最初にGmailにログインし、 https://www.google.com/settings/security/lesssecureapps にアクセスして、オンにします。このようにしてこの種の問題を解決しました。
これを変更します(安全性の低いアプリを設定します): https://www.google.com/settings/security/lesssecureapps
新しいアプリケーションまたはデバイスからGmailアカウントにログインしている場合、Googleはそのデバイスをブロックしている可能性があります。次の手順に従ってください:
アカウントを保護するために、Googleがあなたでないと疑われる場合、アカウントへのログインが困難になる場合があります。たとえば、旅行中または新しいデバイスからアカウントにサインインしようとすると、Googleはユーザー名とパスワード以外の追加情報を要求する場合があります。
以前にGoogleアカウントへのアクセスに使用した別のデバイスから https://g.co/allowaccess に移動し、指示に従います。ブロックされたアプリからもう一度サインインしてみてください。
私は長い間同じエラーを受け取っています。
セッションデバッグをtrueに変更したとき
Session session = Session.getDefaultInstance(props, new GMailAuthenticator("[email protected]", "xxxxx"));
session.setDebug(true);
ヘルプURL https://support.google.com/mail/answer/78754 をコンソールからjavax.mail.AuthenticationFailedExceptionとともに取得しました。
リンクの手順から、各手順を実行しました。驚いたことに、文字、数字、記号を組み合わせてパスワードを変更したとき、メールは認証例外なしで生成されました。
注:私の古いパスワードはより安全性が低かった。
2つの考えられる理由:
私のために働く解決策には2つのステップがあります。
最初の一歩
package com.student.mail;
import Java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
*
* @author jorge santos
*/
public class GoogleMail {
public static void main(String[] args) {
Properties props = new Properties();
props.put("mail.smtp.Host", "smtp.gmail.com");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("[email protected]","Silueta95#");
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("[email protected]"));
message.setSubject("Testing Subject");
message.setText("Test Mail");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}
Gmailセキュリティを有効にする
https://myaccount.google.com/u/2/lesssecureapps?pli=1&pageId=none
誰かがこの問題の解決策を探している場合に備えて。
認証の問題は、使用中のアカウントに対してGoogleの2段階認証を有効にし、アプリ固有のパスワードを作成することで軽減できます。 OPと同じ問題がありました。 2ステップの有効化が機能しました。
私もこの問題を抱えていましたが、ソリューションはコーディングとは何の関係もありませんでした。 Gmailに接続できることを確認してください。 smtp.gmail.comにPingします。返信がない場合は、ファイアウォールの設定を確認してください。また、プロキシ設定の問題である可能性があります。
trying to connect to Host "smtp.gmail.com", port 465, isSSL false
GmailのSMTP設定が間違っています。 GmailにはSSLが必要です。 Gmail SMTP経由でJava経由でメールを送信する方法に関するチュートリアルを参照してください。例: http://www.mkyong.com/Java/javamail-api-sending-email-via-gmail- smtp-example /