web-dev-qa-db-ja.com

Spring boot「spring-boot-starter-mail」経由でメールを送信する

私はスプリングブートを使用してメールを送信しようとしていますが、取得しています:

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("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;
    }

これは簡単なように見えますが、私が見逃しているものはありません!

18
krmanish007

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("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);
}

次の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

また、FreemarkerMustachePebble、テンプレートエンジンをさらに使用するように拡張できます。さらに、電子メールのスケジューリングと優先順位付けもサポートしています(たとえば、パスワード回復の優先度が高く、ニュースレターの優先度が低いなど)。

LinkedInには、その使用方法を説明する記事があります。 ここ です。

31
JeanValjean

javax.mail.internet.MimeMessageを介して取り込まれたものに加えて、クラスパスにspring-boot-starter-mailの2番目のバージョンがあります。一般的な原因は、GeronimoのJavaMail仕様jarです。どちらのjarファイルでも、アプリケーションの依存関係から除外する必要があります。どこから来たのかわからない場合は、-verbose:classを指定してアプリケーションを実行するとわかります。

17
Andy Wilkinson

javaMailSender.createMimeMessage();を使用しないでください。代わりにMimeMessagePreparatorMimeMessageHelperを使用してください。

1
user2560081

これは私のために働いた:

    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アカウントを変更して、正しく機能させる必要がありました。私はずっと前にこれをしましたが、私は前にその例外を見たことがあると確信しています。この例で使用されているラムダは、この問題を解決するのに役立ちますが、残念ながら覚えていません。明確化が必要な場合、または私が作業したサンプルのコードをもっと見たい場合は、お気軽にご連絡ください。

0
Christian Meyer