Spring Boot应用程序通过AWS SES发送简单电子邮件所需的配置步骤是什么?

时间:2017-09-15 18:29:42

标签: spring-boot amazon-ses aws-java-sdk spring-cloud-aws

今天我一直在和它斗争几个小时。我从http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_sending_mails处的文档开始,这些文档并没有真正说明具体步骤。它只是说开发人员可以包含Bean XML,然后自动装配MailSender。我已尝试过以及许多变种,并且无法使用spring-cloud-aws使其工作。我最终直接使用aws-java-sdk-ses并手动配置类。

这是一个简单的项目,展示了我的尝试: https://github.com/deinspanjer/aws-ses-test

这个项目编译,但当我运行它时,我得到:

Parameter 0 of constructor in com.example.awssestest.AwsSesTestApplication required a bean of type 'org.springframework.mail.MailSender' that could not be found.
- Bean method 'mailSender' not loaded because @ConditionalOnClass did not find required class 'javax.mail.internet.MimeMessage'
- Bean method 'simpleMailSender' not loaded because @ConditionalOnClass did not find required class 'com.amazonaws.services.simpleemail.AmazonSimpleEmailService'
- Bean method 'javaMailSender' not loaded because @ConditionalOnClass did not find required class 'com.amazonaws.services.simpleemail.AmazonSimpleEmailService'

如果我尝试添加javax-mail(https://github.com/deinspanjer/aws-ses-test/tree/try-with-javax-mail-api),则错误更改为:

Parameter 0 of constructor in com.example.awssestest.AwsSesTestApplication required a bean of type 'org.springframework.mail.MailSender' that could not be found.
- Bean method 'mailSender' not loaded because AnyNestedCondition 0 matched 2 did not; NestedCondition on MailSenderAutoConfiguration.MailSenderCondition.JndiNameProperty @ConditionalOnProperty (spring.mail.jndi-name) did not find property 'jndi-name'; NestedCondition on MailSenderAutoConfiguration.MailSenderCondition.HostProperty @ConditionalOnProperty (spring.mail.host) did not find property 'host'
- Bean method 'simpleMailSender' not loaded because @ConditionalOnClass did not find required class 'com.amazonaws.services.simpleemail.AmazonSimpleEmailService'
- Bean method 'javaMailSender' not loaded because @ConditionalOnClass did not find required class 'com.amazonaws.services.simpleemail.AmazonSimpleEmailService'

如果相反,我尝试显式添加对aws-java-sdk-ses(https://github.com/deinspanjer/aws-ses-test/tree/try-with-aws-java-sdk-ses)的依赖,我得到了这个错误:

Parameter 0 of constructor in com.example.awssestest.AwsSesTestApplication required a bean of type 'org.springframework.mail.MailSender' that could not be found.
- Bean method 'mailSender' not loaded because @ConditionalOnClass did not find required class 'javax.mail.internet.MimeMessage'
- Bean method 'javaMailSender' in 'MailSenderAutoConfiguration' not loaded because @ConditionalOnClass did not find required class 'javax.mail.Session'
- Bean method 'simpleMailSender' in 'MailSenderAutoConfiguration' not loaded because @ConditionalOnMissingClass found unwanted class 'org.springframework.cloud.aws.mail.simplemail.SimpleEmailServiceJavaMailSender'

对于此错误,我尝试向@Qualifier("simpleMailSender")添加@Autowired注释,但它没有帮助。

我希望有人能够引导我朝着正确的方向前进。

5 个答案:

答案 0 :(得分:5)

您可以尝试以下步骤来解决问题。我在forked repo中尝试了这些更改,这对我有用。

  1. 添加依赖" com.amazonaws:aws-java-sdk-ses"在pom.xml档案中。
  2. 创建自动配置类以配置邮件发件人bean。以下是示例。 AWSCredentialsProviderspring-cloud-starter-aws开箱即用配置并提供。
  3. @Configuration
    public class SimpleMailAutoConfig {
    
        @Bean
        public AmazonSimpleEmailService amazonSimpleEmailService(AWSCredentialsProvider credentialsProvider) {
            return AmazonSimpleEmailServiceClientBuilder.standard()
                    .withCredentials(credentialsProvider)
                    // Replace US_WEST_2 with the AWS Region you're using for
                    // Amazon SES.
                    .withRegion(Regions.US_WEST_2).build();
        }
    
        @Bean
        public MailSender mailSender(AmazonSimpleEmailService ses) {
            return new SimpleEmailServiceMailSender(ses);
        }
    }
    

    3。使用spring API使用配置的邮件发件人发送邮件。

    希望它有所帮助。

    修改

    如果您需要使用JavaMailSender而不是MailSender(例如,当您要发送附件时),只需配置SimpleEmailServiceJavaMailSender而不是SimpleEmailServiceMailSender

    像这样:

        @Bean
        public JavaMailSender mailSender(AmazonSimpleEmailService ses) {
            return new SimpleEmailServiceJavaMailSender(ses);
        }
    

答案 1 :(得分:2)

我前段时间在Spring Boot网络项目中使用过AWS SES,但我没有使用Spring Cloud AWS将我的应用程序与邮件服务集成。

相反,我只是在项目依赖项(pom.xml)中包含spring-boot-starter-mail

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

然后我在application.properties中设置SMTP服务器参数。就我而言,我使用了这些属性:

spring.mail.host=email-smtp.eu-west-1.amazonaws.com
spring.mail.port=465
spring.mail.protocol=smtps
spring.mail.smtps.auth=true
spring.mail.smtp.ssl.enable=true
spring.mail.username=<my-user>
spring.mail.password=<my-password>

注意:服务器主机和端口可能会有所不同。

Spring Boot将创建一个默认的JavaMailSender实例,并使用previos参数进行配置。您可以使用此对象发送电子邮件...

可能这不是AWS SES与Spring Boot应用程序集成的最佳方法,但它对我来说很好。

答案 2 :(得分:0)

  1. 将AWS-Java-sdk添加到您的项目
  2. 在您的计算机上设置AWS凭据(密钥)
  3. 创建SendEmailRequest
  4. SendEmailRequest#.sendEmail(请求)
  5. P.S。您不需要任何JavaMail。你可以用任何想要的方式将它包装到Spring中的bean中。

答案 3 :(得分:0)

您也可以通过Application.properties来完成。确保您不在AWS SES的沙箱中。

  1. 验证您的电子邮件地址或域名是否通过SES发送电子邮件。转到SES DashBoard并选择&#34;电子邮件地址&#34 ;.(对于测试,您可以从SES DashBoard发送演示电子邮件 - &gt;电子邮件地址 - &gt;发送测试电子邮件)。
  2. 创建访问密钥ID&#39;和“秘密访问密钥”(没有此密钥你不能发送邮件。你将得到535错误)。
  3. 3.现在将密钥放在application.properties中。如下图所示

    `spring.mail.host=email-smtp.us-east-1.amazonaws.com(Your Hosting region)
    spring.mail.username=<Access Key Id>
    spring.mail.password=<Secret access key>`
    

    如果您使用的是MimeMessage,请按照以下说明设置发送邮件ID:

    MimeMessageHelper helper = new MimeMessageHelper(message);
    helper.setFrom("yourmailID@yourDomain.com");
    

    希望它有所帮助。

答案 4 :(得分:0)

如果有人使用aws的smtp接口而不是aws sdk api,只需在@davioooh答案中添加一些内容,- 如果使用端口465,则将协议用作smtps 但是,如果您使用的是端口25,587,则使用协议作为smtp 这是强制性的。

如果您在使用端口465时未使用SMTPS,那么您的springboot应用程序中将出现异常。(因为在使用端口465时,客户端必须在传输邮件时启动TLS,因此您必须在自己的SMTPS中提及SMTPS application.properties文件。

类似地,在使用端口25,587时不需要使用SMTPS,因为在这种情况下,服务器首先响应客户端是否启用了tls,然后客户端启动tls加密。因此,您只需要使用SMTP如果是25,587端口。