如何使用 play framework 1.x 和 Amazon SES 发送电子邮件?

Posted

技术标签:

【中文标题】如何使用 play framework 1.x 和 Amazon SES 发送电子邮件?【英文标题】:How to send email with play framework 1.x and Amazon SES? 【发布时间】:2014-03-21 23:47:48 【问题描述】:

我正在尝试使用Amazon SES 在我的play! framework 1.2.5 应用程序中发送电子邮件。当我搜索时,我无法在 application.conf 中定义亚马逊 SES 邮件的配置。我创建了一个在java中设置配置的工作。但是我收到以下异常。一整天,我都在尝试让我的应用程序发送电子邮件。但任何尝试都失败了。我想你可以帮助我。 我很感激。

@OnApplicationStart
public class Bootstrap extends Job
    @Override
    public void doJob() throws Exception 
    Properties props = play.libs.Mail.getSession().getProperties();
        props.setProperty("mail.transport.protocol","aws");
        props.setProperty("mail.smtp.host","email-smtp.eu-west-1.amazonaws.com");
        props.setProperty("mail.smtp.port","25");
        props.setProperty("mail.aws.user", "...");
        props.setProperty("mail.aws.password", "...");
        System.out.println("AMAZON SES-MAIL PROPERTIES SET SUCCESSFULY");
    

错误

play.exceptions.MailException: Error while sending email
at play.libs.Mail$2.call(Mail.java:186)
at play.libs.Mail$2.call(Mail.java:178)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.apache.commons.mail.EmailException: Sending the email to the following server failed : email-smtp.eu-west-1.amazonaws.com:25
at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1242)
at org.apache.commons.mail.Email.send(Email.java:1267)
at play.libs.Mail$2.call(Mail.java:183)
    ... 6 more
Caused by: com.sun.mail.smtp.SMTPSendFailedException: 530 Authentication required

at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1829)
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1368)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:886)
at javax.mail.Transport.send0(Transport.java:191)
at javax.mail.Transport.send(Transport.java:120)
at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1232)
    ... 8 more

【问题讨论】:

【参考方案1】:

我的问题没有得到回答。我发现我的问题是什么。我解释它,以便其他有此类问题的人可以从中受益。 从一开始,我认为我的问题不是为安全组中的传出 SMTP 调用定义特定端口。 This 是一篇可以阅读的好文章。此外,无需在任何引导类中配置 AWS SES。我刚刚在 application.conf 中定义了它,如下所示。

mail.transport.protocol=aws
mail.smtp.host=<your aws smpt server name>
mail.smtp.port=587
mail.smtp.user=<your username>
mail.smtp.pass=<your password>
mail.smtp.channel=ssl

但是邮件进入垃圾邮件文件夹,我找不到它为什么会这样。如果有人对此有任何想法,请在此处发表评论,我将不胜感激:)

【讨论】:

【参考方案2】:

您正在尝试连接端口 25 - 此端口用于未加密的电子邮件,但 Google 要求客户端连接必须加密。您应该改用端口 587。

仅供参考,另一种方法是让 sendmail 完成繁重的工作。在您的 AWS 实例上关注 these instructions to configure sendmail。

编辑您的 Play! application.conf 并设置:

mail.smtp.host=127.0.0.1

最后,have a read of the Play! docs 看看如何从您的应用程序发送邮件。

【讨论】:

感谢您的回答。我照你说的做了。但我又遇到了同样的例外。我已经设法在我的本地主机中通过 gmail smtp 发送电子邮件。我想我在亚马逊 SES 配置上做错了。我还可以通过经过验证的电子邮件地址通过亚马逊 SES 界面发送电子邮件。我怀疑我可能对 SES 和我的 EC2 实例有误。因为我没有做任何让他们认出eashother的事情。我不知道我应该告诉你什么,以便你能提供帮助 我刚刚看到了。为什么即使我将 smtp 端口设置为 587,它仍然会转到端口 25?将电子邮件发送到以下服务器失败:email-smtp.eu-west-1.amazonaws.com:25

以上是关于如何使用 play framework 1.x 和 Amazon SES 发送电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio Code + java 上调试 Play Framework 1.x 应用程序

将 Java 类导入 Groovy 模板(Play framework 1.x)

Play framework 1.x 重定向删除动作

使用“in”在 Play Framework 1.x / JPA 中构建查询的更简单方法?

将 MySQL 连接器 Jar 链接到我的依赖项 Java Play Framework 1.x

Play Framework:如何不查看文件夹以了解 Play Framework 中的更改