文章目录
  1. 1. spring3.0发送电子邮件(velocity模板,带附件,群发,解决乱码
    1. 1.0.1. 您好 $!{userName}, 欢迎您加入编程爱好者俱乐部!

spring3.0发送电子邮件(velocity模板,带附件,群发,解决乱码

spring3.0发送电子邮件(velocity模板,带附件,群发,解决乱码

\

\

在这个例子中,将与发送方相关的配置信息放在了一个email.properties文件中,spring容器启动的时候会从这个属性文件中读取发送方的配置信息,这样配置的主要原因在于,发送方一般都是固定不变的。

我将发送的内容放在一个velocity模板文件中,这个文件很像jsp文件,您可以从http://airport.iteye.com/blog/23634中获取更多的关于velocity使用方法相关的信息。(实际上velocity是Apache提供的一种模板语言)。我希望邮件接收方能够接收一个动态的网页,而不是一个简单的文本。

另外,程序提供了发送附件的部分,和群发的功能,只不过群发功能并不完善,因为群发过程中无法将模板变量替换成用户相关变量值,这是个缺陷,楼主也没想明白如何实现。  

下面将代码贴出,希望对大家有帮助:

先是email.properties文件:

view plain

email.host=smtp.163.com   

email.username=woshiguanxinquan   

email.password=*********   

mail.smtp.auth=true   

  

模板文件:

  

view plain

Wecome.vm   

    

  

  

您好 $!{userName}, 欢迎您加入编程爱好者俱乐部!

  

    

  

     您的email地址是$!{emailAddress}.   

   本条信息是系统自动发送,请勿回复!   

  

  

    

  

  

简单解释一下,很明显这是个html文件,注意$!{userName}实际上是一个变量,在程序运行的时候,由model(一个hashmap类型的变量)传入的值会将其替换,(model的key就是变量的名字,这里是userName,而value就是要替换的值),!表示如果没有替换的值,此处为空。更多详细信息请参考:http://airport.iteye.com/blog/23634

下面是spring的配置文件:

ThirdVelocityEmailConfig.xml   

view plain

  

     xmlns:security=”http://www.springframework.org/schema/security“   

     xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“   

     xmlns:flex=”http://www.springframework.org/schema/flex“   

     xmlns:context=”http://www.springframework.org/schema/context“   

     xsi:schemaLocation=”   

    

       

       

       

      

      

       

         

             

           resource.loader=class   

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

             

         

       

          

  

  

\

这个大家都熟悉,不多解释,开始的时候加载了email.properties文件,我们上面给出了,然后创建了velocityEngine的bean。

下面是spring的配置类:

view plain

package com.guan.chapter19.email;   

    

import java.util.Properties;   

    

import org.springframework.beans.factory.annotation.Value;   

import org.springframework.context.annotation.Bean;   

import org.springframework.context.annotation.Configuration;   

import org.springframework.mail.javamail.JavaMailSender;   

import org.springframework.mail.javamail.JavaMailSenderImpl;   

    

Configuration   

public class ThirdVelocityEmailAppConfig {   

    

     //从配置文件中读取相应的邮件配置属性   

     private Value(“${email.host}”) String emailHost;   

     private Value(“${email.username}”) String userName;   

     private Value(“${email.password}”) String password;   

     private Value(“${mail.smtp.auth}”) String mailAuth;   

     //JavaMailSender用来发送邮件的类   

     public Bean JavaMailSender   mailSender(){   

        JavaMailSenderImpl ms = new JavaMailSenderImpl();   

        ms.setHost(emailHost);   

        ms.setUsername(userName);   

        ms.setPassword(password);   

        Properties pp = new Properties();   

        pp.setProperty(“mail.smtp.auth”, mailAuth);   

        ms.setJavaMailProperties(pp);   

        return ms;       

     }     

}   

  

对于spring是否应该由类来配置,我并不关心,一般情况下,我更倾向于annotation这种形式,因为看起来比xml舒服点,但是annotation不能完全取代xml配置方式(至少现在是这样的),当然您完全可以使用xml进行bean的配置,效果是一样的。在这个配置类中,将从email.properties中读取的值赋值给了JavaMailSenderImpl,这个对象是java邮件发送的主要类,使用其send方法可以将预先准备好的消息发送出去。  

下面给出发送服务的源码

view plain

package com.guan.chapter19.email;   

    

import java.io.File;   

import java.util.Map;   

    

import javax.mail.internet.MimeMessage;   

    

import org.apache.velocity.app.VelocityEngine;   

import org.springframework.beans.factory.annotation.Autowired;   

import org.springframework.core.io.FileSystemResource;   

import org.springframework.mail.javamail.JavaMailSender;   

import org.springframework.mail.javamail.MimeMessageHelper;   

import org.springframework.mail.javamail.MimeMessagePreparator;   

import org.springframework.stereotype.Component;   

import org.springframework.ui.velocity.VelocityEngineUtils;   

    

Component   

public class ThirdVelocityEmailService {   

    

     private JavaMailSender   mailSender;   

     private VelocityEngine velocityEngine;   

      

     Autowired   

     public void setMailSender(JavaMailSender   mailSender)   

     {   

        this.mailSender = mailSender;   

     }   

      

     Autowired   

      

     public void setVelocityEngine(VelocityEngine velocityEngine)   

     {   

        this.velocityEngine = velocityEngine;   

     }   

      

     public void sendEmail(final Map model,final String subject,final
String vmfile,final String[] mailTo,final String [] files)   

     {     

        MimeMessagePreparator preparator = new MimeMessagePreparator() {   

            //注意MimeMessagePreparator接口只有这一个回调函数   

          public void prepare(MimeMessage mimeMessage) throws Exception   

          {   

             MimeMessageHelper message = new
MimeMessageHelper(mimeMessage,true,”GBK”);   

            
//这是一个生成Mime邮件简单工具,如果不使用GBK这个,中文会出现乱码   

             //如果您使用的都是英文,那么可以使用MimeMessageHelper
message = new MimeMessageHelper(mimeMessage);   

             message.setTo(mailTo);//设置接收方的email地址   

             message.setSubject(subject);//设置邮件主题   

            
message.setFrom(“woshiguanxinquan 163.com”);//设置发送方地址   

              String text = VelocityEngineUtils.mergeTemplateIntoString(   

                velocityEngine, vmfile,”GBK”, model);   

              //从模板中加载要发送的内容,vmfile就是模板文件的名字   

              //注意模板中有中文要加GBK,model中存放的是要替换模板中字段的值   

             message.setText(text, true);   

            
//将发送的内容赋值给MimeMessageHelper,后面的true表示内容解析成html   

             //如果您不想解析文本内容,可以使用false或者不添加这项   

             FileSystemResource file;   

             for(String s:files)//添加附件   

             {   

                file = new FileSystemResource(new File(s));//读取附件   

                message.addAttachment(s, file);//向email中添加附件   

             }   

           }   

       };   

    

        mailSender.send(preparator);//发送邮件   

     }   

      

}   

  

主要是mailSend这个方法,在这个方法里先创建了一个消息,然后调用mailSender将消息发送出去。  

最后给出测试程序:

view plain

package com.guan.chapter19.email;   

    

import java.util.HashMap;   

import java.util.Map;   

    

import org.junit.Test;   

import org.springframework.context.ApplicationContext;   

import
org.springframework.context.support.ClassPathXmlApplicationContext;   

    

public class ThirdVelocityEmailTest {   

    

     Test   

     public void sendEmail()   

     {   

        ApplicationContext context =   

            new
ClassPathXmlApplicationContext(“com/guan/chapter19/email/ThirdVelocityEmailConfig.xml”);   

        ThirdVelocityEmailService tves =
context.getBean(ThirdVelocityEmailService.class);   

        Map model = new HashMap();   

        model.put(“userName”,”大关”);   

        model.put(“emailAddress”, “woshidaguan 126.com”);   

        tves.sendEmail(model,”欢迎您的加入”,”com/guan/chapter19/email/welcome.vm”,new
String[]{“woshiguanxinquan 163.com”},new
String[]{“F:/Sunset.png”,”F:/spring-hibernate.rar”});   

        //参数说明:替换velocity模板的变量和值对,邮件主题,velocity模板文件的路径,接收方email地址,附件   

        //简单说明,如果您要群发,可以在接收方email地址中多传入几个email地址,附件可以一次发送多个   

     }   

}   

  

  

这个程序对一个email来说功能已经很全面了,您可以对其更改然后应用于您的程序中。

  

再次简单说明一下,主机的信息配置在mail.properties文件中,发送的内容写在velocity模板文件中,在执行的时候将相应的字段进行替换。使用了MimeMessagePreparator进行复杂邮件的发送,MimeMessageHelper帮助简化邮件信息过程。解决了中文乱码问题。

文章目录
  1. 1. spring3.0发送电子邮件(velocity模板,带附件,群发,解决乱码
    1. 1.0.1. 您好 $!{userName}, 欢迎您加入编程爱好者俱乐部!