今天我一直在和它斗争几个小时。我从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
注释,但它没有帮助。
我希望有人能够引导我朝着正确的方向前进。
答案 0 :(得分:5)
您可以尝试以下步骤来解决问题。我在forked repo中尝试了这些更改,这对我有用。
pom.xml
档案中。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);
}
答案 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)
P.S。您不需要任何JavaMail。你可以用任何想要的方式将它包装到Spring中的bean中。
答案 3 :(得分:0)
您也可以通过Application.properties来完成。确保您不在AWS SES的沙箱中。
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端口。