2015-10-19 124 views
17

我试图发送使用弹簧启动电子邮件,但我越来越:通过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; 
    } 

这似乎是一个直截了当,但不要错过什么!

回答

14

除了通过spring-boot-starter-mail引入的类别路径之外,还有类路径中的第二个版本javax.mail.internet.MimeMessage。 Geronimo的JavaMail规范jar是一个常见的罪魁祸首。无论它是哪个jar,都需要将它从应用程序的依赖项中排除。如果您不确定它来自何处,那么使用-verbose:class运行您的应用程序会告诉您。

+0

感谢@Andy,我可以看到它,如果我通过MVN春天启动运行它的问题:跑,我得到的问题,而当我运行使用Java的罐子目标/ myjar这一.jar,它工作正常。那么,你是否仍然认为它可能是重复的lib? – krmanish007

+1

是的。我怀疑'mvn spring-boot:run'和'java -jar'之间classpath的顺序是不同的。在它工作的情况下,良好版本的JavaMail类将在坏版本之前的类路径中,反之则在它失败的情况下。 –

27

我的建议是使用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胡子卵石,而你可以扩展它以使用更多的模板引擎。此外,它也支持电子邮件调度和优先级(例如,用于密码恢复和低优先级的通讯高度重视。

有在LinkedIn上的一篇文章,解释如何使用它。这是here

+0

非常好的图书馆,谢谢!我需要设置自定义邮件标题,但似乎无法弄清楚如何。可以这样做吗?我还在SO上发布了关于该主题的问题。 –

+0

@JimArcher哪头?当一个Email'对象被发送时,它被转换成一个j'avax.mail.internet.MimeMessage'。到目前为止,我在转换中看到了两个头文件:分别通过'Email'方法'getDepositionNotificationTo()'和'getReceiptTo()'设置的'Disposition-Notification-To'和'Return-Receipt-To'。如果您觉得值得拥有额外的头文件,那么在项目库上的GitHub上打开一个问题可能是一个好主意。 – JeanValjean

+0

什么是'your.smtp.com'? –

0

不要使用javaMailSender.createMimeMessage(); 尝试使用MimeMessagePreparator & MimeMessageHelper代替