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!
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 .
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.
N'utilisez pas javaMailSender.createMimeMessage();
essayez d'utiliser MimeMessagePreparator
& MimeMessageHelper
à la place
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é.