2015-10-19 23 views
17

Sto cercando di inviare e-mail utilizzando Boot primavera, ma che ottiene:L'invio di e-mail tramite avvio Primavera "primavera-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) 

Ho usato questa voce 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 

E il mio codice:

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

Questo sembra essere semplice ma non mi manca!

risposta

14

Si dispone di una seconda versione di javax.mail.internet.MimeMessage sul classpath oltre a quella che viene attivata tramite spring-boot-starter-mail. Un colpevole comune è il jar JavaMail spec di Geronimo. Qualunque sia il vaso, è necessario escluderlo dalle dipendenze dell'applicazione. Se non sei sicuro da dove provenga, la tua applicazione con -verbose:class ti dirà.

+0

Grazie @Andy, il problema lo vedo che se l'eseguo da mvn primavera-boot: run, ho il problema, mentre quando ho eseguito utilizzando java-jar di destinazione/myJar .jar, funziona perfettamente, quindi, pensi ancora che potrebbe essere la libbia duplicata? – krmanish007

+1

Sì. Sospetto che l'ordine del classpath sia diverso tra 'mvn spring-boot: run' e' java -jar'. Nel caso in cui funzioni, la buona versione delle classi JavaMail sarà sul classpath prima della versione errata e viceversa nel caso in cui non riesca. –

27

Il mio consiglio è di usare la libreria it.ozimov:spring-boot-email-core, che nasconde tutte queste implementazioni dietro un singolo componente chiamato EmailService - beh, sto anche sviluppando la libreria :).

tuo esempio potrebbe essere:

@Autowired 
public EmailService emailService; 

public void sendEmail(){ 
    final Email email = DefaultEmail.builder() 
     .from(new InternetAddress("[email protected]k")) 
     .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); 
} 

Con la seguente 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 

Supporta anche alcuni motori di modello, come Freemarker, Baffi e Pebble, mentre si può estenderlo per utilizzare più motori di template. Inoltre, supporta anche la pianificazione e-mail e la prioritizzazione (per esempio, la massima priorità per il recupero della password e bassa priorità per il bollettino.

C'è un articolo su LinkedIn che spiega come usarlo. E 'here.

+0

Libreria molto bella, grazie! Ho bisogno di impostare intestazioni di posta personalizzate ma non riesco a capire come. Può essere fatto? Ho anche pubblicato una domanda su questo argomento qui su SO. –

+0

@JimArcher quali intestazioni? Quando viene inviato un oggetto 'Email', viene convertito in j'avax.mail.internet.MimeMessage'. Finora vedo due header impostati nella conversione: 'Disposition-Notification-To' e' Return-Receipt-To' che sono impostati tramite i metodi 'Email'' getDepositionNotificationTo() 'e' getReceiptTo() ', rispettivamente. Se ritieni che valga la pena di avere intestazioni aggiuntive, potrebbe essere una buona idea aprire un problema su GitHub nel repository del progetto. – JeanValjean

+0

cos'è 'your.smtp.com'? –

0

Non utilizzare javaMailSender.createMimeMessage(); tenta di utilizzare MimeMessagePreparator & MimeMessageHelper invece