9

我今天已经为此奋斗了几个小时。我从http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_sending_mails上的文档开始,它并没有真正说明具体步骤。它只是说开发人员可以包含一个 Bean XML,然后是 autowire 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,但没有帮助。

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

4

5 回答 5

15

您可以尝试以下步骤来解决您的问题。我在您的分叉回购中尝试了这些更改,它对我有用。

  1. 在文件中添加依赖项“com.amazonaws:aws-java-sdk-ses” pom.xml
  2. 创建一个自动配置类来配置邮件发送者 bean。下面是例子。由开箱即用AWSCredentialsProvider配置和提供。spring-cloud-starter-aws

.

@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);
    }
于 2017-09-27T00:25:53.480 回答
4

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

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

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

然后我在我的application.properties. 就我而言,我使用了这些属性:

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 应用程序集成的最佳方法,但它对我来说很好。

于 2017-09-21T13:52:37.760 回答
0
  1. 将 AWS-Java-sdk 添加到您的项目
  2. 在您的机器上设置 AWS 凭证(密钥)
  3. 创建发送电子邮件请求
  4. SendEmailRequest#.sendEmail(请求)

ps 你在这里不需要任何JavaMail。您可以以任何所需的方式将其包装到 Spring 中的 bean 中。

于 2017-09-25T21:55:30.430 回答
0

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

  1. 验证您的电子邮件地址或域以通过 SES 发送电子邮件。转到 SES DashBoard 并选择“电子邮件地址”。(对于测试,您可以从 SES DashBoard 发送演示电子邮件--> 电子邮件地址 --> 发送测试电子邮件)。
  2. 创建“访问密钥 ID”和“秘密访问密钥”。(如果没有此密钥,您将无法发送邮件。您将收到 535 错误)。

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");

希望能帮助到你。

于 2018-03-21T04:21:50.950 回答
0

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

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

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

于 2020-07-12T10:15:46.137 回答