如何使用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配置

网页

  1. Spring电子邮件集成
  2. Apache Velocity项目

翻译自: https://www.javacodegeeks.com/2014/07/how-to-compose-html-emails-in-java-with-spring-and-velocity.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

console.log打印没有效果

今天用谷歌调试的时候&#xff0c;遇到了一个很奇怪的现象&#xff0c;console.log() 完全不出效果&#xff0c;把它放到script下的第一行也没有用。然后借鉴了几个博主的。 直接改 https://blog.csdn.net/wujy_rrycbar2016/article/details/78341973 打开控制台 -> 改为 D…

WINCE知识点滴

1.CE下同名设备不能大于10 CE5.0中已经没有这个问题了&#xff0c;以前的版本可以这样做&#xff1a;只给上层输出一个设备&#xff0c;然后用一个IOCTL去打开一个个的物理设备这样就可以做到不受任何限制了 2.MDD与PDD 一个驱动程序通常会被分成硬件相关&#xff08;PDD&#…

English Words and Expressions

Words apprentice 学徒 corny 老套的 obnoxious 作呕的 intermezzo 间奏曲 predate 日期上早于 parenthesis 括号 delimiter 分隔符 utopian 乌托邦 overhyped 过头的 hype 夸张宣传 nascent 新生的 ramifications 分支、结果 intractable 难处理的 empirically 经验上的 shrou…

CSS实战2

1. 鼠标样式 Cursor: pointer 鼠标变成小手 Cursor: default; 小白 Cursor : move; 移动 Cursor : text ; 文本输入 网页布局&#xff1a; 给一个盒子 &#xff1a; 宽度高度 背景 边框 位置 2.border-radius 圆角矩形 border-radius: 7px 7px 7p…

Linux Shell 常用命令与目录分区的学习总结

很早就想根据自己的学习规律和遗忘规律&#xff0c;自己总结一下Linux/Unix系统的Shell命令&#xff0c;一来便于自己时常查询之用&#xff0c;二来也分享于各位博友 Linux shell是系统的用户界面&#xff0c;即命令行。它提供了用户与内核进行交互式操作与控制的接口&#xff…

为数据访问代码编写测试–不测试框架

当我们向数据访问代码编写测试时&#xff0c;是否应该测试其公共API的每种方法&#xff1f; 一开始听起来很自然。 毕竟&#xff0c;如果我们不对所有内容进行测试&#xff0c;那么如何知道我们的代码可以按预期工作呢&#xff1f; 这个问题为我们提供了重要的线索&#xff1…

visual studio 应用场景

转载于:https://www.cnblogs.com/zhangbing12304/p/10894347.html

elementUI-添加自定义图标

elementui的小图标有限&#xff0c;跟UI给的不一样&#xff0c;这个时候咋办呢&#xff1f;百度走起。。。。参考了两篇博主分享的 自定义elementui中的图标 和 建立图标库&#xff0c;这里主要用到第一种 实际中&#xff1a; elementUI导航栏 具体代码&#xff1a; //自定…

富文本wangEditor的批量激活

最近项目中使用了wangEditor这个轻量级的富文本框&#xff0c;由于需求是一个页面中会有多个富文本框同时激活&#xff0c;所以写了个批量激活的jquery方法&#xff0c;分享一下 1 // 激活富文本框2 var wangEditorActive function(){3 var wBoxs $(".editorbox&quo…

Flex调用WebService后的数据处理

如果WebService返回的数据为DataTable或List<>类型&#xff0c;可以在每次读取数据的时候加入断点&#xff0c;然后观察最终生成数据的结构&#xff0c;断点最好加在ResultEvent事件内&#xff0c;因为这个时候才能确保从WebService获取到了数据 下面的例子分别接收从Web…

echarts(一)下载引入,调色盘,[标题、图例组件、坐标轴]

一个简单的例子 1. 下载并引入 &#xff08;1&#xff09;npm install echarts --save &#xff08;2&#xff09;import echarts from echarts //main.js引入echarts 或者在组件中按需引入&#xff0c;查看按需引入的详细模块 <script>// 引入 ECharts 主模块var echa…

P3740 [HAOI2014]贴海报 离散化+线段树

题目描述 Bytetown城市要进行市长竞选&#xff0c;所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理&#xff0c;城市委员会为选民准备了一个张贴海报的electoral墙。 张贴规则如下&#xff1a; electoral墙是一个长度为N个单位的长方形&#xff0c;每个单位…

分组,采样和批处理– Java 8中的自定义收集器

在第一篇文章的后续部分&#xff0c;这次我们将编写一些更有用的自定义收集器&#xff1a;用于按给定的标准进行分组&#xff0c;采样输入&#xff0c;批处理和在固定大小的窗口上滑动。 分组&#xff08;计数事件&#xff0c;直方图&#xff09; 假设您有一些项目的集合&…

将G1内的SIM卡联系人导入到GMAIL的联系人中

将G1内的SIM卡联系人导入到GMAIL的联系人中 具体方法是&#xff1a;进入联系人——按下“MENU"键——导入联系人——按下“MENU"键——“全部导入”——“Contact type”下选择“Google"。这样你的SIM联系人就可以导入到你的设备中了&#xff08;联系人后会有“…

Dreamweaver Flash Photoshop网页设计综合应用 (智云科技) [iso] 1.86G​

全书共15章&#xff0c;主要包括网页制作基础、Dreamweaver CC网页制作、Photoshop CC网页图像设计、Flash CC网页动画设计以及综合案例实战5个部分。通过本书的学习&#xff0c;不仅能让读者学会三大软件的基本操作&#xff0c;而且本书中列举的实战案例&#xff0c;还可以让读…

element解决表格错位问题

https://www.jianshu.com/p/de922caf337c https://blog.csdn.net/qq_15385627/article/details/81700731 保留默认参数&#xff1a; https://segmentfault.com/q/1010000017831798/a-1020000017841050 解决element表格错位 /*解决表格错位&#xff0c;必须加在index.html或APP…

margin和text-align实现水平居中的区别

1.首先text-align只应用于内联块和内联元素 text-align影响的是元素中的文本内容的对其方式&#xff08;默认是left&#xff0c;设置为center时水平居中&#xff09; 所以&#xff0c;将text-align设置为center时&#xff0c;只有当应用于块级元素并且元素内容为文本时&#xf…

如何使用示例从Java中的类路径加载资源

Java中的类路径不仅用于加载.class文件&#xff0c;而且还可以用于加载资源&#xff0c;例如属性文件&#xff0c;图像&#xff0c;图标&#xff0c;缩略图或任何二进制内容。 Java提供了API来将这些资源读取为InputStream或URL。 假设您在项目的config文件夹中有一个属性文件 …

Ext 3.0 +ASP.NET2.0 可视化开发介绍

Ext Designer 总算出来了&#xff01;&#xff01;&#xff01;基于Web的应用开发终于可以可视化开发了&#xff0c;而且可以几乎不敲1行代码。 准备工具&#xff1a; &#xff08;1&#xff09;Ext Designer 1.0.2 &#xff08;2&#xff09;Visual Studio 2005 第一步&#x…

收集五款常用的HTML编辑软件

HTML&#xff08;HyperText Mark-up Language&#xff09;即超文本标记语言或超文本链接标示语言&#xff0c;是目前网络上应用最为广泛的语言&#xff0c;也是构成网页文档的主要语言。HTML文本是由HTML命令组成的描述性文本&#xff0c;HTML命令可以说明文字、图形、动画、声…