Vejledning til forårets e-mail

1. Oversigt

I denne artikel gennemgår vi de trin, der er nødvendige for at sende e-mails fra både en almindelig vanilla Spring-applikation såvel som fra en Spring Boot-applikation, den første ved hjælp af JavaMail-biblioteket og den sidstnævnte ved hjælp af spring-boot-starter-mail afhængighed.

2. Maven-afhængigheder

Først skal vi tilføje afhængighederne til vores pom.xml.

2.1. Forår

Til brug i den vanlige forårsramme tilføjer vi:

 org.springframework spring-context-support 5.2.8.RELEASE 

Den seneste version kan findes her.

2.2. Spring Boot

Og til Spring Boot:

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

Den seneste version er tilgængelig i Maven Central repository.

3. E-mail-serveregenskaber

Grænsefladerne og klasser til understøttelse af Java-mail i Spring-rammen er organiseret som følger:

  1. MailSender interface: Topgrænsefladen, der giver grundlæggende funktionalitet til afsendelse af enkle e-mails
  2. JavaMailSender interface: undergrænsefladen til ovenstående MailSender. Det understøtter MIME-beskeder og bruges mest i forbindelse med MimeMessageHjælp klasse til oprettelse af en MimeMessage. Det anbefales at bruge MimeMessagePreparator mekanisme med denne grænseflade
  3. JavaMailSenderImpl klasse: giver en implementering af JavaMailSender interface. Det understøtter MimeMessage og SimpleMailMessage
  4. SimpleMailMessage klasse: bruges til at oprette en simpel mailbesked inklusive fra, til, cc, emne og tekstfelter
  5. MimeMessagePreparator interface: giver en tilbagekaldelsesgrænseflade til forberedelse af MIME-meddelelser
  6. MimeMessageHjælp klasse: hjælperklasse til oprettelse af MIME-beskeder. Det giver support til billeder, typiske vedhæftede filer og tekstindhold i et HTML-layout

I de følgende afsnit viser vi, hvordan disse grænseflader og klasser bruges.

3.1. Spring Mail Server-egenskaber

Mailegenskaber, der er nødvendige for at specificere f.eks. SMTP-serveren kan defineres ved hjælp af JavaMailSenderImpl.

For eksempel kan dette konfigureres til 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 ("adgangskode"); Egenskaber 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 afhængigheden er på plads, er det næste trin at specificere mailserveregenskaberne i application.properties fil ved hjælp af spring.mail. * navneområde.

Egenskaberne for Gmail SMTP Server kan f.eks. Angives 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 = sand 

Nogle SMTP-servere kræver en TLS-forbindelse, så ejendommen spring.mail.properties.mail.smtp.starttls.enable bruges til at aktivere en TLS-beskyttet forbindelse.

3.2.1. Gmail SMTP-egenskaber

Vi kan sende en e-mail via Gmail SMTP-server. Se dokumentationen for at se egenskaberne for SMTP-serveren for Gmail-udgående mail.

Vores applikation. egenskaberne filen er allerede konfigureret til at bruge Gmail SMTP (se det foregående afsnit).

Bemærk, at adgangskoden til din konto ikke skal være en almindelig adgangskode, men en applikationsadgangskode, der genereres til din Google-konto. Følg dette link for at se detaljerne og generere din adgangskode til Google App.

3.2.2. SES SMTP egenskaber

For at sende e-mails ved hjælp af Amazon SES Service skal du indstille din application.properties som vi gør nedenfor:

spring.mail.host = email-smtp.us-west-2.amazonaws.com spring.mail.username = brugernavn spring.mail.password = adgangskode 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 = sandt

Vær opmærksom på, at Amazon kræver, at du bekræfter dine legitimationsoplysninger, før du bruger dem. Følg linket for at bekræfte dit brugernavn og din adgangskode.

4. Afsendelse af e-mail

Når afhængighedsstyring og konfiguration er på plads, kan vi bruge det ovennævnte JavaMailSender at sende en e-mail.

Da både den almindelige ramme om vanillefjeder og Boot-versionen af ​​den håndterer komponering og afsendelse af e-mails på en lignende måde, behøver vi ikke skelne mellem de to i underafsnittene nedenfor.

4.1. Afsendelse af enkle e-mails

Lad os først komponere og sende en simpel e-mail-besked uden vedhæftede filer:

@Komponent offentlig klasse EmailServiceImpl implementerer EmailService {@Autowired privat 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 (besked); ...}}

Bemærk, at selvom det ikke er obligatorisk at levere fra adresse, ville mange SMTP-servere afvise sådanne beskeder. Derfor bruger vi [e-mail-beskyttet] e-mail-adressen i vores EmailService implementering.

4.2. Afsendelse af e-mails med vedhæftede filer

Nogle gange er Spring's enkle beskeder ikke nok til vores brugssager.

For eksempel vil vi sende en ordrebekræftelses-e-mail med en vedhæftet faktura. I dette tilfælde skal vi bruge en MIME multipart meddelelse fra JavaMail bibliotek i stedet for SimpleMailMessage. Fjederstøtter JavaMail beskeder med org.springframework.mail.javamail.MimeMessageHelper klasse.

Først og fremmest tilføjer vi en metode til EmailServiceImpl at sende e-mails med vedhæftede filer:

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

4.3. Enkel e-mail-skabelon

SimpleMailMessage klasse understøtter tekstformatering. Vi kan oprette en skabelon til e-mails ved at definere en skabelonbønne i vores konfiguration:

@Bean offentlig SimpleMailMessage templateSimpleMessage () {SimpleMailMessage meddelelse = ny SimpleMailMessage (); message.setText ("Dette er test-e-mail-skabelonen til din e-mail: \ n% s \ n"); returnere besked; }

Nu kan vi bruge denne bønne som en skabelon til e-mail og behøver kun at give de nødvendige parametre til skabelonen:

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

5. Håndtering af sendefejl

JavaMail giver SendFailedException til at håndtere situationer, hvor en besked ikke kan sendes. Men det er muligt, at du ikke får denne undtagelse, mens du sender en e-mail til den forkerte adresse. Årsagen er følgende:

Protokolspecifikationerne for SMTP i RFC 821 specificerer 550-returkoden, som SMTP-serveren skal returnere, når man prøver at sende en e-mail til den forkerte adresse. Men de fleste af de offentlige SMTP-servere gør ikke dette. I stedet sender de en "levering mislykkedes" e-mail til din kasse eller giver slet ingen feedback.

For eksempel sender Gmail SMTP-server en meddelelse om "levering mislykkedes". Og du får ingen undtagelser i dit program.

Så der er få muligheder, du kan gå igennem for at håndtere denne sag:

  1. Fang den SendFailedException, som aldrig kan kastes
  2. Kontroller afsenderens postkasse, hvis meddelelsen "levering mislykkedes" i nogen periode. Dette er ikke ligetil, og tidsperioden bestemmes ikke
  3. Hvis din mailserver overhovedet ikke giver feedback, kan du ikke gøre noget

6. Konklusion

I denne hurtige artikel viste vi, hvordan man opsætter og sender e-mails fra en Spring Boot-applikation.

Implementeringen af ​​alle disse eksempler og kodestykker findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found