Vodič za proljetnu e-poštu

1. Pregled

U ovom ćemo članku proći kroz korake potrebne za slanje e-poruka kako iz obične vanilije Spring aplikacije, tako i iz Spring Boot aplikacije, prva koja koristi JavaMail knjižnicu, a druga pomoću spring-boot-starter-mail ovisnost.

2. Ovisnosti Mavena

Prvo, moramo dodati ovisnosti u naš pom.xml.

2.1. Proljeće

Za upotrebu u običnom okviru vanilije Spring ćemo dodati:

 org.springframework proljeće-kontekst-podrška 5.2.8.OSLOBOĐENJE 

Najnoviju verziju možete pronaći ovdje.

2.2. Proljetni čizme

A za Spring Boot:

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

Najnovija verzija dostupna je u spremištu Maven Central.

3. Svojstva poslužitelja pošte

Sučelja i razredi za podršku Javi za poštu u Spring okviru organizirani su kako slijedi:

  1. MailSender sučelje: Sučelje najviše razine koje pruža osnovne funkcije za slanje jednostavnih e-poruka
  2. JavaMailSender sučelje: podsučelje gore navedenog MailSender. Podržava MIME poruke i uglavnom se koristi zajedno s MimeMessageHelper razred za stvaranje a MimeMessage. Preporuča se koristiti MimeMessagePreparator mehanizam s ovim sučeljem
  3. JavaMailSenderImpl razred: pruža provedbu JavaMailSender sučelje. Podržava MimeMessage i SimpleMailMessage
  4. SimpleMailMessage razred: koristi se za stvaranje jednostavne poruke e-pošte koja uključuje polja od, do, cc, temu i tekst
  5. MimeMessagePreparator sučelje: pruža sučelje za povratni poziv za pripremu MIME poruka
  6. MimeMessageHelper razred: pomoćna klasa za stvaranje MIME poruka. Nudi podršku za slike, tipične privitke pošte i tekstualni sadržaj u HTML rasporedu

U sljedećim odjeljcima prikazujemo kako se koriste ta sučelja i klase.

3.1. Svojstva Spring Mail Server

Svojstva pošte koja su potrebna za specificiranje npr. SMTP poslužitelj može se definirati pomoću JavaMailSenderImpl.

Na primjer, za Gmail to se može konfigurirati kako je prikazano u nastavku:

@Bean javni JavaMailSender getJavaMailSender () {JavaMailSenderImpl mailSender = novi JavaMailSenderImpl (); mailSender.setHost ("smtp.gmail.com"); mailSender.setPort (587); mailSender.setUsername ("[e-pošta zaštićena]"); mailSender.setPassword ("lozinka"); Svojstva props = 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"); vratiti mailSender; } 

3.2. Svojstva poslužitelja pošte za proljetno pokretanje

Jednom kada je ovisnost uspostavljena, sljedeći je korak specificiranje svojstava poslužitelja pošte u primjena.svojstva datoteku pomoću proljeće.pošta. * prostor imena.

Na primjer, svojstva za Gmail SMTP poslužitelj mogu se odrediti kao:

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 

Neki SMTP poslužitelji zahtijevaju TLS vezu, tako da je svojstvo spring.mail.properties.mail.smtp.starttls.enable koristi se za omogućavanje veze zaštićene TLS-om.

3.2.1. Gmail SMTP svojstva

Možemo poslati e-poštu putem Gmail SMTP poslužitelja. Pogledajte dokumentaciju da biste vidjeli svojstva SMTP poslužitelja odlazne pošte Gmaila.

Naše primjena.svojstva datoteka je već konfigurirana za upotrebu Gmail SMTP-a (pogledajte prethodni odjeljak).

Imajte na umu da lozinka za vaš račun ne bi trebala biti obična lozinka, već lozinka za aplikaciju generirana za vaš Google račun. Slijedite ovu vezu da biste vidjeli detalje i generirali lozinku za Google App.

3.2.2. SES SMTP svojstva

Da biste e-poštu slali pomoću usluge Amazon SES, postavite svoj primjena.svojstva kao što radimo u nastavku:

spring.mail.host = email-smtp.us-west-2.amazonaws.com spring.mail.username = korisničko ime spring.mail.password = lozinka spring.mail.properties.mail.transport.protocol = smtp spring.mail. svojstva.mail.smtp.port = 25 spring.mail.properties.mail.smtp.auth = true spring.mail.properties.mail.smtp.starttls.enable = true spring.mail.properties.mail.smtp.starttls.required = istinito

Imajte na umu da Amazon od vas zahtijeva da potvrdite svoje vjerodajnice prije nego što ih upotrijebite. Slijedite vezu da biste potvrdili svoje korisničko ime i lozinku.

4. Slanje e-pošte

Jednom kada se uspostave upravljanje i konfiguracija ovisnosti, možemo koristiti gore spomenuto JavaMailSender za slanje e-maila.

Budući da se i obični okvir vanilije Spring, kao i njegova verzija pokretanja, na sličan način bave sastavljanjem i slanjem e-pošte, nećemo morati razlikovati to dvoje u donjim pododjeljcima.

4.1. Slanje jednostavnih e-mailova

Prvo sastavimo i pošaljite jednostavnu poruku e-pošte bez ikakvih privitaka:

@Component javna klasa EmailServiceImpl implementira EmailService {@Autowired private JavaMailSender emailSender; javna praznina sendSimpleMessage (Niz do, predmet niza, tekst niza) {... SimpleMailMessage message = new SimpleMailMessage (); message.setFrom ("[e-pošta zaštićena]"); message.setTo (do); message.setSubject (subject); message.setText (tekst); emailSender.send (poruka); ...}}

Imajte na umu da iako nije obavezno navesti iz adresu, mnogi SMTP poslužitelji odbili bi takve poruke. Zbog toga koristimo [e-mail adresu] u svojoj EmailService provedba.

4.2. Slanje e-pošte s prilozima

Ponekad jednostavna razmjena poruka s Springom nije dovoljna za naše slučajeve korištenja.

Na primjer, želimo poslati e-poruku s potvrdom narudžbe s priloženom fakturom. U ovom bismo slučaju trebali koristiti a MIME višedijelna poruka od JavaMail knjižnica umjesto SimpleMailMessage. Proljetni nosači JavaMail razmjena poruka s org.springframework.mail.javamail.MimeMessageHelper razred.

Prije svega, dodati ćemo metodu u EmailServiceImpl za slanje e-pošte s privitcima:

@Override public void sendMessageWithAttachment (Niz do, predmet niza, Tekst niza, String pathToAttachment) {// ... MimeMessage message = emailSender.createMimeMessage (); MimeMessageHelper pomagač = novi MimeMessageHelper (poruka, istina); helper.setFrom ("[e-pošta zaštićena]"); pomagač.setTo (do); helper.setSubject (subject); pomoćnik.setText (tekst); FileSystemResource datoteka = novi FileSystemResource (nova datoteka (pathToAttachment)); helper.addAttachment ("Račun", datoteka); emailSender.send (poruka); // ...}

4.3. Jednostavni predložak e-pošte

SimpleMailMessage klasa podržava oblikovanje teksta. Predložak za e-poštu možemo stvoriti definiranjem graha predloška u našoj konfiguraciji:

@Bean public SimpleMailMessage templateSimpleMessage () {SimpleMailMessage message = new SimpleMailMessage (); message.setText ("Ovo je testni predložak e-pošte za vašu e-poštu: \ n% s \ n"); povratna poruka; }

Sada ovaj grah možemo koristiti kao predložak za e-poštu i predlošku moramo pružiti samo potrebne parametre:

@Autowired javni predložak SimpleMailMessage; ... Tekst niza = String.format (template.getText (), templateArgs); sendSimpleMessage (na, temu, tekst);

5. Rukovanje pogreškama slanja

JavaMail pruža SendFailedException za rješavanje situacija kada se poruka ne može poslati. No moguće je da ovu iznimku nećete dobiti tijekom slanja e-pošte na netočnu adresu. Razlog je sljedeći:

Specifikacije protokola za SMTP u RFC 821 specificiraju 550 povratni kôd koji bi SMTP poslužitelj trebao vratiti kada pokušava poslati e-poštu na netočnu adresu. Ali većina javnih SMTP poslužitelja to ne radi. Umjesto toga, na vašu kutiju šalju poruku e-pošte s neuspjelom dostavom ili uopće ne daju povratne informacije.

Na primjer, Gmail SMTP poslužitelj šalje poruku "dostava nije uspjela". I u vašem programu nema iznimki.

Dakle, postoji nekoliko opcija kroz koje možete riješiti ovaj slučaj:

  1. Uhvati SendFailedException, koji se nikad ne može baciti
  2. Provjerite poštanski sandučić pošiljatelja na poruku "dostava nije uspjela" neko vrijeme. To nije jednostavno i vremensko razdoblje nije određeno
  3. Ako vaš poslužitelj pošte uopće ne daje povratne informacije, ne možete ništa učiniti

6. Zaključak

U ovom smo kratkom članku pokazali kako postaviti i poslati e-poštu iz aplikacije Spring Boot.

Provedbu svih ovih primjera i isječaka koda možete pronaći na GitHubu.