JavaMail 无法在 Amazon EC2 上运行

标签 java amazon-ec2 tomcat7 jakarta-mail ubuntu-12.04


问题:

我正在尝试使用 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. 我已经交叉检查了代码中提供的用户名和密码的正确性。

最佳答案

过去,从 EC2 内的服务器发送的垃圾邮件一直是亚马逊和邮件服务提供商面临的主要问题。最初,Amazon 故意让 DNS 信息不足以通过常见电子邮件服务的反垃圾邮件检查(缺少 DNS 反向查找 PTR 记录),然后 Amazon 引入了低邮件配额,遵循批准流程以完全访问 EC2 或 SES 邮件(提供特定的完全启用外发电子邮件的技术设置)。

这是一个描述部分历史的链接:http://shlomoswidler.com/2009/07/sending-email-from-ec2.html

虽然您收到的错误是 Gmail 服务器的身份验证失败,但它可能(可能是)是因为 Gmail 将您的发件人 IP 地址识别为潜在的垃圾邮件发送者,因为您没有设置Amazon 正确反向 DNS 查找属性。

  1. 设置 Amazon Reverse DNS 查找详细信息,以便 Gmail 不会将您的邮件检测为垃圾邮件。这似乎只能通过提交申请表来取消电子邮件发送配额来完成。来自 Amazon EC2 IP 信息常见问题:

    Q: Can I configure the reverse DNS record for my Elastic IP address?

    Yes, you can configure the reverse DNS record of your Elastic IP address (submit the Request to Remove Email Sending Limitations Form). Note that a corresponding forward DNS record pointing to that Elastic IP address must exist before we can create the reverse DNS record.

    这是当电子邮件配额用尽时亚马逊发送的电子邮件示例 - 再次拼写请求和批准 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 发送邮件。如果您使用它,请为您的代码添加授权以发送邮件:Unable to send email from Amazon EC2 Server in Java .

关于JavaMail 无法在 Amazon EC2 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15956167/

相关文章:

amazon-ec2 - 在 EC2 上使用 vagrant

java - 在 Java 11 上安装 tomcat 7 作为服务 :NB: JAVA_HOME should point to a JDK not a JRE

java - 使用tomcat7部署并自动编译servlet

intellij-idea - 如何在Idea中的tomcat运行配置中设置context.xml

java - 我可以使用 BIRT 报告设计器中使用信任库和 keystore 的 SSL 证书连接到数据库吗?

java - Camel exec 从 shell 脚本返回总是 null 字符串

java - 从不包括非拉丁字符的字符串中删除所有特殊字符

networking - 亚马逊AWS VPC 场景2 : Specify the public IP address range of your network?

mysql - 我们可以将 SQL 从 S3 存储桶导入到 AWS ec2(实例)吗?

java - db4o 类模型 transient 场