【问题标题】:JavaMail Not Working on Amazon EC2JavaMail 在 Amazon EC2 上不起作用
【发布时间】:2013-04-04 02:01:00
【问题描述】:

问题:

我正在尝试使用 JavaMail 从 EC2 Ubuntu 12.04 服务器发送电子邮件,但它不起作用。


背景:

我打算将自动生成的邮件从 Tomcat 服务器发送给几个团队成员。我使用 JavaMail 1.4.7 来完成这项任务,并且我已经成功在本地安装的 Tomcat 上(在个人笔记本电脑上)尝试了它。

下一步是我将此模块放在 EC2 服务器上,但它开始失败并出现以下错误:


错误:

调试 SMTP:身份验证登录失败 javax.mail.AuthenticationFailedException:535-5.7.1 用户名和密码不被接受。了解更多信息 535 5.7.1http://support.google.com/mail/bin/answer.py?answer=14257j13sm1603739pat.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. 我已经交叉检查了代码中提供的用户名和密码的正确性。

【问题讨论】:

  • 您是否尝试过按照mkyong.com/java/… 使用身份验证器,而不仅仅是将用户名/密码放入连接中?不确定这是否重要。
  • 我从那个例子开始,但它不起作用。它抛出了同样的异常。然后我继续在 connect() 方法中提供用户名/密码,但仍然抛出相同的错误。
  • 使用身份验证器无关紧要。错误来自 Gmail,而不是来自 JavaMail。您可能认为您使用了正确的用户名和密码,但事实并非如此。
  • 好吧,我想如果连接来自某个它不喜欢的地方,Gmail 可能会拒绝您的用户名和密码,但您需要询问 Google .
  • 嗨,比尔,正如我在问题背景中提到的,同一段代码在我的本地机器上运行良好。因此,我们可以排除用户名/密码有任何错误的可能性。

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


【解决方案1】:

过去,从 EC2 内的服务器发送的垃圾邮件一直是亚马逊和邮件服务提供商面临的主要问题。最初,亚马逊故意没有足够的 DNS 信息来通过常见电子邮件服务的反垃圾邮件检查(缺少 DNS 反向查找 PTR 记录),然后亚马逊引入了低邮件配额,遵循批准流程以完全访问 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 信息常见问题:

    问:我可以为我的弹性 IP 地址配置反向 DNS 记录吗?

    是的,您可以配置弹性 IP 的反向 DNS 记录 地址(提交Request to Remove Email Sending Limitations Form)。请注意,相应的转发 DNS 记录指向 弹性 IP 地址必须存在,然后我们才能创建反向 DNS 记录。

    以下是电子邮件配额用尽时亚马逊发送的电子邮件示例 - 再次说明 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

【讨论】:

    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 2018-02-21
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 2016-05-14
    相关资源
    最近更新 更多