即使经过验证,AWS SES 电子邮件也总是会进入垃圾邮件

Posted

技术标签:

【中文标题】即使经过验证,AWS SES 电子邮件也总是会进入垃圾邮件【英文标题】:AWS SES emails always go to Spam even after verification 【发布时间】:2018-01-25 20:25:24 【问题描述】:

我相信很多人都问过同样的问题,但我找不到一个全面的答案。 我们正在悉尼地区部署的 EC2 实例上运行 Web 应用程序 (myapp.com)。该应用程序通过 AWS SES 发送电子邮件。因为 SES 在悉尼不可用,所以我们在俄勒冈州配置了 SES。我们生成了 SMTP 凭证并配置了我们的 Springboot 应用程序以使用这些凭证发送电子邮件。我们能够发送电子邮件并且电子邮件已成功发送,但它会进入垃圾邮件文件夹。 来自地址的电子邮件是:noreply@myapp.com 我们已经在 SES 控制台中验证了域名 我们已在 SES 控制台中验证 noreply@myapp.com 电子邮件地址 DKIM 也已开启并经过验证

然而, 我们不确定为什么电子邮件会一直发送到垃圾邮件文件夹。 当我查看 RAW 电子邮件时,我可以看到 SPF 标头: SPF:中性,IP xx.xx.xx.xxx 我没有在我的 DNS 名称中配置任何 SPF 记录,但据我了解,我不需要,因为我使用的是 SES SMTP 服务器而不是自定义 MAIL FROM。

我不知道为什么电子邮件会被发送到垃圾邮件。 有人可以帮忙吗?

【问题讨论】:

试试一些在线垃圾邮件测试器,例如isnotspam.com。 【参考方案1】:

解决了这个问题。 我不确定到底发生了什么,但是当使用 SpringBoot JavaMailSenderImpl 使用 AWS SES 发送电子邮件时,所有电子邮件都没有使用 DKIM 签名(传出电子邮件消息上没有 DKIM 标头)。这导致一些 SMTP 服务器将我们的电子邮件视为垃圾邮件。

我已经通过使用 Java Mail API (javax.mail) 发送电子邮件解决了这个问题,一旦我这样做了,那么所有电子邮件都使用 DKIM 标头传递,并且没有一个进入垃圾邮件文件夹(针对 Gmail 进行了测试和展望)。

再次,我不确定为什么使用 SpringBoot JavaMailSenderImpl 会导致问题。我的理解是 JavaMailSenderImpl 在后台使用 Java Mail,但由于某种原因,没有一封电子邮件包含 DKIM 标头。

下面是我使用 Java Mail 的电子邮件发件人,如果它可以帮助任何人的话。

            try 
            Properties properties = new Properties();

            // get property to indicate if SMTP server needs authentication
            boolean authRequired = true;

            properties.put("mail.smtp.auth", authRequired);
            properties.put("mail.smtp.host", "ses smtp hostname");
            properties.put("mail.smtp.port", 25);
            properties.put("mail.smtp.connectiontimeout", 10000);
            properties.put("mail.smtp.timeout", 10000);
            properties.put("mail.smtp.starttls.enable", false);
            properties.put("mail.smtp.starttls.required", false);



            Session session;
            if (authRequired) 
                session = Session.getInstance(properties, new javax.mail.Authenticator() 
                    protected PasswordAuthentication getPasswordAuthentication() 
                        return new PasswordAuthentication("ses_username","ses_password");
                    
                );
             else 
                session = Session.getDefaultInstance(properties);
            

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("from@example.com"));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("to@example.com"));

            message.setSubject("This is a test subject");
            Multipart multipart = new MimeMultipart();
            BodyPart htmlPart = new MimeBodyPart();
            htmlPart.setContent("This is test content", "text/html");
            htmlPart.setDisposition(BodyPart.INLINE);
            multipart.addBodyPart(htmlPart);
            message.setContent(multipart);
            Transport.send(message);

         catch (Exception e) 
            //deal with errors

        

【讨论】:

多部分的东西帮助我摆脱了垃圾邮件问题

以上是关于即使经过验证,AWS SES 电子邮件也总是会进入垃圾邮件的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 python SDK 在 ECS fargate 作业上发送邮件,并在另一个 aws 帐户中使用经过验证的 SES 的凭据

Laravel 5.7:通过 AWS SES 的按需电子邮件通知将我的收件人电子邮件视为发件人电子邮件,并希望它是经过验证的地址

AWS-SES 电子邮件地址未经验证。邮箱帐户

节点 AWS-SDK SES 电子邮件发送验证失败

电子邮件地址未验证 (AWS SES)

如何在 AWS SES 中验证电子邮件地址