velocity
在这篇文章中,我将介绍如何使用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必须位于应用程序的类路径中。
我使用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 {
@Autowired
private 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接口添加了诸如MIME消息支持之类的专用JavaMail功能(从它继承了)。 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=class
class.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存储库
- 播客网
- 播客常见
- src / main / resources / spring / pcm-common.xml –在Spring应用程序上下文中与电子邮件相关的Bean配置
网页
velocity