Gids voor Spring Email

1. Overzicht

In dit artikel zullen we de stappen doorlopen die nodig zijn om e-mails te verzenden vanuit zowel een gewone vanilla Spring-applicatie als vanuit een Spring Boot-applicatie, de eerste met behulp van de JavaMail-bibliotheek en de laatste met de spring-boot-starter-mail afhankelijkheid.

2. Maven afhankelijkheden

Eerst moeten we de afhankelijkheden toevoegen aan onze pom.xml.

2.1. Voorjaar

Voor gebruik in het gewone vanilla Spring-raamwerk zullen we toevoegen:

 org.springframework spring-context-support 5.2.8.RELEASE 

De laatste versie vind je hier.

2.2. Spring Boot

En voor Spring Boot:

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

De nieuwste versie is beschikbaar in de Maven Central-repository.

3. E-mailservereigenschappen

De interfaces en klassen voor Java-mailondersteuning in het Spring-framework zijn als volgt georganiseerd:

  1. MailSender koppel: De interface op het hoogste niveau die basisfunctionaliteit biedt voor het verzenden van eenvoudige e-mails
  2. JavaMailSender koppel: de subinterface van het bovenstaande MailSender. Het ondersteunt MIME-berichten en wordt meestal gebruikt in combinatie met de MimeMessageHelper klasse voor het maken van een MimeMessage. Het wordt aanbevolen om de MimeMessagePreparator mechanisme met deze interface
  3. JavaMailSenderImpl klasse: biedt een implementatie van de JavaMailSender koppel. Het ondersteunt het MimeMessage en SimpleMailMessage
  4. SimpleMailMessage klasse: wordt gebruikt om een ​​eenvoudig e-mailbericht te maken, inclusief de velden van, tot, cc, onderwerp en tekst
  5. MimeMessagePreparator koppel: biedt een callback-interface voor de voorbereiding van MIME-berichten
  6. MimeMessageHelper klasse: helper class voor het maken van MIME-berichten. Het biedt ondersteuning voor afbeeldingen, typische e-mailbijlagen en tekstinhoud in een HTML-lay-out

In de volgende secties laten we zien hoe deze interfaces en klassen worden gebruikt.

3.1. Eigenschappen van Spring Mail Server

E-maileigenschappen die nodig zijn om bijv. de SMTP-server kan worden gedefinieerd met behulp van de JavaMailSenderImpl.

Voor Gmail kan dit bijvoorbeeld worden geconfigureerd zoals hieronder weergegeven:

@Bean openbare JavaMailSender getJavaMailSender () {JavaMailSenderImpl mailSender = nieuwe JavaMailSenderImpl (); mailSender.setHost ("smtp.gmail.com"); mailSender.setPort (587); mailSender.setUsername ("[email protected]"); mailSender.setPassword ("wachtwoord"); Eigenschappen rekwisieten = 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"); retour mailSender; } 

3.2. Eigenschappen Spring Boot Mail Server

Zodra de afhankelijkheid aanwezig is, is de volgende stap het specificeren van de e-mailservereigenschappen in het application.properties bestand met behulp van de spring.mail. * naamruimte.

De eigenschappen voor Gmail SMTP-server kunnen bijvoorbeeld worden gespecificeerd als:

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

Sommige SMTP-servers vereisen een TLS-verbinding, dus de eigenschap spring.mail.properties.mail.smtp.starttls.enable wordt gebruikt om een ​​TLS-beveiligde verbinding mogelijk te maken.

3.2.1. Gmail SMTP-eigenschappen

We kunnen een e-mail sturen via de Gmail SMTP-server. Bekijk de documentatie om de eigenschappen van de SMTP-server voor uitgaande e-mail van Gmail te zien.

Onze applicatie. de eigenschappen bestand is al geconfigureerd om Gmail SMTP te gebruiken (zie het vorige gedeelte).

Houd er rekening mee dat het wachtwoord voor uw account geen gewoon wachtwoord mag zijn, maar een applicatiewachtwoord dat voor uw Google-account is gegenereerd. Volg deze link om de details te zien en om uw Google App-wachtwoord te genereren.

3.2.2. SES SMTP-eigenschappen

Om e-mails te verzenden met Amazon SES Service, stelt u uw application.properties zoals we hieronder doen:

spring.mail.host = email-smtp.us-west-2.amazonaws.com spring.mail.username = gebruikersnaam spring.mail.password = wachtwoord spring.mail.properties.mail.transport.protocol = smtp spring.mail. properties.mail.smtp.port = 25 spring.mail.properties.mail.smtp.auth = waar spring.mail.properties.mail.smtp.starttls.enable = waar spring.mail.properties.mail.smtp.starttls.vereist = waar

Houd er rekening mee dat Amazon vereist dat u uw inloggegevens verifieert voordat u ze gebruikt. Volg de link om uw gebruikersnaam en wachtwoord te verifiëren.

4. E-mail verzenden

Zodra afhankelijkheidsbeheer en configuratie zijn ingevoerd, kunnen we het bovengenoemde gebruiken JavaMailSender een email sturen.

Aangezien zowel het gewone vanilla Spring-framework als de Boot-versie ervan het opstellen en verzenden van e-mails op een vergelijkbare manier afhandelen, hoeven we in de onderstaande subsecties geen onderscheid te maken tussen de twee.

4.1. Eenvoudige e-mails verzenden

Laten we eerst een eenvoudig e-mailbericht opstellen en verzenden zonder bijlagen:

@Component openbare klasse EmailServiceImpl implementeert EmailService {@Autowired privé JavaMailSender emailSender; public void sendSimpleMessage (String to, String subject, String text) {... SimpleMailMessage message = nieuwe SimpleMailMessage (); message.setFrom ("[e-mail beveiligd]"); message.setTo (naar); message.setSubject (onderwerp); message.setText (tekst); emailSender.send (bericht); ...}}

Houd er rekening mee dat, hoewel het niet verplicht is om het van adres, zouden veel SMTP-servers dergelijke berichten weigeren. Daarom gebruiken we het [email protected] e-mailadres in ons E-mailservice implementatie.

4.2. E-mails met bijlagen verzenden

Soms is de eenvoudige berichtgeving van Spring niet genoeg voor onze gebruiksscenario's.

We willen bijvoorbeeld een orderbevestigingsmail sturen met een factuur als bijlage. In dit geval moeten we een MIME meerdelig bericht van JavaMail bibliotheek in plaats van SimpleMailMessage. Veersteunen JavaMail messaging met de org.springframework.mail.javamail.MimeMessageHelper klasse.

Allereerst voegen we een methode toe aan het E-mailserviceImpl om e-mails met bijlagen te verzenden:

@Override public void sendMessageWithAttachment (String to, String subject, String text, String pathToAttachment) {// ... MimeMessage message = emailSender.createMimeMessage (); MimeMessageHelper helper = nieuwe MimeMessageHelper (bericht, waar); helper.setFrom ("[e-mail beschermd]"); helper.setTo (naar); helper.setSubject (onderwerp); helper.setText (tekst); FileSystemResource-bestand = nieuw FileSystemResource (nieuw bestand (pathToAttachment)); helper.addAttachment ("Factuur", bestand); emailSender.send (bericht); // ...}

4.3. Eenvoudige e-mailsjabloon

SimpleMailMessage klasse ondersteunt tekstopmaak. We kunnen een sjabloon voor e-mails maken door een sjabloonboon in onze configuratie te definiëren:

@Bean openbare SimpleMailMessage templateSimpleMessage () {SimpleMailMessage bericht = nieuwe SimpleMailMessage (); message.setText ("Dit is het test-e-mailsjabloon voor uw e-mail: \ n% s \ n"); terug bericht; }

Nu kunnen we deze bean gebruiken als een sjabloon voor e-mail en hoeven we alleen de nodige parameters voor de sjabloon op te geven:

@Autowired openbare SimpleMailMessage-sjabloon; ... String text = String.format (template.getText (), templateArgs); sendSimpleMessage (naar, onderwerp, tekst);

5. Omgaan met verzendfouten

JavaMail biedt SendFailedException om situaties af te handelen waarin een bericht niet kan worden verzonden. Maar het is mogelijk dat u deze uitzondering niet krijgt als u een e-mail naar het verkeerde adres stuurt. De reden hiervoor is de volgende:

De protocolspecificaties voor SMTP in RFC 821 specificeren de 550-retourcode die de SMTP-server moet retourneren wanneer wordt geprobeerd een e-mail naar het verkeerde adres te verzenden. Maar de meeste openbare SMTP-servers doen dit niet. In plaats daarvan sturen ze een "bezorging mislukt" e-mail naar uw box, of geven ze helemaal geen feedback.

De Gmail SMTP-server verzendt bijvoorbeeld een bericht 'bezorging mislukt'. En u krijgt geen uitzonderingen in uw programma.

Er zijn dus enkele opties die u kunt doorlopen om deze zaak aan te pakken:

  1. Vang de SendFailedException, die nooit kan worden gegooid
  2. Controleer de mailbox van uw afzender gedurende een bepaalde periode op het bericht "levering mislukt". Dit is niet eenvoudig en de tijdsperiode is niet bepaald
  3. Als uw mailserver helemaal geen feedback geeft, kunt u niets doen

6. Conclusie

In dit korte artikel hebben we laten zien hoe u e-mails kunt instellen en verzenden vanuit een Spring Boot-toepassing.

De implementatie van al deze voorbeelden en codefragmenten is te vinden op GitHub.


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