Какие шаги необходимо выполнить, чтобы приложение Spring Boot отправляло простые электронные письма через AWS SES?
Я боролся с этим в течение нескольких часов сегодня. Я начал с документации по адресу http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html, которая на самом деле мало говорит о конкретных шагах. Это просто говорит о том, что разработчик может включить 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
, но это не помогло.
Я надеюсь, что кто-то сможет направить меня в правильном направлении.
4 ответа
Вы можете попробовать следующие шаги, чтобы исправить вашу проблему. Я попробовал эти изменения в раздвоенном репо от вас, и это работает для меня.
- Добавьте зависимость "com.amazonaws:aws-java-sdk-ses" в
pom.xml
файл. - Создайте класс автоматической конфигурации для настройки 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 для отправки почты с использованием настроенного отправителя.
Надеюсь, поможет.
Некоторое время назад я использовал AWS SES в веб-проекте Spring Boot, но я не использовал Spring Cloud AWS для интеграции своего приложения с почтовой службой.
Вместо этого я просто включил spring-boot-starter-mail
среди проектных зависимостей (pom.xml):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
Затем я устанавливаю параметры SMTP-сервера в моем 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, но он прекрасно работает для меня.
- Добавьте AWS-Java-sdk в ваш проект
- Настройте учетные данные AWS (ключи) на своем компьютере
- Создать SendEmailRequest
- SendEmailRequest #.sendEmail (запрос)
ps Вам здесь не нужен JavaMail. Весной вы можете обернуть его в бобы любым желаемым способом.
Вы также можете сделать это через Application.properties. Убедитесь, что вы не находитесь в песочнице в AWS SES.
- Проверьте адрес электронной почты или домен для отправки электронной почты через SES.Go на SES DashBoard и выберите "Адреса электронной почты". (Для тестирования вы можете отправить демонстрационное электронное письмо с SES DashBoard -> Адреса электронной почты -> Отправить тестовое электронное письмо).
- Создайте "Идентификатор ключа доступа" и "Секретный ключ доступа". (Без этих ключей вы не можете отправлять почту. Вы получите 535-Ошибка).
3. Теперь поместите ключи в ваше приложение. Свойства. Как показано ниже
`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, установите идентификатор отправляемой почты, как указано ниже:
MimeMessageHelper helper = new MimeMessageHelper(message);
helper.setFrom("yourmailID@yourDomain.com");
Надеюсь, поможет.
Просто чтобы добавить что-то в ответ @davioooh, если кто-то использует smtp-интерфейс aws вместо aws sdk api,- если вы используете порт 465, используйте протокол как smtps. Но если вы используете порт 25,587, вы используете протокол как smtp Обязательно.
Если вы не используете SMTPS при использовании порта 465, вы получите исключение в своем приложении springboot.(Поскольку при использовании порта 465 клиент должен инициировать TLS при передаче почты, поэтому вы должны указать SMTPS в своем приложении.properties файл.
Точно так же вам не нужно использовать SMTPS при использовании порта 25587, потому что в этом случае сервер сначала отвечает клиенту, что он включен tls или нет, затем клиент инициирует шифрование tls. Таким образом, вам нужно использовать SMTP только в случае Порт 25,587.