JavaMail在Amazon EC2上不起作用 问题:
我试图使用JavaMail从EC2 Ubuntu 12.04服务器发送电子邮件,但它不起作用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不
背景: 我打算从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内的服务器发送的垃圾邮件一直是亚马逊和邮件服务提供商的主要问题。最初,亚马逊故意没有足够的DNS信息来通过对常见电子邮件服务的反垃圾邮件检查(缺少DNS反向查找PTR记录),然后亚马逊引入了低邮件配额,遵循批准流程以允许完全访问EC2或SES邮件(提供特定的技术设置以完全启用传出电子邮件) 下面是一个描述一些历史的链接: 虽然您收到的错误是Gmail服务器的身份验证失败,但这可能是(可能是)因为Gmail将您的发件人IP地址标识为潜在的垃圾邮件发送者,因为您没有正确设置Amazon反向DNS查找属性
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();