2015-10-19 5 views
17

ich E-Mails versuchen Boot mit Frühling zu senden, aber bin immer:Senden E-Mail über Feder boot "Feder-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) 

ich diesen Maven Eintrag verwendet habe:

<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 

Und Mein Code:

@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; 
    } 

Dies scheint eine einfache Sache zu sein, aber was vermisse ich nicht!

Antwort

14

Sie haben eine zweite Version von javax.mail.internet.MimeMessage auf dem Klassenpfad zusätzlich zu der, die über spring-boot-starter-mail abgerufen wird. Ein üblicher Schuldiger ist Geronimos JavaMail-Spezifikationskrug. Egal welches Glas es ist, müssen Sie es aus den Abhängigkeiten Ihrer Anwendung ausschließen. Wenn Sie nicht sicher sind, woher es kommt, wird Ihnen Ihre Anwendung mit -verbose:class sagen.

+0

Dank @Andy, um das Problem verwende ich es sehen kann, wenn ich es laufen von mvn feder boot: laufen, ich das Problem bekommen, während, wenn ich Java mit -jar Ziel/meinejar .jar, es funktioniert gut. Also, denken Sie immer noch, es könnte auf die doppelte lib? – krmanish007

+1

Ja. Ich vermute, dass die Reihenfolge des Klassenpfades zwischen 'mvn spring-boot: run' und' java -jar' unterschiedlich ist. In dem Fall, in dem es funktioniert, befindet sich die gute Version der JavaMail-Klassen auf dem Klassenpfad vor der schlechten Version und umgekehrt, falls dies fehlschlägt. –

27

Meine Empfehlung ist es, die it.ozimov:spring-boot-email-core-Bibliothek zu verwenden, die alle diese Implementierungen hinter einer einzigen Komponente namens versteckt - nun, ich entwickle auch die Bibliothek :).

Ihr Beispiel wäre:

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

Mit folgendem 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 

Es auch einige Template-Engines unterstützt, wie Freemarker, Schnurrbart und Pebble, während Sie kann es erweitern, um mehr Template-Engines zu verwenden. Darüber hinaus unterstützt es auch E-Mail-Terminierung und Priorisierung (zB hohe Priorität für Passwort-Wiederherstellung und niedrige Priorität für Newsletter.

ein Artikel auf LinkedIn ist zu erklären, wie es zu benutzen. Es here ist.

+0

Sehr schöne Bibliothek, danke! Ich muss benutzerdefinierte Mail-Header festlegen, kann aber nicht herausfinden, wie. Kann das gemacht werden? Ich habe auch eine Frage zu diesem Thema hier auf SO geschrieben. –

+0

@JimArcher welche Header? Wenn ein E-Mail-Objekt gesendet wird, wird es in eine javax.mail.internet.MimeMessage umgewandelt. Bisher habe ich zwei Header in der Konvertierung gesetzt: Disposition-Notification-To und Return-Receipt-To, die über die Email-Methoden getDepositionNotificationTo() und getReceiptTo() gesetzt werden. Wenn Sie denken, dass es sich lohnt, zusätzliche Header zu haben, könnte es eine gute Idee sein, ein Problem auf GitHub im Projekt-Repository zu öffnen. – JeanValjean

+0

Was ist 'your.smtp.com'? –

0

nicht javaMailSender.createMimeMessage(); Verwenden Sie versuchen MimeMessagePreparator & MimeMessageHelper statt

Verwandte Themen