1. Общ преглед
В тази статия ще разгледаме стъпките, необходими за изпращане на имейли както от обикновено приложение на ванилия Spring, така и от приложение Spring Spring, първото използващо библиотеката JavaMail, а второто - зависимостта spring-boot-starter-mail .
2. Зависимости на Maven
Първо, трябва да добавим зависимостите към нашия pom.xml .
2.1. Пролет
За използване в обикновената рамка на ванилия Spring ще добавим:
org.springframework spring-context-support 5.2.8.RELEASE
Най-новата версия можете да намерите тук.
2.2. Пролетно зареждане
А за Spring Boot:
org.springframework.boot spring-boot-starter-mail 2.2.5.RELEASE
Най-новата версия е достъпна в хранилището на Maven Central.
3. Свойства на пощенския сървър
Интерфейсите и класовете за поддръжка на Java поща в Spring структурата са организирани, както следва:
- Интерфейс MailSender : Интерфейсът от най-високо ниво, който предоставя основна функционалност за изпращане на прости имейли
- Интерфейс JavaMailSender : подинтерфейсът на горния MailSender . Той поддържа MIME съобщения и се използва най-вече заедно скласа MimeMessageHelper за създаване на MimeMessage . Препоръчително е да използватемеханизма MimeMessagePreparator с този интерфейс
- Клас JavaMailSenderImpl : осигурява изпълнение наинтерфейса JavaMailSender . Той поддържа MimeMessage и SimpleMailMessage
- Клас SimpleMailMessage : използва се за създаване на обикновено пощенско съобщение, включващо полетата от, до, cc, тема и текст
- MimeMessagePreparator интерфейс : осигурява интерфейс за обратно извикване за подготовка на MIME съобщения
- MimeMessageHelper клас : помощен клас за създаване на MIME съобщения. Той предлага поддръжка на изображения, типични прикачени файлове към поща и текстово съдържание в HTML оформление
В следващите раздели показваме как се използват тези интерфейси и класове.
3.1. Свойства на Spring Mail Server
Свойствата на пощата, които са необходими за посочване, напр. SMTP сървърът, могат да бъдат дефинирани с помощта на JavaMailSenderImpl .
Например за Gmail това може да бъде конфигурирано, както е показано по-долу:
@Bean public JavaMailSender getJavaMailSender() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.gmail.com"); mailSender.setPort(587); mailSender.setUsername("[email protected]"); mailSender.setPassword("password"); Properties 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"); return mailSender; }
3.2. Свойства на Spring Mail за сървър за стартиране
След като зависимостта е налице, следващата стъпка е да посочите свойствата на пощенския сървър във файла application.properties, като използвате пространството от имена spring.mail. * .
Например свойствата за Gmail SMTP сървър могат да бъдат посочени като:
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
Някои SMTP сървъри изискват TLS връзка, така че свойството spring.mail.properties.mail.smtp.starttls.enable се използва за активиране на TLS-защитена връзка.
3.2.1. SMTP свойства на Gmail
Можем да изпратим имейл чрез SMTP сървър на Gmail. Погледнете документацията, за да видите свойствата на SMTP сървъра за изходяща поща на Gmail.
Нашият файл application.the е конфигуриран да използва Gmail SMTP (вижте предишния раздел).
Имайте предвид, че паролата за вашия акаунт не трябва да бъде обикновена парола, а парола за приложение, генерирана за вашия акаунт в Google. Следвайте тази връзка, за да видите подробности и да генерирате паролата си за Google App.
3.2.2. SES SMTP свойства
За да изпращате имейли с помощта на услугата Amazon SES, задайте application.properties, както правим по-долу:
spring.mail.host=email-smtp.us-west-2.amazonaws.com spring.mail.username=username spring.mail.password=password 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=true
Моля, имайте предвид, че Amazon изисква да проверите вашите идентификационни данни, преди да ги използвате. Следвайте връзката, за да потвърдите потребителското си име и парола.
4. Изпращане на имейл
След като управлението и конфигурацията на зависимостите са налице, можем да използваме гореспоменатия JavaMailSender за изпращане на имейл.
Тъй като както обикновената рамка на ванилия Spring, така и версията за зареждане се справят с съставянето и изпращането на имейли по подобен начин, няма да се налага да правим разлика между двете в подразделите по-долу.
4.1. Изпращане на прости имейли
Нека първо съставим и изпратим просто имейл съобщение без никакви прикачени файлове:
@Component public class EmailServiceImpl implements EmailService { @Autowired private JavaMailSender emailSender; public void sendSimpleMessage( String to, String subject, String text) { ... SimpleMailMessage message = new SimpleMailMessage(); message.setFrom("[email protected]"); message.setTo(to); message.setSubject(subject); message.setText(text); emailSender.send(message); ... } }
Имайте предвид, че въпреки че това не е задължително да се предоставя от адрес, много SMTP сървъри ще отхвърлят такива съобщения. Ето защо ние използваме [имейл защитен] имейл адрес в нашата реализация на EmailService .
4.2. Изпращане на имейли с прикачени файлове
Понякога простите съобщения на Spring не са достатъчни за нашите случаи на употреба.
For example, we want to send an order confirmation email with an invoice attached. In this case, we should use a MIME multipart message from JavaMail library instead of SimpleMailMessage. Spring supports JavaMail messaging with the org.springframework.mail.javamail.MimeMessageHelper class.
First of all, we'll add a method to the EmailServiceImpl to send emails with attachments:
@Override public void sendMessageWithAttachment( String to, String subject, String text, String pathToAttachment) { // ... MimeMessage message = emailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom("[email protected]"); helper.setTo(to); helper.setSubject(subject); helper.setText(text); FileSystemResource file = new FileSystemResource(new File(pathToAttachment)); helper.addAttachment("Invoice", file); emailSender.send(message); // ... }
4.3. Simple Email Template
SimpleMailMessage class supports text formatting. We can create a template for emails by defining a template bean in our configuration:
@Bean public SimpleMailMessage templateSimpleMessage() { SimpleMailMessage message = new SimpleMailMessage(); message.setText( "This is the test email template for your email:\n%s\n"); return message; }
Now we can use this bean as a template for email and only need to provide the necessary parameters to the template:
@Autowired public SimpleMailMessage template; ... String text = String.format(template.getText(), templateArgs); sendSimpleMessage(to, subject, text);
5. Handling Send Errors
JavaMail provides SendFailedException to handle situations when a message cannot be sent. But it is possible that you won't get this exception while sending an email to the incorrect address. The reason is the following:
The protocol specs for SMTP in RFC 821 specifies the 550 return code that SMTP server should return when attempting to send an email to the incorrect address. But most of the public SMTP servers don't do this. Instead, they send a “delivery failed” email to your box, or give no feedback at all.
For example, Gmail SMTP server sends a “delivery failed” message. And you get no exceptions in your program.
So, there are few options you can go through to handle this case:
- Catch the SendFailedException, which can never be thrown
- Проверете пощенската си кутия на подателя на съобщението „Неуспешна доставка“ за известен период от време. Това не е просто и периодът от време не е определен
- Ако вашият пощенски сървър изобщо не дава обратна връзка, не можете да направите нищо
6. Заключение
В тази бърза статия показахме как да настроите и изпратите имейли от приложението Spring Boot.
Прилагането на всички тези примери и кодови фрагменти може да бъде намерено в GitHub.