Sprievodca jarným e-mailom

1. Prehľad

V tomto článku sa oboznámime s krokmi potrebnými na odosielanie e-mailov z obyčajnej aplikácie Spring Vanilla, ako aj z aplikácie Spring Boot, pričom prvá používa knižnicu JavaMail a druhá používa spring-boot-starter-mail závislosť.

2. Maven závislosti

Najprv musíme pridať závislosti do našej pom.xml.

2.1. Jar

Pre použitie v obyčajnom vanilkovom jarnom rámci pridáme:

 org.springframework spring-context-support 5.2.8.RELEASE 

Najnovšiu verziu nájdete tu.

2.2. Jarná topánka

A pre Spring Boot:

 org.springframework.boot spring-boot-starter-mail 2.2.5.RELEASE 

Najnovšia verzia je k dispozícii v úložisku Maven Central.

3. Vlastnosti poštového servera

Rozhrania a triedy pre podporu pošty Java v rámci Spring sú usporiadané nasledovne:

  1. MailSender rozhranie: Rozhranie najvyššej úrovne, ktoré poskytuje základné funkcie na odosielanie jednoduchých e-mailov
  2. JavaMailSender rozhranie: podrozhranie vyššie uvedeného MailSender. Podporuje MIME správy a väčšinou sa používa v spojení s MimeMessageHelper triedy na vytvorenie a MimeMessage. Odporúča sa používať MimeMessagePreparator mechanizmus s týmto rozhraním
  3. JavaMailSenderImpl trieda: poskytuje implementáciu JavaMailSender rozhranie. Podporuje MimeMessage a SimpleMailMessage
  4. SimpleMailMessage trieda: slúži na vytvorenie jednoduchej poštovej správy obsahujúcej polia od, do, kópia, predmet a text
  5. Prípravok MimeMessage rozhranie: poskytuje rozhranie spätného volania na prípravu správ MIME
  6. MimeMessageHelper trieda: pomocná trieda na vytváranie správ MIME. Ponúka podporu obrázkov, typických príloh e-mailov a textového obsahu v rozložení HTML

V nasledujúcich častiach si ukážeme, ako sa tieto rozhrania a triedy používajú.

3.1. Vlastnosti jarného poštového servera

Vlastnosti pošty, ktoré sú potrebné na uvedenie napr. server SMTP je možné definovať pomocou JavaMailSenderImpl.

Napríklad pre Gmail to možno nakonfigurovať tak, ako je uvedené nižšie:

@Bean public JavaMailSender getJavaMailSender () {JavaMailSenderImpl mailSender = nový JavaMailSenderImpl (); mailSender.setHost ("smtp.gmail.com"); mailSender.setPort (587); mailSender.setUsername ("[chránený e-mailom]"); mailSender.setPassword ("heslo"); Vlastnosti rekvizity = mailSender.getJavaMailProperties (); props.put ("mail.transport.protocol", "smtp"); props.put ("mail.smtp.auth", "true"); props.put ("mail.smtp.starttls.enable", "true"); props.put ("mail.debug", "true"); spätný mailSender; } 

3.2. Vlastnosti jarného bootovacieho servera

Keď je závislosť na mieste, ďalším krokom je zadanie vlastností poštového servera v priečinku application.properties súbor pomocou spring.mail. * menný priestor.

Napríklad vlastnosti servera Gmail SMTP možno určiť ako:

spring.mail.host = smtp.gmail.com spring.mail.port = 587 spring.mail.username = spring.mail.password = spring.mail.properties.mail.smtp.auth = true spring.mail.properties.mail .smtp.starttls.enable = true 

Niektoré servery SMTP vyžadujú pripojenie TLS, takže vlastníctvo spring.mail.properties.mail.smtp.starttls.enable sa používa na povolenie pripojenia chráneného TLS.

3.2.1. Vlastnosti SMTP služby Gmail

Môžeme poslať e-mail cez server SMTP služby Gmail. V dokumentácii nájdete vlastnosti servera SMTP odchádzajúcej pošty v Gmaile.

Náš aplikácia.vlastnosti súbor je už nakonfigurovaný na používanie Gmailu SMTP (pozri predchádzajúcu časť).

Upozorňujeme, že heslo pre váš účet by nemalo byť obyčajné heslo, ale heslo aplikácie vygenerované pre váš účet google. Kliknutím na tento odkaz zobrazíte podrobnosti a vygenerujete svoje heslo aplikácie Google.

3.2.2. Vlastnosti SES SMTP

Ak chcete posielať e-maily pomocou služby Amazon SES, nastavte svoj application.properties ako to robíme nižšie:

spring.mail.host = email-smtp.us-west-2.amazonaws.com spring.mail.username = užívateľské meno spring.mail.password = heslo spring.mail.properties.mail.transport.protocol = smtp spring.mail. properties.mail.smtp.port = 25 spring.mail.properties.mail.smtp.auth = skutočná spring.mail.properties.mail.smtp.starttls.enable = skutočná spring.mail.properties.mail.smtp.starttls.required = pravda

Upozorňujeme, že spoločnosť Amazon vyžaduje, aby ste pred použitím overili svoje prihlasovacie údaje. Pomocou odkazu overte svoje používateľské meno a heslo.

4. Posielanie e-mailov

Po zavedení správy a konfigurácie závislostí môžeme použiť vyššie uvedené JavaMailSender poslať email.

Pretože tak prostý vanilkový rámec Spring, ako aj jeho bootovacia verzia zvládajú skladanie a odosielanie e-mailov podobným spôsobom, nebudeme ich musieť rozlišovať v pododdieloch nižšie.

4.1. Posielanie jednoduchých e-mailov

Najprv napíšeme a pošleme jednoduchú e-mailovú správu bez akýchkoľvek príloh:

@ Verejná trieda komponentu EmailServiceImpl implementuje službu EmailService {@Autowired private JavaMailSender emailSender; public void sendSimpleMessage (String to, String subject, String text) {... SimpleMailMessage message = new SimpleMailMessage (); message.setFrom ("[chránený e-mailom]"); message.setTo (do); message.setSubject (predmet); message.setText (text); emailSender.send (správa); ...}}

Upozorňujeme, že aj keď nie je povinné poskytnúť od mnoho serverov SMTP by takéto správy odmietlo. Preto používame e-mailovú adresu [chránenú e-mailom] v našom EmailService implementácia.

4.2. Posielanie e-mailov s prílohami

Na naše prípady použitia niekedy Springove jednoduché správy nestačia.

Napríklad chceme poslať e-mail s potvrdením objednávky s priloženou faktúrou. V takom prípade by sme mali použiť a MIME viacdielna správa od JavaMail knižnica namiesto SimpleMailMessage. Jarné podpery JavaMail zasielanie správ s org.springframework.mail.javamail.MimeMessageHelper trieda.

Najskôr pridáme metódu do EmailServiceImpl na posielanie e-mailov s prílohami:

@Override public void sendMessageWithAttachment (String to, String subject, String text, String pathToAttachment) {// ... MimeMessage message = emailSender.createMimeMessage (); Pomocník MimeMessageHelper = nový MimeMessageHelper (správa, pravda); helper.setFrom ("[chránený e-mailom]"); helper.setTo (do); helper.setSubject (predmet); helper.setText (text); FileSystemResource súbor = nový FileSystemResource (nový súbor (pathToAttachment)); helper.addAttachment ("Faktúra", súbor); emailSender.send (správa); // ...}

4.3. Jednoduchá e-mailová šablóna

SimpleMailMessage trieda podporuje formátovanie textu. Šablónu pre e-maily môžeme vytvoriť definovaním fazule šablóny v našej konfigurácii:

@Bean public SimpleMailMessage templateSimpleMessage () {správa SimpleMailMessage = nová SimpleMailMessage (); message.setText ("Toto je šablóna testovacieho e-mailu pre váš e-mail: \ n% s \ n"); spätná správa; }

Teraz môžeme túto fazuľu použiť ako šablónu pre e-mail a šablóne musíme poskytnúť iba potrebné parametre:

@Autowired verejná šablóna SimpleMailMessage; ... String text = String.format (template.getText (), templateArgs); sendSimpleMessage (na, predmet, text);

5. Zaobchádzanie s chybami odosielania

JavaMail poskytuje SendFailedException na riešenie situácií, keď správu nie je možné odoslať. Je ale možné, že túto výnimku nedostanete pri odosielaní e-mailov na nesprávnu adresu. Dôvod je nasledovný:

Špecifikácie protokolu pre SMTP v RFC 821 špecifikujú návratový kód 550, ktorý by mal server SMTP vrátiť pri pokuse o odoslanie e-mailu na nesprávnu adresu. Väčšina verejných serverov SMTP to však nerobí. Namiesto toho vám do schránky pošlú e-mail s oznámením „doručenie zlyhalo“ alebo neposkytnú žiadnu spätnú väzbu.

Napríklad server SMTP služby Gmail odošle správu „doručenie zlyhalo“. A vo svojom programe nedostanete žiadne výnimky.

Existuje teda niekoľko možností, ako zvládnuť tento prípad:

  1. Chytiť SendFailedException, ktoré sa nikdy nedajú vyhodiť
  2. Skontrolujte poštovú schránku odosielateľa v správe „doručenie zlyhalo“. Nie je to jednoznačné a časové obdobie nie je určené
  3. Ak váš poštový server neposkytuje vôbec žiadnu spätnú väzbu, nemôžete nič robiť

6. Záver

V tomto rýchlom článku sme si ukázali, ako nastaviť a odoslať e-maily z aplikácie Spring Boot.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete na GitHub.