Отправка электронной почты через 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, чтобы он функционировал должным образом. Я сделал это давным-давно, но я уверен, что видел это исключение раньше. Лямбда, использованная в этом примере, может быть полезна для решения этой проблемы, но, к сожалению, я не могу вспомнить. Не стесняйтесь обращаться ко мне, если вам нужны какие-либо разъяснения или вы хотите увидеть больше кода того примера, который я получил.