web-dev-qa-db-fra.com

Envoi d'un e-mail via Spring boot "spring-boot-starter-mail"

J'essaie d'envoyer des courriels à l'aide de Spring Boot, mais j'obtiens:

Java.lang.UnsupportedOperationException: Method not yet implemented
        at javax.mail.internet.MimeMessage.<init>(MimeMessage.Java:89)
        at org.springframework.mail.javamail.SmartMimeMessage.<init>(SmartMimeMessage.Java:52)
        at org.springframework.mail.javamail.JavaMailSenderImpl.createMimeMessage(JavaMailSenderImpl.Java:325)

J'ai utilisé cette entrée maven:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.6.RELEASE</version>
    </parent>

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>1.2.6.RELEASE</version>
        </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
        <version>1.2.6.RELEASE</version>
    </dependency>

application.properties:

spring.mail.Host=smtp.gmail.com
spring.mail.port= 25
spring.mail.username= test
spring.mail.password= test

Et mon code:

@Autowired
    private JavaMailSender javaMailSender;

private void send() {
        MimeMessage mail = javaMailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(mail, true);
            helper.setTo("[email protected]");
            helper.setReplyTo("someone@localhost");
            helper.setFrom("someone@localhost");
            helper.setSubject("Lorem ipsum");
            helper.setText("Lorem ipsum dolor sit amet [...]");
        } catch (MessagingException e) {
            e.printStackTrace();
        } finally {}
        javaMailSender.send(mail);
        //return helper;
    }

Cela semble être simple, mais ne me manque pas!

18
krmanish007

Ma recommandation est d'utiliser la bibliothèque it.ozimov: spring-boot-email-core , qui cache toutes ces implémentations derrière un seul composant appelé EmailService - eh bien, je développe également la bibliothèque :).

Votre exemple serait:

@Autowired
public EmailService emailService;

public void sendEmail(){
   final Email email = DefaultEmail.builder()
        .from(new InternetAddress("[email protected]"))
        .replyTo(new InternetAddress("someone@localhost"))
        .to(Lists.newArrayList(new InternetAddress("someone@localhost")))
        .subject("Lorem ipsum")
        .body("Lorem ipsum dolor sit amet [...]")
        .encoding(Charset.forName("UTF-8")).build();

   emailService.send(email);
}

Avec le application.properties:

spring.mail.Host=your.smtp.com
spring.mail.port=587
spring.mail.username=test
spring.mail.password=test
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

Il prend également en charge certains moteurs de modèle, comme Freemarker , Moustache et Pebble , tandis que vous pouvez l'étendre pour utiliser plus de moteurs de modèles. De plus, il prend également en charge la planification et la priorisation des e-mails (par exemple, priorité élevée pour la récupération de mot de passe et faible priorité pour la newsletter.

Il y a un article sur LinkedIn expliquant comment l'utiliser. C'est ici .

31
JeanValjean

Vous disposez d'une deuxième version de javax.mail.internet.MimeMessage sur le chemin de classe en plus de celui qui est tiré via spring-boot-starter-mail. Un coupable commun est le pot de spécifications JavaMail de Geronimo. Quel que soit le fichier jar, vous devez l'exclure des dépendances de votre application. Si vous ne savez pas d'où cela vient, exécutez votre application avec -verbose:class vous le dira.

17
Andy Wilkinson

N'utilisez pas javaMailSender.createMimeMessage(); essayez d'utiliser MimeMessagePreparator & MimeMessageHelper à la place

1
user2560081

Cela a fonctionné pour moi:

    private TemplateEngine templateEngine;
    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    public MailContentBuilder mailContentBuilder;

    public void sendEmail(Users user, VerificationToken verificationToken) throws Exception {
        MimeMessagePreparator messagePreparator = mimeMessage -> {
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

            String name = user.getFirstname();
            String vtoken = verificationToken.getVtoken();
            String url = "http://3.16.214.183:8888/home/".concat(String.valueOf(user.getUserid())).concat("/").concat(vtoken);
            String content = mailContentBuilder.build(name, url);
            helper.setTo(user.getEmail());
            helper.setSubject("AppName - Please Verify Your Email");
            helper.setText(content, true);
        };
        try {
            mailSender.send(messagePreparator);
        } catch (MailException e) {
            e.printStackTrace();
        }
   }

Il semblait seulement exiger cette dépendance:

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

Et je mets des propriétés:

spring.mail.Host=smtp.gmail.com
spring.mail.port=465
[email protected]
spring.mail.password=password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.socketFactory.fallback=false

Pour info, le port que vous choisissez n'est pas arbitraire - 465 était requis pour Gmail, par exemple. Et vous deviez également apporter des modifications au compte Gmail d'envoi pour qu'il fonctionne correctement. Je l'ai fait il y a longtemps, mais je suis certain d'avoir déjà vu cette exception. Le lambda utilisé dans cet exemple peut être utile pour résoudre ce problème, mais je ne m'en souviens malheureusement pas. N'hésitez pas à me contacter si vous avez besoin d'éclaircissements ou si vous souhaitez voir plus de code de l'exemple sur lequel j'ai travaillé.

0
Christian Meyer