2015-10-19 18 views
17

Próbuję wysłać wiadomości e-mail przy użyciu bagażnik sprężyny, ale otrzymuję:wysyłając e-mail za pośrednictwem wiosennego startu "wiosna-boot-rozrusznik-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) 

Użyłem tego wpisu 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 

A mój kodu:

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

Wydaje się to być proste, ale nie tego, czego mi brakuje!

Odpowiedz

14

Masz drugą wersję javax.mail.internet.MimeMessage na ścieżce klas, oprócz tej, która została wciągnięta przez spring-boot-starter-mail. Powszechnym winowajcą jest słoik specyfikacji JavaMail firmy Geronimo. Niezależnie od tego, jaki jest to słoik, należy wykluczyć go z zależności aplikacji. Jeśli nie masz pewności, skąd się bierze, zostaniesz poinformowany o uruchomieniu aplikacji pod numerem -verbose:class.

+0

Thanks @Andy, problem widzę to, że jeśli uruchomię go przez mvn wiosenno-boot: bieganie, mam problem, podczas gdy uruchamiam przy użyciu java -jar target/myJar .jar, działa dobrze, więc czy nadal uważasz, że może to zależeć od duplikatu biblioteki? – krmanish007

+1

Tak. Podejrzewam, że kolejność classpath różni się między 'mvn spring-boot: run' i' java -jar'. W przypadku, gdy to działa, dobra wersja klas JavaMail będzie w ścieżce klas przed złą wersją i odwrotnie w przypadku, gdy się nie powiedzie. –

27

Moja rada jest taka, aby korzystać z biblioteki it.ozimov:spring-boot-email-core, która ukrywa wszystkie te implementacje za pojedynczy składnik o nazwie EmailService - dobrze, ja też rozwój biblioteki :).

Twój przykład byłoby:

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

z następującymi 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 

obsługuje również niektóre silniki szablonu, jak Freemarker, Moustache i Pebble, a ty można go rozszerzyć, aby użyć więcej silników szablonów. Ponadto, obsługuje również harmonogram e-mail i priorytetyzacji (np wysoki priorytet dla odzyskiwania hasła i niskiego priorytetu dla biuletynu.

Jest artykuł na LinkedIn wyjaśniając, jak go używać. Jest here.

+0

Bardzo ładna biblioteka, dziękuję! Muszę ustawić niestandardowe nagłówki wiadomości, ale nie wiem, jak to zrobić. Czy to możliwe? Również wysłałem pytanie na ten temat tutaj na SO. –

+0

@JimArcher które nagłówki? Gdy obiekt 'Email' jest wysyłany, jest konwertowany na format j'avax.mail.internet.MimeMessage'. Do tej pory widzę dwa nagłówki ustawione w konwersji: "Disposition-Notification-To" i "Return-Receipt-To", które są ustawione odpowiednio za pomocą metod 'Email'' getDepositionNotificationTo() 'i' getReceiptTo() '. Jeśli uważasz, że warto mieć dodatkowe nagłówki, dobrym pomysłem byłoby otwarcie problemu na GitHub w repozytorium projektu. – JeanValjean

+0

co to jest "your.smtp.com"? –

0

Nie używaj javaMailSender.createMimeMessage(); spróbować użyć MimeMessagePreparator & MimeMessageHelper zamiast