2017-09-15 4 views
5

Je me bats avec cela depuis plusieurs heures aujourd'hui. J'ai commencé avec la documentation au http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_sending_mails qui ne dit pas vraiment beaucoup sur les étapes spécifiques. Il dit simplement que le développeur peut inclure un code Bean XML, puis autowire MailSender. J'ai essayé cela ainsi que de nombreuses variantes et je n'ai pas réussi à le faire fonctionner avec Spring-Cloud-aws. J'ai finalement eu recours directement à aws-java-sdk-ses et à la configuration manuelle de la classe.Quelles sont les étapes de configuration requises pour qu'une application Spring Boot envoie des e-mails simples via AWS SES?

Voici un projet simple ce que j'ai manifestaient essayé: https://github.com/deinspanjer/aws-ses-test

Ce projet compile, mais quand je le lance je reçois:

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' 

Si je tente d'ajouter javax-mail (https://github.com/deinspanjer/aws-ses-test/tree/try-with-javax-mail-api) alors les changements d'erreur à:

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' 

Si au contraire, j'essayer d'ajouter explicitement une dépendance sur SSFE-java-sdk-ses (https://github.com/deinspanjer/aws-ses-test/tree/try-with-aws-java-sdk-ses), je reçois cette erreur à la place:

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' 

Pour cette erreur, j'ai essayé d'ajouter une annotation @Qualifier("simpleMailSender") au @Autowired, mais il n'a pas aidé.

J'espère que quelqu'un pourrait me diriger dans la bonne direction.

+0

Il semble qu'il vous manque d'importer le @ImportResource ("/ aws-mail.xml") sur votre classe AwsSesTestApplication. – skadya

+0

J'ai juste essayé d'ajouter cette annotation à la classe d'application, mais cela ne change pas le message d'erreur. – deinspanjer

Répondre

2

Vous pouvez essayer les étapes ci-dessous pour résoudre le problème.J'ai essayé ces changements dans le forked repo de vous et cela fonctionne pour moi.

  1. Ajouter une dépendance "com.amazonaws: aws-java-sdk-ses" dans le fichier pom.xml.
  2. Créez une classe de configuration automatique pour configurer le bean expéditeur de courrier. Voici un exemple. Le AWSCredentialsProvider est configuré et fourni par spring-cloud-starter-aws prêt à l'emploi.

.

@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. Utilisez l'API spring pour envoyer du courrier à l'aide de l'expéditeur de courrier configuré.

Espérons que ça aide.

+0

Pouvez-vous nous aider à définir le beans mailsender avec 'JavaMailSender' au lieu de' MailSender'? J'essaie d'envoyer des emails HTML avec SES. Mais le 'MailSender' ne permet que les emails en texte brut. Comment spécifier cette config SES à 'JavaMailSender'? –

0

J'ai utilisé AWS SES dans un projet Web Spring Boot il y a quelques temps, mais je n'ai pas utilisé Spring Cloud AWS pour intégrer mon application au service de messagerie.

Au lieu de cela, je simplement inclus spring-boot-starter-mail parmi les dépendances du projet (pom.xml):

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-mail</artifactId> 
</dependency> 

Puis je définir les paramètres du serveur SMTP dans mon application.properties. Dans mon cas, j'utilisé ces propriétés:

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> 

Remarque: hôte du serveur et le port peuvent varier. Spring Boot créera une instance JavaMailSender par défaut, en la configurant avec les paramètres précédents. Vous pouvez utiliser cet objet pour envoyer des emails ...

Probablement ce n'est pas la meilleure approche de l'intégration AWS SES avec une application Spring Boot, mais ça marche très bien pour moi.

+0

Je pensais faire la même chose, mais je voulais éviter d'utiliser l'interface smtp pour SES. Merci pour la contribution cependant, très probablement, il pourrait aider quelqu'un d'autre sur la ligne. – deinspanjer

+0

@deinspanjer pourquoi voulez-vous éviter d'utiliser SMTP? (juste pour information ...) – davioooh

+0

Parce qu'Amazon recommande d'utiliser l'API SES à la place lorsque cela est possible, principalement en raison de considérations de performance. Voir la note au début de cette section doc: http://cloud.spring.io/spring-cloud-static/spring-cloud-aws/1.2.1.RELEASE/#_sending_mails – deinspanjer

0
  1. Ajouter AWS-Java-sdk à votre projet
  2. Configuration des informations d'identification AWS (Keys) sur votre machine
  3. SendEmailRequest
  4. Créez
  5. SendEmailRequest # .sendEmail (demande)

P.S. Vous n'avez pas besoin de JavaMail ici. Vous pouvez l'emballer en haricots au printemps de n'importe quelle manière désirée.

+0

Merci, je suppose que j'aurais dû être un peu plus clair que je cherchais spécifiquement de l'aide pour faire fonctionner Spring-Cloud-aws comme le montre mon exemple de projet. – deinspanjer