Veiledning til vår-e-post

1. Oversikt

I denne artikkelen vil vi gå gjennom trinnene som trengs for å sende e-post fra både en vanlig vaniljefjærapplikasjon så vel som fra en Spring Boot-applikasjon, den første bruker JavaMail-biblioteket og den siste bruker spring-boot-starter-mail avhengighet.

2. Maven-avhengigheter

Først må vi legge til avhengighet til vår pom.xml.

2.1. Vår

For bruk i det vanlige vårrammeverket vil vi legge til:

 org.springframework spring-context-support 5.2.8.RELEASE 

Den siste versjonen finner du her.

2.2. Vårstøvel

Og for Spring Boot:

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

Den siste versjonen er tilgjengelig i Maven Central repository.

3. Egenskaper for e-postserver

Grensesnittene og klassene for Java-poststøtte i Spring-rammeverket er organisert som følger:

  1. MailSender grensesnitt: Grensesnittet på toppnivå som gir grunnleggende funksjonalitet for å sende enkle e-postmeldinger
  2. JavaMailSender grensesnitt: undergrensesnittet til ovennevnte MailSender. Den støtter MIME-meldinger og brukes mest i forbindelse med MimeMessageHelper klasse for opprettelse av en MimeMessage. Det anbefales å bruke MimeMessagePreparator mekanisme med dette grensesnittet
  3. JavaMailSenderImpl klasse: gir en implementering av JavaMailSender grensesnitt. Den støtter MimeMessage og SimpleMailMessage
  4. SimpleMailMessage klasse: brukes til å lage en enkel e-postmelding inkludert fra, til, cc, emne og tekstfelt
  5. MimeMessagePreparator grensesnitt: gir et tilbakeringingsgrensesnitt for utarbeidelse av MIME-meldinger
  6. MimeMessageHelper klasse: hjelperklasse for oppretting av MIME-meldinger. Det tilbyr støtte for bilder, typiske e-postvedlegg og tekstinnhold i et HTML-oppsett

I de følgende avsnittene viser vi hvordan disse grensesnittene og klassene brukes.

3.1. Spring Mail Server Properties

E-postegenskaper som er nødvendige for å spesifisere f.eks. SMTP-serveren kan defineres ved hjelp av JavaMailSenderImpl.

For eksempel kan dette konfigureres for Gmail som vist nedenfor:

@Bean offentlig JavaMailSender getJavaMailSender () {JavaMailSenderImpl mailSender = ny JavaMailSenderImpl (); mailSender.setHost ("smtp.gmail.com"); mailSender.setPort (587); mailSender.setUsername ("[email protected]"); mailSender.setPassword ("passord"); Egenskaper rekvisitter = 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"); return mailSender; } 

3.2. Spring Boot Mail Server Properties

Når avhengigheten er på plass, er neste trinn å spesifisere egenskapene til e-postserveren i application.properties filen ved hjelp av vårpost. * navneområdet.

Egenskapene for Gmail SMTP Server kan for eksempel spesifiseres som:

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 = sant 

Noen SMTP-servere krever en TLS-tilkobling, så eiendommen spring.mail.properties.mail.smtp.starttls.enable brukes til å aktivere en TLS-beskyttet tilkobling.

3.2.1. Gmail SMTP-egenskaper

Vi kan sende en e-post via Gmail SMTP-server. Ta en titt på dokumentasjonen for å se egenskapene til SMTP-server for Gmail for utgående e-post.

Våre applikasjonen. egenskapene filen er allerede konfigurert til å bruke Gmail SMTP (se forrige avsnitt).

Merk at passordet for kontoen din ikke skal være et vanlig passord, men et applikasjonspassord generert for Google-kontoen din. Følg denne lenken for å se detaljene og generere Google App-passordet ditt.

3.2.2. SES SMTP-egenskaper

For å sende e-postmeldinger ved hjelp av Amazon SES Service, angi din application.properties som vi gjør nedenfor:

spring.mail.host = email-smtp.us-west-2.amazonaws.com spring.mail.username = brukernavn spring.mail.password = passord spring.mail.properties.mail.transport.protocol = smtp spring.mail. properties.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 = sant

Vær oppmerksom på at Amazon krever at du bekrefter legitimasjonen din før du bruker dem. Følg lenken for å bekrefte brukernavnet og passordet ditt.

4. Sende e-post

Når avhengighetsadministrasjon og konfigurasjon er på plass, kan vi bruke det ovennevnte JavaMailSender å sende en e-post.

Siden både det vanlige vårrammeverket og Boot-versjonen av det håndterer komponering og sending av e-post på en lignende måte, trenger vi ikke å skille mellom de to i underavsnittene nedenfor.

4.1. Sende enkle e-poster

La oss først komponere og sende en enkel e-postmelding uten vedlegg:

@Component public class EmailServiceImpl implementerer EmailService {@Autowired private JavaMailSender emailSender; public void sendSimpleMessage (String to, String subject, String text) {... SimpleMailMessage message = new SimpleMailMessage (); message.setFrom ("[email protected]"); message.setTo (til); message.setSubject (emne); message.setText (tekst); emailSender.send (melding); ...}}

Merk at selv om det ikke er obligatorisk å oppgi fra adresse, ville mange SMTP-servere avvise slike meldinger. Derfor bruker vi e-postadressen [email protected] i vår EmailService gjennomføring.

4.2. Sende e-post med vedlegg

Noen ganger er ikke vår enkle meldinger nok for våre brukstilfeller.

For eksempel ønsker vi å sende en ordrebekreftelses-e-post med faktura vedlagt. I dette tilfellet bør vi bruke en MIME flerdelt melding fra JavaMail bibliotek i stedet for SimpleMailMessage. Vårstøtter JavaMail meldinger med org.springframework.mail.javamail.MimeMessageHelper klasse.

Først og fremst legger vi til en metode for EmailServiceImpl å sende e-post med vedlegg:

@Override public void sendMessageWithAttachment (String to, String subject, String text, String pathToAttachment) {// ... MimeMessage message = emailSender.createMimeMessage (); MimeMessageHelper helper = ny MimeMessageHelper (melding, sant); helper.setFrom ("[email protected]"); helper.setTo (til); helper.setSubject (subject); helper.setText (tekst); FileSystemResource file = new FileSystemResource (new File (pathToAttachment)); helper.addAttachment ("Faktura", fil); emailSender.send (melding); // ...}

4.3. Enkel e-postmal

SimpleMailMessage klasse støtter tekstformatering. Vi kan lage en mal for e-post ved å definere en malbønne i vår konfigurasjon:

@Bean offentlig SimpleMailMessage malSimpleMessage () {SimpleMailMessage melding = ny SimpleMailMessage (); message.setText ("Dette er e-postmalen for din e-post: \ n% s \ n"); returmelding; }

Nå kan vi bruke denne bønnen som en mal for e-post og trenger bare å oppgi de nødvendige parametrene til malen:

@Autowired offentlig SimpleMailMessage mal; ... Strengtekst = String.format (template.getText (), templateArgs); sendSimpleMessage (til, emne, tekst);

5. Håndtering av sendefeil

JavaMail gir SendFailedException for å håndtere situasjoner der en melding ikke kan sendes. Men det er mulig at du ikke får dette unntaket mens du sender en e-post til feil adresse. Årsaken er følgende:

Protokollspesifikasjonene for SMTP i RFC 821 spesifiserer 550 returkoden som SMTP-serveren skal returnere når du prøver å sende en e-post til feil adresse. Men de fleste av de offentlige SMTP-serverne gjør ikke dette. I stedet sender de en "levering mislyktes" e-post til boksen din, eller gir ingen tilbakemelding i det hele tatt.

For eksempel sender Gmail SMTP-server en "levering mislyktes" -melding. Og du får ingen unntak i programmet ditt.

Så det er få alternativer du kan gå gjennom for å håndtere denne saken:

  1. Fang opp SendFailedException, som aldri kan kastes
  2. Sjekk avsenderens postkasse når det gjelder "levering mislyktes" i en periode. Dette er ikke greit og tidsperioden blir ikke bestemt
  3. Hvis e-postserveren ikke gir noen tilbakemelding i det hele tatt, kan du ikke gjøre noe

6. Konklusjon

I denne raske artikkelen viste vi hvordan du konfigurerer og sender e-post fra en Spring Boot-applikasjon.

Implementeringen av alle disse eksemplene og kodebiter finner du på GitHub.