Отправка электронной почты через Spring boot "spring -boot-starter-mail"
Я пытаюсь отправить электронную почту с помощью загрузки spring, но получаю:
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)
Я использовал эту запись 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
И мой код:
@Autowired
private JavaMailSender javaMailSender;
private void send() {
MimeMessage mail = javaMailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mail, true);
helper.setTo("[email protected]");
helper.setReplyTo("[email protected]");
helper.setFrom("[email protected]");
helper.setSubject("Lorem ipsum");
helper.setText("Lorem ipsum dolor sit amet [...]");
} catch (MessagingException e) {
e.printStackTrace();
} finally {}
javaMailSender.send(mail);
//return helper;
}
Это кажется прямым, но не то, что мне не хватает!
Ответы
Ответ 1
Моя рекомендация - использовать библиотеку it.ozimov: spring -boot-email-core, которая скрывает все эти реализации за один компонент под названием EmailService
- ну, я также разрабатываю библиотеку:).
Ваш пример:
@Autowired
public EmailService emailService;
public void sendEmail(){
final Email email = DefaultEmail.builder()
.from(new InternetAddress("[email protected]"))
.replyTo(new InternetAddress("[email protected]"))
.to(Lists.newArrayList(new InternetAddress("[email protected]")))
.subject("Lorem ipsum")
.body("Lorem ipsum dolor sit amet [...]")
.encoding(Charset.forName("UTF-8")).build();
emailService.send(email);
}
Со следующим 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
Он также поддерживает некоторые механизмы шаблонов, такие как Freemarker, Mustache и Pebble, в то время как вы можете расширить его, чтобы использовать больше движков шаблонов. Кроме того, он также поддерживает расписание электронной почты и приоритизацию (например, высокий приоритет для восстановления пароля и низкий приоритет для информационного бюллетеня.
В LinkedIn есть статья о том, как ее использовать. Это здесь.
Ответ 2
У вас есть вторая версия javax.mail.internet.MimeMessage
по пути к классу в дополнение к той, которая втягивается через spring-boot-starter-mail
. Обычным виновником является jar Geronimo JavaMail. Какой бы ни была jar, вам нужно исключить его из зависимостей вашего приложения. Если вы не знаете, откуда это взялось, запустите приложение с помощью -verbose:class
.
Ответ 3
Не используйте javaMailSender.createMimeMessage();
попробуйте вместо MimeMessagePreparator
и MimeMessageHelper
Ответ 4
Это сработало для меня:
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();
}
}
Казалось, требуется только эта зависимость:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
И я устанавливаю свойства:
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
К вашему сведению, выбранный вами порт не является произвольным - для Gmail, например, требовалось 465. И вам также нужно было внести изменения в отправляющий аккаунт Gmail, чтобы он функционировал должным образом. Я сделал это давным-давно, но я уверен, что видел это исключение раньше. Лямбда, использованная в этом примере, может быть полезна для решения этой проблемы, но, к сожалению, я не могу вспомнить. Не стесняйтесь обращаться ко мне, если вам нужны какие-либо разъяснения или вы хотите увидеть больше кода того примера, который я получил.