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 に答える
0

@daviooohの回答に何かを追加するだけです。誰かがaws sdk apiの代わりにawsのsmtpインターフェイスを使用している場合--ポート465を使用している場合は、プロトコルをsmtpsとして使用しますしかし、ポート25,587を使用している場合は、プロトコルを使用しますas smtp 必須です。

ポート 465 を使用しているときに SMTPS を使用していない場合、springboot アプリケーションで例外が発生します。ファイル。

同様に、ポート 25,587 を使用している間は SMTPS を使用する必要はありません。この場合、サーバーは最初に TLS が有効になっているかどうかをクライアントに応答し、次にクライアントが TLS 暗号化を開始するためです。ポート 25,587。

于 2020-07-12T10:15:46.137 に答える