Каковы необходимые шаги настройки, чтобы приложение Spring Boot отправляло простые электронные письма через AWS SES?

Я боролся с этим в течение нескольких часов сегодня. Я начал с документации по адресу http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_sending_mails, в котором мало что говорится о конкретных шагах. Он просто говорит, что разработчик может включить XML-компонент Bean, а затем автоматически связать 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, но это не помогло.

Я надеюсь, что кто-то сможет направить меня в правильном направлении.


person deinspanjer    schedule 15.09.2017    source источник
comment
Кажется, вам не хватает импорта @ImportResource(/aws-mail.xml) в ваш класс AwsSesTestApplication.   -  person skadya    schedule 25.09.2017
comment
Я только что попытался добавить эту аннотацию в класс приложения, но это не меняет сообщение об ошибке.   -  person deinspanjer    schedule 26.09.2017


Ответы (5)


Вы можете попробовать выполнить следующие шаги, чтобы решить вашу проблему. Я попробовал эти изменения в разветвленном репозитории от вас, и у меня это работает.

  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);
    }
person skadya    schedule 27.09.2017
comment
Не могли бы вы помочь в определении bean-компонента mailsender с JavaMailSender вместо MailSender? Я пытаюсь отправлять электронные письма в формате HTML с помощью SES. Но MailSender позволяет отправлять электронные письма только в виде простого текста. Как указать этот конфиг СЭС на JavaMailSender? - person Master Po; 16.10.2017
comment
Что такое SimpleEmailServiceMailSender? Я не могу найти этот класс. - person naXa; 20.02.2019
comment
какая версия весенней загрузки требуется? также как я могу получить зависимость от MailSender? - person Sumanth Varada; 09.07.2019
comment
Вы можете обратиться к pom.xml в разветвленном репозитории. Я думаю, что это была 1.5.x. - person skadya; 09.07.2019

Некоторое время назад я использовал 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 по умолчанию, настроив его с помощью предыдущих параметров. Вы можете использовать этот объект для отправки электронных писем...

Вероятно, это не лучший подход к интеграции AWS SES с приложением Spring Boot, но мне он подходит.

person davioooh    schedule 21.09.2017
comment
Я думал сделать то же самое, но хотел избежать использования интерфейса smtp для SES. Однако спасибо за участие, вполне вероятно, что это может помочь кому-то еще в будущем. - person deinspanjer; 21.09.2017
comment
@deinspanjer, почему вы хотите избежать использования SMTP? (просто для информации...) - person davioooh; 22.09.2017
comment
Потому что Amazon рекомендует использовать SES API, когда это возможно, в первую очередь из-за соображений производительности. См. примечание в начале этого раздела документа: cloud.spring.io/spring-cloud-static/spring-cloud-aws/ - person deinspanjer; 22.09.2017
comment
Взгляните на этот Gist: gist.github.com/ShigeoTejima/f2997f57405010c3caca это может быть полезно ... - person davioooh; 22.09.2017
comment
Да, я видел это, и это помогло мне начать работу, но, как сказал комментатор, похоже, что API изменился с тех пор, как он был опубликован, и он больше не работает из коробки. - person deinspanjer; 22.09.2017
comment
spring.mail.protocol=smtps сделал свое дело для меня. Благодарность - person andre; 17.07.2020

  1. Добавьте AWS-Java-sdk в свой проект
  2. Настройте учетные данные AWS (ключи) на своем компьютере.
  3. Создать SendEmailRequest
  4. SendEmailRequest#.sendEmail(запрос)

p.s. Вам не нужен никакой JavaMail здесь. Вы можете обернуть его в бобы весной любым желаемым способом.

person AlexGera    schedule 25.09.2017
comment
Спасибо, я думаю, я должен был быть немного более ясным, что я специально искал помощь в том, чтобы заставить spring-cloud-aws работать, как показано в моем примере проекта. - person deinspanjer; 26.09.2017

вы также можете сделать это через Application.properties. Убедитесь, что вы не находитесь в песочнице в AWS SES.

  1. Подтвердите свой адрес электронной почты или домен для отправки электронной почты через SES. Перейдите в SES DashBoard и выберите «Адреса электронной почты». (Для тестирования вы можете отправить демонстрационное письмо из SES DashBoard -> Адреса электронной почты -> Отправить тестовое письмо. ).
  2. Создайте «Идентификатор ключа доступа» и «Секретный ключ доступа». (Без этих ключей вы не можете отправлять почту. Вы получите 535-Error).

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, установите идентификатор отправки почты, как указано ниже:

MimeMessageHelper helper = new MimeMessageHelper(message);
helper.setFrom("[email protected]");

Надеюсь, поможет.

person Partha Mondal    schedule 21.03.2018

Просто чтобы добавить что-то к ответу @davioooh, если кто-то использует smtp-интерфейс aws вместо aws sdk api, -- если вы используете порт 465, используйте протокол как smtps. Но если вы используете порт 25 587, тогда вы используете протокол как smtp Обязательно.

Если вы не используете SMTPS при использовании порта 465, вы получите исключение в своем приложении Springboot (поскольку при использовании порта 465 клиент должен инициировать TLS при передаче почты, поэтому вы должны указать SMTPS в своем приложении. свойства файл.

Точно так же вам не требуется использовать SMTPS при использовании порта 25 587, потому что в этом случае сервер сначала отвечает клиенту, что он включен или нет, а затем клиент инициирует шифрование tls. Таким образом, вам нужно использовать SMTP только в случае Порт 25 587.

person Jaivardhan    schedule 12.07.2020