9

問題:

JavaMail を使用して EC2 Ubuntu 12.04 サーバーから電子メールを送信しようとしていますが、機能していません。


バックグラウンド:

Tomcat サーバーから自動生成されたメールを少数のチーム メンバーに送信するつもりです。私はこのタスクに JavaMail 1.4.7 を使用しましたが、Tomcat のローカル インストール (個人のラップトップ) で試してみることに成功しました。

次のステップでは、このモジュールを EC2 サーバーに配置しましたが、以下のエラーで失敗し始めました。


エラー:

DEBUG SMTP: AUTH LOGIN に失敗しました javax.mail.AuthenticationFailedException: 535-5.7.1 ユーザー名とパスワードが受け入れられません。詳細については、535 5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 j13sm1603739pat.17 - gsmtpをご覧ください。

at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:826)
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:761)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:685)
at javax.mail.Service.connect(Service.java:295)
at javax.mail.Service.connect(Service.java:176)

コードスニペット:

Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
Properties props = new Properties();
props.put("mail.smtps.host","smtp.gmail.com");
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtps.auth", "true");
props.put("mail.smtp.debug", "true");
props.put("mail.smtp.port", 465);
props.put("mail.smtp.socketFactory.port", 465);
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.put("mail.smtp.ssl.enable", true);

Session session = Session.getDefaultInstance(props);
session.setDebug(debug);

Message msg = new MimeMessage(session);
InternetAddress addressFrom = new InternetAddress("fromId@gmail.com");
msg.setFrom(addressFrom);

InternetAddress[] addressTo = new InternetAddress[recipients.length];
for (int i = 0; i < recipients.length; i++) {
addressTo[i] = new InternetAddress(recipients[i]);
}
msg.setRecipients(Message.RecipientType.TO, addressTo);
msg.setSubject("test subject");
msg.setContent("test message", "text/plain");
Transport tp = session.getTransport("smtp");
tp.connect(SMTP_HOST_NAME, "dummyId@gmail.com", "dummypassword");
tp.sendMessage(msg, addressTo);
tp.close();

追加情報:

  1. EC2 インスタンスのすべてのポートにアクセス許可を追加しました。また、ポート 465 (SMTPS) と 25 (SMTP) の明示的なアクセス許可を追加しました。
  2. コードで提供されているユーザー名とパスワードの正確性をクロスチェックしました。
4

1 に答える 1

7

これまで、EC2 内のサーバーから送信されたスパムは、Amazon とメール サービス プロバイダーの両方にとって大きな問題でした。当初、Amazon は、一般的な電子メール サービスのスパム対策チェックに合格するための不十分な DNS 情報を故意に持っていました (DNS リバース ルックアップ PTR レコードの欠如)。その後、Amazon は低いメール クォータを導入し、承認プロセスに従って EC2 または SES メールへのフル アクセスを許可しました (特定の送信メールを完全に有効にするための技術的なセットアップ)。

歴史の一部を説明するリンクは次のとおりです。 http://shlomoswidler.com/2009/07/sending-email-from-ec2.html

表示されているエラーは Gmail サーバーでの認証の失敗ですが、Amazonリバース DNS ルックアップ プロパティを正しく設定していないために、Gmail が送信者の IP アドレスを潜在的なスパマーとして識別したためである可能性があります。

  1. メールが Gmail によってスパムとして検出されないように、Amazon リバース DNS ルックアップの詳細を設定します。これは、メール送信クォータを解除するためのリクエスト フォームを送信することによってのみ実行できるようです。Amazon EC2 IP 情報の FAQ から:

    Q: Elastic IP アドレスの逆引き DNS レコードを設定できますか?

    はい、Elastic IP アドレスのリバース DNS レコードを設定できます (メール送信制限の削除リクエストフォームを送信してください)。リバース DNS レコードを作成する前に、その Elastic IP アドレスを指す対応するフォワード DNS レコードが存在する必要があることに注意してください。

    以下は、メール クォータが使い果たされたときに Amazon から送信されるメールの例です。ここでも、DNS PTR 構成の要求と承認を詳しく説明しています: http://www.practicalclouds.com/content/guide/sending-email-ec2-instances

  2. Gmail のエラー メッセージ ( http://support.google.com/mail/bin/answer.py?answer=14257 ) に含まれているリンクのすべての指示に正確に従ってください。これにより、Gmail があなたのアカウントがあなたの IP アドレスからスパム行為を行っていると判断した場合、Gmail アカウントのステータスがリセットされます。

  3. または、Amazon SES 経由でメールを送信することもできます。この場合も、リクエスト、承認、および Amazon が提供する適切な設定が必要です。これにより、 経由でメールを送信できます com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient.sendEmail。これを使用する場合は、コードの承認を sendmail: Unable to send email from Amazon EC2 Server in Javaに追加します。

于 2013-04-19T03:31:41.623 に答える