Spring的E-mail支持在实际开发中的应用

1.使用系统指定的邮件模板

使用Velocity的VTL编写模板如下:

Hello,${userName}

邮件模板内容可以vm模板文件形式保存,也可以存入数据库中。暂且将其存入hello.vm文件,并将该文件放在Classpath的根路径下

ITemplateMailAgent抽象接口定义

public interface ITemplateMailAgent{

       //convenient sending method with only recipient.TO

       void sendMail(String receiver,String subject,String templateKey,Map<String,Object>context);

       //central method to send E-mail with template support

       //@param receivers Recipients as a Parameter wrapper object

       //@param templateKey the identity of the template to use

       //@param context contains data that will be merged into template

       void sendMai(Recipients receivers,String subject,String templateKey,Map<String,Object>context);

}

ITemplateMailAgent的抽象允许我们提供基于不同模板技术的实现类,我们使用Velocity

针对Velocity的ITemplateMailAgent实现类定义代码

public class VelocityTemplateMailAgent implements ITemplateMailAgent{

        private final String DEFAULT_SENDER = sender@xxx.com.cn;

        private final String DEFAULT_ENCODING = "UTF-8";

        private String mailFrom = DEFAULT_SENDER;

        private String mailEncoding = DEFAULT_ENCODING;

        private JavaMailSender javaMailSender;

        private VelocityEngine velocityEngine;

        public void sendMail(String receiver,String subject,String templateKey,

          Map<String,Object>context){

                Recipients recipients = new Recipients(receiver);

                sendMail(recipients,subject,templateKey,context);

        }       

        public void sendMail(final Recipients receivers,final String subject,String templateKey,

          Map<String,Object>context){

                 validateRecipients(receivers);

                 Validate.notEmpty(templateKey);

                 StringWriter writer = new StringWriter();

                 VelocityEngineUtils.mergeTemplate(velocityEngine,templateKey,getMailEncoding(),context,writer);

                 final String mailText = writer.toString();  //mail content is ready

                 getJavaMailSender().send(new MmeMessagePreparator(){

                        public void prepare(MimeMessage message)throws Exception{

                            MimeMessageHelper helper = new MimeMessageHelper(message,getMailEncoding());

                            helper.setFrom(getMailFrom());

                            helper.setTo(receivers.getTo());

                            if(!CollectionUtils.isEmpty(receivers.getCcList())){

                                 helper.setCc(receivers.getCc());

                            }

                            if(!CollectionUtils.isEnpty(receivers.getBccList())){

                                 helper.setBcc(receivers.getBcc());

                                 helper.setSubject(subject);

                                 helper.setText(mailText);

                            }

                        }

                 });

        }

        private void validateRecipients(Recipients receivers){

                 //...

        }

         //用于依赖注入的getter和setter方法定义

}

VelocityTemplateMailAgent的实现逻辑依赖于两个主要组件:模板引擎VelocityEngine,JavaMailSender

 

VelocityTemplateMailAgent及其相关实现类使用配置示例

<bean id="cpLoaderVelocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">

      <property name="configLocation" value="classpath:cn/spring21/conf/velocity-config.properties" />

</bean>

<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">

       <property name="host" value="..." />

       <property name="username" value="..." />

       <property name="password" value="..." />

       <property name="javaMailProperties">

              <props>

                     <prop key="mail.smtp.auth">true</prop>

              </props>

       </property>

</bean>

<bean id="templateEmailAgent" class="com.xxx.mail.template.VelocityTemplateMailAgent">

        <property name="javaMailSender" ref="javaMailSender" />

        <property name="velocityEngine" ref="cpLoaderVelocityEngine" />

</bean>

 

#velocity-config.properties

resource.loader=classpath

classpath.resource.loader.description=Classpath Resource Loader

classpath.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

velocimacro.library=

 

通过如下方式发送最初模板所设定的邮件内容

VelocityTemplateMailAgent mailAgent = ... //通过IoC容器注入或查找相应实例

Map<String,Object>context = new HashMap<String,Object>();

context.put("userName","Allen");

mailAgent.sendMail(test@gmail.com,"邮件标题","hello.vm",context);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值