如何使用Spring和Velocity在Java中编写HTML电子邮件
在這篇文章中,我將介紹如何使用Spring和Velocity格式化和發送自動電子郵件。 Spring僅提供創建簡單文本電子郵件的功能,這對于簡單的情況很好,但是在典型的企業應用程序中,由于多種原因,您不希望這樣做:
- 用Java代碼創建基于HTML的電子郵件內容很繁瑣且容易出錯
- 顯示邏輯和業務邏輯之間沒有明確區分
- 更改電子郵件的顯示結構需要編寫Java代碼,重新編譯,重新部署等
通常,解決這些問題的方法是使用諸如FreeMarker或Velocity之類的模板庫來定義電子郵件內容的顯示結構。 對于Podcastpedia,我選擇了Velocity,這是Apache的免費開源基于Java的模板引擎。 最后,我唯一的編碼任務是創建要在電子郵件模板中呈現的數據并發送電子郵件。
我將基于Podcastpedia.org的真實場景進行演示
情境
在Podcastpedia.org的“ 提交播客”頁面上,我們鼓勵訪問者和播客生產者提交其播客,以包括在我們的播客目錄中。 提交播客后,將自動生成一封電子郵件,以通知我(adrianmatei [AT] gmail DOT com)和Podcastpedia人員(聯系[AT] podcastpedia DOT org)。
現在讓我們看看Spring和Velocity如何一起發揮作用:
1.先決條件
彈簧設置
“ Spring框架提供了一個有用的實用程序庫,用于發送電子郵件,該電子郵件使用戶免受底層郵件系統的細節的侵擾,并負責代表客戶端進行低級資源處理。” [1]
1.1.1。 圖書館事務
為了能夠使用Spring Framework的電子郵件庫,以下附加jar必須位于應用程序的類路徑中。
- JavaMail mail.jar庫
- JAF activation.jar庫
我使用Maven加載了這些依賴關系,因此這是pom.xml的配置片段:
Spring郵件依賴
<dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.7</version><scope>provided</scope> </dependency> <dependency><groupId>jaf</groupId><artifactId>activation</artifactId><version>1.0.2</version><scope>provided</scope> </dependency>速度設定
要使用Velocity創建電子郵件模板,首先需要在類路徑上提供Velocity庫。
使用Maven,您在pom.xml文件中具有以下依賴關系:
Maven中的速度依賴性
<!-- velocity --> <dependency><groupId>org.apache.velocity</groupId><artifactId>velocity</artifactId><version>1.7</version> </dependency> <dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-tools</artifactId><version>2.0</version> </dependency>2.電子郵件通知服務
在成功提交播客之后,我為電子郵件通知定義了EmailNotificationService接口。 它只有一項操作,即將播客擬議的播客通知播客。
下面的代碼顯示了EmailNotificationServiceImpl ,它是上述接口的實現:
Java代碼發送通知電子郵件
package org.podcastpedia.web.suggestpodcast;import java.util.Date; import java.util.HashMap; import java.util.Map;import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage;import org.apache.velocity.app.VelocityEngine; import org.podcastpedia.common.util.config.ConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.mail.javamail.MimeMessagePreparator; import org.springframework.ui.velocity.VelocityEngineUtils;public class EmailNotificationServiceImpl implements EmailNotificationService {@Autowiredprivate ConfigService configService; private JavaMailSender mailSender;private VelocityEngine velocityEngine;public void sendSuggestPodcastNotification(final SuggestedPodcast suggestedPodcast) {MimeMessagePreparator preparator = new MimeMessagePreparator() {@SuppressWarnings({ "rawtypes", "unchecked" })public void prepare(MimeMessage mimeMessage) throws Exception {MimeMessageHelper message = new MimeMessageHelper(mimeMessage);message.setTo(configService.getValue("EMAIL_TO_SUGGEST_PODCAST"));message.setBcc("adrianmatei@gmail.com");message.setFrom(new InternetAddress(suggestedPodcast.getEmail()) );message.setSubject("New suggested podcast");message.setSentDate(new Date());Map model = new HashMap(); model.put("newMessage", suggestedPodcast);String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "velocity/suggestPodcastNotificationMessage.vm", "UTF-8", model);message.setText(text, true);}};mailSender.send(preparator); }//getters and setters omitted for brevity}現在讓我們看一下代碼:
JavaMailSender和MimeMessagePreparator
org.springframework.mail軟件包是Spring框架的電子郵件支持的根級軟件包。 用于發送電子郵件的中央接口是MailSender接口,但是我們使用的是org.springframework.mail.javamail.JavaMailSender接口(第org.springframework.mail.javamail.JavaMailSender行),該接口向MailSender接口添加了專門的JavaMail功能,例如MIME消息支持(從它繼承了)。 JavaMailSender還提供了用于準備JavaMail MIME消息的回調接口,稱為org.springframework.mail.javamail.MimeMessagePreparator (lines 26-42)
org.springframework.mail.javamail.MimeMessagePreparator (lines 26-42)
。
MimeMessageHelper
處理JavaMail消息時,另一個有用的類是org.springframework.mail.javamail.MimeMessageHelper類,該類使您不必使用冗長的JavaMail API。 如您所見,通過使用MimeMessageHelper ,創建MimeMessage變得非常容易:
MimeMessageHelper的用法
MimeMessageHelper message = new MimeMessageHelper(mimeMessage);message.setTo(configService.getValue("EMAIL_TO_SUGGEST_PODCAST"));message.setBcc("adrianmatei@gmail.com");message.setFrom(new InternetAddress(suggestedPodcast.getEmail()) );message.setSubject("New suggested podcast");message.setSentDate(new Date());速度引擎
接下來要注意的是如何創建電子郵件文本:
使用Velocity模板創建電子郵件文本
Map model = new HashMap(); model.put("newPodcast", suggestedPodcast); String text = VelocityEngineUtils.mergeTemplateIntoString( velocityEngine, "velocity/suggestPodcastNotificationMessage.vm", "UTF-8", model); message.setText(text, true);- VelocityEngineUtils.mergeTemplateIntoString方法將指定的模板(類路徑中存在于Velocity文件夾中的suggestPodcastNotificationMessage.vm )與給定的模型(模型–“ newPodcast”)合并,該模型包含將模型名稱作為鍵并將模型對象作為值的映射。
- 您還需要指定要使用的velocityEngine
- 最后,結果以字符串形式返回
2.3.1。 創建速度模板
您可以在下面看到在此示例中使用的Velocity模板。 請注意,它是基于HTML的,并且由于它是純文本,因此可以使用您喜歡HTML或文本編輯器來創建。
速度模板
<html><body><h3>Hi Adrian, you have a new suggested podcast!</h3><p>From - ${newMessage.name} / ${newMessage.email} </p><h3>Podcast metadataline </h3><p>${newMessage.metadataLine}</p><h3>With the message</h3><p>${newMessage.message}</p></body></html>Bean配置
讓我們看看如何在應用程序上下文中配置所有內容:
電子郵件服務配置
<!-- ********************************* email service configuration ******************************* --> <bean id="smtpSession" class="org.springframework.jndi.JndiObjectFactoryBean"><property name="jndiName" value="java:comp/env/mail/Session"/> </bean> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><property name="session" ref="smtpSession" /> </bean> <bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean"><property name="velocityProperties"><value>resource.loader=classclass.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader</value></property> </bean> <bean id="emailNotificationServiceSuggestPodcast" class="org.podcastpedia.web.suggestpodcast.EmailNotificationServiceImpl"><property name="mailSender" ref="mailSender"/><property name="velocityEngine" ref="velocityEngine"/> </bean>- JavaMailSender具有對smtp會話的JNDI引用。 在Jetty9-gmail-account.xml文件中可以找到有關如何使用Google帳戶配置電子郵件會話的通用示例。
- VelocityEngineFactoryBean是配置VelocityEngine并將其提供為bean引用的工廠。
- ClasspathResourceLoader是一個簡單的加載器,將從classpath加載模板
摘要
在本示例中,您已經學習了如何使用Spring和Velocity在Java中編寫HTML電子郵件。 您所需要做的就是郵件,Spring和Velocity庫,編寫電子郵件模板并使用那些簡單的Spring幫助器類將元數據添加到電子郵件中并發送。
資源資源
源代碼– GitHub存儲庫
- 播客網
- org.podcastpedia.web.suggestpodcast.EmailNotificationService.java-電子郵件通知的Java接口
- 播客常見
- src / main / resources / spring / pcm-common.xml –在Spring應用程序上下文中與電子郵件相關的Bean配置
網頁
翻譯自: https://www.javacodegeeks.com/2014/07/how-to-compose-html-emails-in-java-with-spring-and-velocity.html
總結
以上是生活随笔為你收集整理的如何使用Spring和Velocity在Java中编写HTML电子邮件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最佳5本Java性能调优书籍–精选,必读
- 下一篇: Epic Games CEO 支持 AI