简体   繁体   English

通过Spring启动发送电子邮件“spring-boot-starter-mail”

[英]Sending Email via Spring boot “spring-boot-starter-mail”

I am trying to send emails using spring boot, but am getting: 我正在尝试使用spring boot发送电子邮件,但我得到:

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)

I have used this maven entry: 我使用过这个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: application.properties:

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

And My code: 我的代码:

@Autowired
    private JavaMailSender javaMailSender;

private void send() {
        MimeMessage mail = javaMailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(mail, true);
            helper.setTo("mymail@mail.co.uk");
            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;
    }

This appears to be a straight forward but don't what am I missing! 这似乎是一个直接的,但不是我错过了什么!

My recommendation is to use the it.ozimov:spring-boot-email-core library, that hides all these implementations behind a single component called EmailService - well, I'm also developing the library :). 我的建议是使用it.ozimov:spring-boot-email-core库,它将所有这些实现隐藏在名为EmailService的单个组件EmailService - 好吧,我也在开发库:)。

Your example would be: 你的例子是:

@Autowired
public EmailService emailService;

public void sendEmail(){
   final Email email = DefaultEmail.builder()
        .from(new InternetAddress("mymail@mail.co.uk"))
        .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);
}

With the following application.properties : 使用以下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

It also supports some template engines, like Freemarker , Mustache and Pebble , while you can extend it to use more template engines. 它还支持一些模板引擎,如FreemarkerMustachePebble ,同时您可以扩展它以使用更多的模板引擎。 Moreover, it also supports email scheduling and prioritization (eg high priority for password recovery and low priority for newsletter. 此外,它还支持电子邮件安排和优先级(例如,密码恢复的高优先级和简报的低优先级。

There is an article on LinkedIn explaining how to use it. LinkedIn上有一篇文章解释了如何使用它。 It is here . 它就在这里

You have a second version of javax.mail.internet.MimeMessage on the classpath in addition to the one that's pulled in via spring-boot-starter-mail . 除了通过spring-boot-starter-mail引入的版本之外,你还在类路径上有第二个版本的javax.mail.internet.MimeMessage A common culprit is Geronimo's JavaMail spec jar. 常见的罪魁祸首是Geronimo的JavaMail spec jar。 Whichever jar it is, you need to exclude it from your application's dependencies. 无论它是哪个jar,您都需要将其从应用程序的依赖项中排除。 If you're not sure where it's coming from, running your application with -verbose:class will tell you. 如果您不确定它的来源,请使用-verbose:class运行您的应用程序。

Do not use javaMailSender.createMimeMessage(); 不要使用javaMailSender.createMimeMessage(); try to use MimeMessagePreparator & MimeMessageHelper instead 尝试使用MimeMessagePreparatorMimeMessageHelper

This worked for me: 这对我有用:

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

It only seemed to require this dependency: 它似乎只需要这种依赖:

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

And I set properties: 我设置了属性:

spring.mail.host=smtp.gmail.com
spring.mail.port=465
spring.mail.username=user.myapp@gmail.com
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

FYI, the port you choose is not arbitrary - 465 was required for Gmail, for example. 仅供参考,您选择的端口不是任意的 - 例如,Gmail需要465。 And you also needed to make changes to the sending Gmail account to get it to function properly. 此外,您还需要对发送的Gmail帐户进行更改才能使其正常运行。 I did this a long time ago, but I'm positive I've seen that exception before. 我很久以前就做过这个,但我很肯定我之前见过那个例外。 The lambda used in this example may be helpful in resolving that issue, but unfortunately I can't remember. 在这个例子中使用的lambda可能有助于解决这个问题,但不幸的是我不记得了。 Feel free to contact me if you need any clarification or would like to see more code of the example that I got working. 如果您需要任何澄清或想要查看我工作的示例的更多代码,请随时与我联系。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM