web-dev-qa-db-ja.com

SpringBootアプリケーションがAWSSESを介して簡単なEメールを送信するために必要な設定手順は何ですか?

私は今日数時間これと戦っています。 http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_sending_mails のドキュメントから始めましたが、特定の手順についてはあまり説明されていません。 。開発者がBeanXMLを含めてから、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_に追加しようとしましたが、役に立ちませんでした。

誰かが私を正しい方向に導くことができるかもしれないことを願っています。

8
deinspanjer

以下の手順を試して、問題を解決してください。 forked repo でこれらの変更を試してみましたが、うまくいきました。

  1. pom.xmlファイルに依存関係「com.amazonaws:aws-Java-sdk-ses」を追加します。
  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);
    }
10
skadya

しばらく前にSpringBootWebプロジェクトでAWSSESを使用しましたが、アプリケーションをメールサービスと統合するためにSpring CloudAWSを使用したことはありません。

代わりに、プロジェクトの依存関係(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インスタンスを作成し、以前のパラメーターで構成します。このオブジェクトを使用してメールを送信できます...

おそらくこれは、AWSSESをSpringBootアプリケーションと統合するための最良のアプローチではありませんが、私にとっては問題なく機能します。

2
davioooh

application.propertiesからも実行できます。 AWSSESのサンドボックスにいないことを確認してください。

  1. SESを介してメールを送信するためのメールアドレスまたはドメインを確認します。SESDashBoardに移動し、[メールアドレス]を選択します(テストの場合は、SESDashBoardからデモメールを送信->メールアドレス->テストメールを送信できます) )。
  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("[email protected]");

それが役に立てば幸い。

0
Partha Mondal
  1. AWS-Java-sdkをプロジェクトに追加します
  2. マシンにAWS認証情報(キー)をセットアップする
  3. SendEmailRequestを作成します
  4. SendEmailRequest#.sendEmail(request)

p.s.ここではJavaMailは必要ありません。 Springで任意の方法でBeanにラップできます。

0
AlexGera