如何使用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配置
网页
- Spring电子邮件集成
- Apache Velocity项目
翻译自: https://www.javacodegeeks.com/2014/07/how-to-compose-html-emails-in-java-with-spring-and-velocity.html
如何使用Spring和Velocity在Java中编写HTML电子邮件相关推荐
- java代码中添加事务_C#和JAVA中编写事务代码
C# DAL层代码,执行多条增删改,使用事务操作: /// /// 执行 多条增删改 (非查询语句) /// /// /// /// public static int ExcuteNonQuery ...
- java mysql 占位符_在Java中编写带占位符的SQL语句
C#中SQL中带占位符的语句 假设有一张学员信息表Student,通过表中的ID来找学员,查询的SQL语句如下 string sql = string.Format("select * fr ...
- 如何在java输入_怎么在java中编写输入语句?
(1) JDK 1.5.0 及其以上版本提供的Scanner类为输入提供了良好的基础,很好地优化Java的输入问题.代码如下: import java.io.* import java.util.* ...
- java中编写单选按钮的程序_java的单选按钮GUI程序设计
单选按钮在GUI程序设计中的概念来自于老式的电子管汽车收音机的机械按钮:当我们按下一个按钮时,其它的按钮就会弹起.因此它允许我们强制从众多选择中作出单一选择. AWT没有单独的描述单选钮的类;取而代之 ...
- 如何在Java中编写正确的微基准测试?
您如何用Java编写(并运行)正确的微基准测试? 我正在寻找一些代码示例和注释,以说明要考虑的各种问题. 示例:基准测试应测量时间/迭代或迭代/时间,为什么? 相关: 秒表基准测试是否可以接受? #1 ...
- 在Java中编写实现_在运行时编写和实现新的Java类文件
是否可以通过某种方式将新的Java类"导入"到正在运行的程序中并加以利用? 我可以让一个程序创建一个类型为'.java'的新文件,然后将其包含在项目文件中并引用它,而不必重新启动该 ...
- ptable java_ttable怎么在java中编写
展开全部 JTable 有很多用来62616964757a686964616fe59b9ee7ad9431333337393561自定义其呈现和编辑的工具,同时提供了这些功能的默认设置,从而可以轻松地 ...
- java的equals方法_在Java中编写完美的equals方法
相对于C++,Java并没有重载操作符,所以对于非基本类型都需要使用equals方法比较相等性.Object提供了equals方法比较两个对象,但对于用户自定义类而言Object提供的版本仅仅比较两个 ...
- java中如果写设置密码,在java中编写一个多字母换位密码[关闭]
这就是我目前所拥有的 . 它应该找到以明文输入的字母,将它(区分大小写)与字母表中的字母匹配,然后根据输入的oddkey或evenkey的数字移位,我将在稍后实现 . 但目前,这是我得到的输出 . w ...
最新文章
- redis中的事务、lua脚本和管道的使用场景
- 进击的 JavaScript(六) 之 this
- 计算机社区活动,计算机与信息学院“e修哥”党支部进社区开展志愿服务活动...
- mysql中有没有单行函数_MySQL之函数(单行函数、分组函数)
- 【BZOJ4262】Sum 单调栈+线段树
- HTML表单input里面的value的作用
- octave深度学习_【深度学习笔记】(一)Octave
- netdev_priv
- 03JavaScript程序设计修炼之道_2019-06-18_21-27-56_事件onchange
- HTML 标签的 enctype 属性
- mysql_query is deprecated_Function mysql_db_query() is deprecated 错误解决
- zepto.js学习
- Log:日志选型调研『一』
- C语言—俄罗斯方块(新手向)
- html 抽签分小组代码,javascript随机抽签程序
- thinkphp全开源社区团购接龙群接龙
- 【转】学习巴菲特投资思想的经典书籍
- 关于TCP的一些基础知识(1)
- 2009年三季度上市公司报表4
- k-近邻算法实现手写数字识别系统
热门文章
- Android 全局字体设置 例如楷体
- Android中ImageView的scaleType 属性说明。
- tar (child): .tgz\r:无法 open: 没有那个文件或目录
- jenkins安装与配置windows_Windows下Scoop安装、配置与使用
- DFS应用——寻找欧拉回路
- Hibernate关联关系配置(一对多、一对一和多对多)
- php cdi_通过MicroProfile上下文传播增强了CDI上下文和隔板
- java jigsaw_Java 9,Jigsaw,JPMS和模块:个人探索
- 魔术笔反选_魔术二传手反图案
- java 性能调优_Java性能调优调查结果(第四部分)