JavaMail在Amazon EC2上不起作用 问题:

JavaMail在Amazon EC2上不起作用 问题:,java,amazon-ec2,tomcat7,jakarta-mail,ubuntu-12.04,Java,Amazon Ec2,Tomcat7,Jakarta Mail,Ubuntu 12.04,我试图使用JavaMail从EC2 Ubuntu 12.04服务器发送电子邮件,但它不起作用 背景: 我打算从Tomcat服务器向几个团队成员发送一封自动生成的邮件。我使用JavaMail 1.4.7完成这项任务,并在Tomcat的本地安装(在个人笔记本电脑上)上成功地尝试了它 下一步是,我将此模块放在EC2服务器上,但它开始失败,出现以下给定错误: 错误: 调试SMTP:身份验证登录失败 javax.mail.AuthenticationFailedException:535-5.7.1不

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


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

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


错误: 调试SMTP:身份验证登录失败 javax.mail.AuthenticationFailedException:535-5.7.1不接受用户名和密码。了解更多信息,请访问 535.7.1 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(新的com.sun.net.ssl.internal.ssl.Provider());
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);
put(“mail.smtp.socketFactory.class”、“javax.net.ssl.SSLSocketFactory”);
props.put(“mail.smtp.socketFactory.fallback”、“false”);
put(“mail.smtp.ssl.enable”,true);
Session Session=Session.getDefaultInstance(props);
setDebug(debug);
Message msg=新的mimessage(会话);
InternetAddress addressFrom=新的InternetAddress(“fromId@gmail.com");
msg.setFrom(addressFrom);
InternetAddress[]addressTo=新的InternetAddress[recipients.length];
for(int i=0;i

其他信息:
  • 我已经为EC2实例上的所有端口添加了权限。此外,我还为端口465(SMTPS)和25(SMTP)添加了显式权限
  • 我已经交叉检查了代码中提供的用户名和密码的正确性

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

    下面是一个描述一些历史的链接:

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

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

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

    是的,您可以配置弹性IP的反向DNS记录 地址(提交文件)。请注意,对应的前向DNS记录指向 弹性IP地址必须存在,才能创建反向地址 DNS记录

    以下是亚马逊在电子邮件配额用完时发送的电子邮件示例-再次说明DNS PTR配置的请求和批准:

  • 请严格遵循Gmail错误消息中包含的链接中的所有说明:。如果Gmail认为你的帐户是从你的IP地址发送的垃圾邮件,这将重置你的Gmail帐户状态

  • 或者,您可以通过亚马逊SES发送邮件,也需要请求、批准和亚马逊提供的适当配置。这允许通过
    com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient.sendmail
    发送邮件。如果使用此选项,请将代码的授权添加到sendmail:


  • 您是否尝试按照使用验证器,而不是将用户名/密码放在connect中?不确定这是否重要。我从那个例子开始,但它不起作用。它抛出了相同的异常。然后我继续在connect()方法中提供用户名/密码,但它仍然抛出相同的错误。使用验证器并不重要。错误来自Gmail,而不是JavaMail。你可能认为你使用的用户名和密码是正确的,但你不是。好吧,我想如果连接来自某个它不喜欢的地方,Gmail可能会拒绝你的用户名和密码,不管它是什么,但你需要向谷歌询问。嗨,比尔,正如我在问题背景中提到的,同一段代码在我的本地机器上运行良好。因此,我们可以排除用户名/密码中出现任何错误的可能性。
    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();