通过 Spring 启动 "spring-boot-starter-mail" 发送电子邮件
Sending Email via 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("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;
}
这看起来很简单,但我错过了什么!
除了通过 spring-boot-starter-mail
引入的版本之外,类路径中还有 javax.mail.internet.MimeMessage
的第二个版本。一个常见的罪魁祸首是 Geronimo 的 JavaMail spec jar。无论是哪个 jar,您都需要将其从应用程序的依赖项中排除。如果您不确定它的来源,运行 您的 -verbose:class
应用程序会告诉您。
我的建议是使用 it.ozimov:spring-boot-email-core 库,它将所有这些实现隐藏在一个名为 EmailService
的组件后面 - 好吧,我也在开发该库 :).
你的例子是:
@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);
}
具有以下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 上有一篇文章解释了如何使用它。是here.
不使用javaMailSender.createMimeMessage();
尝试使用 MimeMessagePreparator
& MimeMessageHelper
而不是
这对我有用:
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
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
仅供参考,您选择的端口不是任意的 - 例如,Gmail 需要 465。您还需要更改发送 Gmail 帐户以使其正常运行。我很久以前就这样做了,但我很肯定我以前见过这个例外。此示例中使用的 lambda 可能有助于解决该问题,但不幸的是我不记得了。如果您需要任何说明或希望查看我正在工作的示例的更多代码,请随时与我联系。
我正在尝试使用 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("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;
}
这看起来很简单,但我错过了什么!
除了通过 spring-boot-starter-mail
引入的版本之外,类路径中还有 javax.mail.internet.MimeMessage
的第二个版本。一个常见的罪魁祸首是 Geronimo 的 JavaMail spec jar。无论是哪个 jar,您都需要将其从应用程序的依赖项中排除。如果您不确定它的来源,运行 您的 -verbose:class
应用程序会告诉您。
我的建议是使用 it.ozimov:spring-boot-email-core 库,它将所有这些实现隐藏在一个名为 EmailService
的组件后面 - 好吧,我也在开发该库 :).
你的例子是:
@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);
}
具有以下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 上有一篇文章解释了如何使用它。是here.
不使用javaMailSender.createMimeMessage();
尝试使用 MimeMessagePreparator
& MimeMessageHelper
而不是
这对我有用:
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
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
仅供参考,您选择的端口不是任意的 - 例如,Gmail 需要 465。您还需要更改发送 Gmail 帐户以使其正常运行。我很久以前就这样做了,但我很肯定我以前见过这个例外。此示例中使用的 lambda 可能有助于解决该问题,但不幸的是我不记得了。如果您需要任何说明或希望查看我正在工作的示例的更多代码,请随时与我联系。