Spring之Email<封装了常用的四种发送Email的方法(TEXT,HTML,IMG,FILE)>

参考资料
1 Spring邮件发送(可带附件,模板,群发,异步发送等功能)
http://linqincai.iteye.com/blog/508797
2 Spring mail 使用多个账号发送带有附件的HTML邮件
http://wisdombrave.iteye.com/blog/546508
3 spring各种邮件发送
http://blog.csdn.net/lenolong/article/details/3970110
4 spring来发EMAIL
http://www.cnblogs.com/jackyrong/archive/2006/08/17/479812.html
5 使用spring发送邮件例
http://www.blogjava.net/amigoxie/archive/2007/04/28/114310.html
6 Spring Mail中文乱码问题
http://blog.csdn.net/matrixjava/article/details/3237772
7 国内常用邮箱客户端POP3和SMTP服务器大全
http://www.hiapk.com/thread-7912-1-1.html

写在前面的话
网上很多文章都是针对配置文件来说的,本文是对spring各种邮件发送这篇文章作了封装,使用spring发送Email更加方便
网易和其它很多公司现在都没有对外开放POP3/SMTP服务,可能你会碰到这样的错误:
org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException
我测试时是用的是:新浪的邮箱:smtp.sina.com也是可以的
如下设置:

Exception: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection
参考文章:http://zhidao.baidu.com/question/227409027.html
解答: 配置JavaMail的Properties时,不要指定mail.smtp.socketFactory.class,因为TLS使用的是普通的Socket。 然后指定属性mail.smtp.starttls.enable为true.

介绍
Spring邮件抽象层的主要包为org.springframework.mail。它包括了发送电子邮件的主要接口MailSender,和值对象SimpleMailMessage,
它封装了简单邮件的属性如from, to,cc, subject,text。 包里还包含一棵以MailException为根的checked Exception继承树,
它们提供了对底层邮件系统异常的高级别抽象.为了使用JavaMail中的一些特色, 比如MIME类型的信件, Spring提供了MailSender的一个子接口,
即org.springframework.mail.javamail.JavaMailSender。Spring还提供了一个回调接口org.springframework.mail.javamail.MimeMessagePreparator,
用于准备JavaMail的MIME信件.

工程环境:XP+Myeclipse6.5+JDK1.6

一 实现功能
1 封装了常用的四种发送Email的方法(文本,html,img,file),用户只要调用一个工厂类传递相应的邮件的属性如from, to,cc, subject,text,或者是消息对象
2 解决了发送邮件附件中的中文筹码问题,参见了Spring Mail中文乱码问题
3 支持链式风格
4 可以混合发送多种消息(text,html,img,file)

二 工程图片

或者你也可以这样,使用打包好的jar:email.spring.util.jar
,见附件
三 调用说明
1 发送文本消息

//默认空构造为发送文本类型  
    MailMessageFactory mms = new MailMessageFactory();  
    mms.setSubject("使用spring email 测试发送文本消息")  
    .setText("正文消息了。。。。")  
    .send();          

2 发送Html格式消息

MailMessageFactory mms = new MailMessageFactory(SendMailType.HTML);  
        mms.setSubject("使用spring email 测试发送Html中文邮件")  
        .setText("<html><head><meta http-equiv='content-type' content='text/html; charset=GBK'>" +  
                "</head><body><h1>这里是咫尺天涯发送的邮件</h1></body></html>").send();  

3 发送含有图片的消息

MailMessageFactory mms = new MailMessageFactory(SendMailType.HTML);               
         String text = "<html><body>欢迎访问咫尺天涯博客<br>"  
                + "<a href='http://liuzidong.iteye.com/' target='_blank'>"  
                + "<img src='cid:belle'></a><br><img src='cid:belle2'></body></html>";    
         //附件要嵌入到HTML中显示,则在IMG标签中用"cid:XXX"标记。                 
        mms.setSubject("使用spring email 测试邮件中嵌套图片");   
        mms.setText(text);  
        File file = new File("c:\\5.jpg");            
        mms.setImgFile("belle", file);        
        File file2 = new File("c:\\4.jpg");  
        mms.setImgFile("belle2", file2);      
        mms.send();  

4 发送含有附件的消息

MailMessageFactory mms = new MailMessageFactory(SendMailType.HTML);  
        mms.setSubject("使用spring email 测试发送附件");  
        File file = new File("c:\\1.zip");  
        mms.setAttachmentFile("jquery学习记录", file).send();  

5 综合发送(文本,html,img,file)消息

MailMessageFactory mms = new MailMessageFactory(SendMailType.HTML);  
        mms.setSubject("使用spring email 测试发送邮件<包含html,img,file>等格式");        
        mms.setText("这是我的文本格式");  
        mms.setText("<html><head><h1>这里是咫尺天涯发送的邮件</h1></head><body>" +  
                "<h1><a href='http://liuzidong.iteye.com/' target='_blank'></h1><br>" +  
                "<img src='cid:belle'></a><br><img src='cid:belle2'>"+  
                "</body></html>");  
         //附件要嵌入到HTML中显示,则在IMG标签中用"cid:XXX"标记。   
        File file = new File("c:\\5.jpg");  
        mms.setImgFile("belle", file);        
        File file2 = new File("c:\\4.jpg");  
        mms.setImgFile("belle2", file2);          
        File file3 = new File("c:\\1.zip");  
        mms.setAttachmentFile("附件1", file3);          
        File file4 = new File("c:\\jquery学习记录.txt");  
        mms.setAttachmentFile("jquery学习记录", file4);       
        mms.send();  

四 代码如下
1 消息发送类:MailMessageFactory

package net.liuzd.email.spring;  

import java.io.File;  
import java.io.UnsupportedEncodingException;  
import java.util.List;  

import javax.mail.MessagingException;  
import javax.mail.internet.MimeMessage;  
import javax.mail.internet.MimeUtility;  

import net.liuzd.email.EmailEntity;  
import net.liuzd.email.MailType;  
import net.liuzd.email.SendMailType;  
import net.liuzd.email.SendMessage;  

import org.springframework.core.io.FileSystemResource;  
import org.springframework.mail.SimpleMailMessage;  
import org.springframework.mail.javamail.JavaMailSenderImpl;  
import org.springframework.mail.javamail.MimeMessageHelper;  

/** 
 * Title: 消息发送类  
 * Description: Copyright: Copyright (c) 2011 
 * Company:http://liuzidong.iteye.com/ Makedate:2011-7-4 上午10:11:08 
 * @author liuzidong 
 * @version 1.0 
 * @since 1.0 
 *  
 */  
public class MailMessageFactory {  

    private SimpleMailMessage simpleMailMessage;  
    private MimeMessageHelper mimeMessageHelper;  
    private JavaMailSenderImpl senderImpl;  
    private MimeMessage mimeMessage;  
    private SendMailType sendMailType;    
    private SendMessage sendMessage;      
    private static final String ENCODING = EmailEntity.EMAIL_ENCODING;  


    /** 
     * 默认为发送文本类型 
     * */  
    public MailMessageFactory() {  
        this(SendMailType.TEXT);  
    }  

    /** 
     * 请显示指明文件类型为:TEXT,HTML,默认为文本类型 
     *  
     * */  
    public MailMessageFactory(SendMailType sendMailType){  

        this.sendMailType = sendMailType;  
        this.senderImpl = JavaMailFactory.getJavaMail();  
        this.mimeMessage = senderImpl.createMimeMessage();                
        sendMessage = new SendMessage();      

        try {  
            switch (this.sendMailType) {  
            case TEXT:  
                simpleMailMessage = new SimpleMailMessage();  
                break;  
            case HTML:    
                mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, ENCODING);  
            }  
        } catch (Exception e) {  
            e.fillInStackTrace();  
        }  

    }  

    /** 
     * @param to 接收者人地址 
     * @return 
     */  
    public MailMessageFactory setTo(String ... to){       
        sendMessage.setTos(to);       
        return this;  
    }  


    /**发送标题*/  
    public MailMessageFactory setSubject(String subject){  
        sendMessage.setSubject(subject);  
        return this;  
    }  

    /**发送内容*/  
    public MailMessageFactory setText(String text){  
        sendMessage.addText(text);  
        return this;  
    }  



    /** 
     * 加入图片文件 
     * @param imageName  图片名称 
     * @param file   图片源 
     * @return 
     */  
    public MailMessageFactory setImgFile(String imageName,File file){     
        try {  
            sendMessage.addFile(MailType.IMG,MimeUtility.encodeWord(imageName), file);                    
        } catch (UnsupportedEncodingException e) {            
            e.printStackTrace();  
        }         
        return this;  
    }  


    /** 
     * 加入图片文件 
     * @param imageName  图片名称 
     * @param filePath   图片路径 
     * @return 
     */  
    public MailMessageFactory setImgFile(String imageName,String filePath){           
        setImgFile(imageName, new File(filePath));        
        return this;  
    }  

    /** 
     * 加入附件 
     * @param fileName  附件名称 
     * @param file      附件路径 
     * @return 
     */  
    public MailMessageFactory setAttachmentFile(String fileName,String filePath){     
        setAttachmentFile(fileName, new File(filePath));          
        return this;  
    }  


    /** 
     * 加入附件 
     * @param fileName  附件名称 
     * @param file      附件源  
     * @return 
     */  
    public MailMessageFactory setAttachmentFile(String fileName,File file){           
        try {  
            sendMessage.addFile(MailType.FILE,MimeUtility.encodeWord(fileName),file);                     
        } catch (UnsupportedEncodingException e) {            
            e.printStackTrace();  
        }     
        return this;  
    }  



    /**发送消息,你调用此方法进行Email消息的发送*/  
    public void send(){   

        //消息发送前,检查发送人地址,接收人地址是否为空,为空就设置为配置文件中的地址          
        sendMessage.setForm(EmailEntity.EMAIL_FROM);  

        //检查接收人地址是否为空  
        String [] tos = sendMessage.getTos();  
        if(null == tos || tos.length == 0){  
            tos = new String[]{EmailEntity.EMAIL_TO};  
            sendMessage.setTos(tos);  
        }                 

        long startTime = System.currentTimeMillis();  
        //发送普通文本  
        if(sendMailType == SendMailType.TEXT){  
            sendTextMessage();  
        }else{            
            sendHtmlImgFileMessage();  
        }         
        long endTime = System.currentTimeMillis();  
        System.out.println(sendMailType + "成功!,耗费时间: " + (endTime - startTime)+"毫秒!");  
    }         

    /** 
     * 发送html,图片,附件的消息 
     */  
    private void sendHtmlImgFileMessage() {  

        try {             
            mimeMessageHelper.setTo(sendMessage.getTos());  
            mimeMessageHelper.setFrom(sendMessage.getForm());  
            String subject = sendMessage.getSubject();  
            if(null != subject && !"".equals(subject)){  
                mimeMessageHelper.setSubject(subject);  
            }  
            String text = sendMessage.getSendTexts();  
            if(null != text && !"".equals(text)){  
                mimeMessageHelper.setText(text,true);  
            }             

            //检查图片或者文件集合是否为空  
            int imgSize = sendMessage.getImages().size();     

            if(imgSize > 0){  

                    List<SendMessage> lists = sendMessage.getImages();  
                    FileSystemResource fsr = null;  
                    String imgName = null;  
                    for(SendMessage entity : lists){  
                        fsr = new FileSystemResource(entity.getFile());  
                        imgName = entity.getImgName();  
                        //如果为图片类型就调用addInline,否则就调用:addAttachment方法^_^  
                        if(entity.getMailType() == MailType.IMG)  
                            mimeMessageHelper.addInline(imgName, fsr);  
                        else   
                            mimeMessageHelper.addAttachment(imgName, fsr);                                

                    }  
                    fsr = null;               

            }     

        } catch (MessagingException e) {                  
            e.printStackTrace();  
        }  
        senderImpl.send(mimeMessage);  
    }  

    /** 
     * 发送文本消息 
     */  
    private void sendTextMessage() {  
        simpleMailMessage.setTo(sendMessage.getTos());    
        simpleMailMessage.setFrom(sendMessage.getForm());  
        String subject = sendMessage.getSubject();  
        if(null != subject && !"".equals(subject)){  
            simpleMailMessage.setSubject(subject);  
        }         
        String text = sendMessage.getSendTexts();  
        if(null != text && !"".equals(text)){  
            simpleMailMessage.setText(text);  
        }     
        senderImpl.send(simpleMailMessage);  
    }  


    /**  
     * @param subject       发送标题  
     * @param text          发送内容         
     * @param to            接收人地址 
     */  
    public void send(String subject,String text,String ... to){       
        sendMessage(subject, text, to);               
    }  



    private void sendMessage(String subject, String text, String... to) {  
        setTo(to);  
        setSubject(subject);  
        setText(text);  
    }  



    public SendMessage getSendMessage() {  
        return sendMessage;  
    }  

    /*** 
     * 接收一个消息对象 
     * */  
    public MailMessageFactory setSendMessage(SendMessage sendMessage) {  
        this.sendMessage = sendMessage;       
        return this;  
    }  
}  

2 邮件发送类型:SendMailType

package net.liuzd.email;  
/**    
 *Title:     邮件发送类型 
 *Description:      
 *Copyright: Copyright (c) 2011    
 *Company:http://liuzidong.iteye.com/     
 *Makedate:2011-7-4 上午09:59:08    
 * @author liuzidong    
 * @version 1.0    
 * @since 1.0     
 *    
 */  
public enum SendMailType {  
    /** 
     * 文本类型 
     * */  
    TEXT,  
    /** 
     * HTML类型,包含图片与附件内容 
     * **/  
    HTML;  


    @Override  
    public String toString() {  
        String message = null;  
        switch (this) {  
        case TEXT:  
            message = "发送文本消息";  
            break;  
        case HTML :  
            message = "发送html消息";     
            break;  
        }  
        return message;  
    }  
}  

3 读取配置文件类:ReadConfigEmail

public class ReadConfigEmail {  

    private static Properties mailProps = new Properties();  
    private static final String EMAILPROPERTIES = "mail.properties";  

    static {  
        try {  
            InputStream inStream = ReadConfigEmail.class.getClassLoader()  
                    .getResourceAsStream(EMAILPROPERTIES);  
            mailProps.load(inStream);  
        } catch (Exception ex) {  
            throw new RuntimeException("读取配置文件出错了..." + ex.getMessage(), ex);  
        }  
    }  

    public static Properties getProperty() {  
        return mailProps;  
    }  

    public static String getPropertyByKey(String key) {  
        return mailProps.getProperty(key);  
    }  

}  

4 消息对象:SendMessage

public class SendMessage {  

    private String [] tos;  
    private String subject;  

    private String imgName;  
    private File file;  
    private MailType mailType;   

    private String form;  

    private List<String> texts = new ArrayList<String>();  

    //图片集合  
    private List<SendMessage> images = new ArrayList<SendMessage>();  

    public MailType getMailType() {  
        return mailType;  
    }  


    public void setMailType(MailType mailType) {  
        this.mailType = mailType;  
    }  


    public void addFile(MailType mailType,String imgName,File file){  
        images.add(new SendMessage(mailType,imgName,file));  
    }  

    public void addText(String text){  
        texts.add(text);  
    }  


    public SendMessage(MailType mailType,String imgName, File file) {  
        super();  
        this.mailType =  mailType;  
        this.imgName = imgName;  
        this.file = file;  
    }  



    public List<SendMessage> getImages() {  
        return images;  
    }  
    public void setImages(List<SendMessage> images) {  
        this.images = images;  
    }  
    public String getForm() {  
        return form;  
    }  
    public void setForm(String form) {  
        this.form = form;  
    }  
    public String getImgName() {  
        return imgName;  
    }  
    public void setImgName(String imgName) {  
        this.imgName = imgName;  
    }  

    public String[] getTos() {  
        return tos;  
    }  
    public void setTos(String[] tos) {  
        this.tos = tos;  
    }  
    public String getSubject() {  
        return subject;  
    }  
    public void setSubject(String subject) {          
        this.subject = subject;  
    }  

    public SendMessage() {  

    }  
    public SendMessage(String[] tos, String subject, String text) {  
        super();  
        this.tos = tos;  
        this.subject = subject;  
        addText(text);  
    }  

    public String getSendTexts(){  
        StringBuilder sbr = new StringBuilder();  
        List<String> texts = getTexts();  
        for(String text : texts){  
            sbr.append(text);  
        }  
        return sbr.toString();  
    }  

    @Override  
    public String toString() {  
        StringBuilder sbrTos = new StringBuilder();  
        for(String to : tos){  
            sbrTos.append(to).append(",");  
        }  
        String sbrText = sbrTos.substring(0,sbrTos.length()-1);  
        return new StringBuilder()  
        .append("接收人地址: ").append(sbrText)  
        .append(",发送人地址: ").append(form)  
        .append(",发送标题: ").append(subject)  
        .append(",发送内容: ").append(getSendTexts())  
        .toString();  
    }  
    public File getFile() {  
        return file;  
    }  
    public void setFile(File file) {  
        this.file = file;  
    }  


    public List<String> getTexts() {  
        return texts;  
    }  


    public void setTexts(List<String> texts) {  
        this.texts = texts;  
    }  

}  

5 邮件发送服务器:JavaMailFactory

public class JavaMailFactory {  

    /*** 
     * 此处也可修改为 
     * private JavaMailSenderImpl javaMailSenderImpl; 
     * ... 省略set,get,方便使用spring注入 
     * */  

    private static JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();  

    static{  
        senderImpl.setHost(EmailEntity.EMAIL_HOST);  
        senderImpl.setUsername(EmailEntity.EMAIL_USERNAME);   
        senderImpl.setPassword(EmailEntity.EMAIL_PASSWORD);           
        senderImpl.setJavaMailProperties(EmailEntity.safetyProperties);  
    }  

    public static JavaMailSenderImpl getJavaMail(){   
        return senderImpl;  
    }  
}  

6 Email实体:EmailEntity

public class EmailEntity {  

    /**邮件服务器*/  
    private static final String EMAIL_HOST_KEY = "mail.host";  
    public static final String EMAIL_HOST = ReadConfigEmail.getPropertyByKey(EMAIL_HOST_KEY);  

    /**用户名*/  
    private static final String EMAIL_USERNAME_KEY = "mail.username";  
    public static final String EMAIL_USERNAME = ReadConfigEmail.getPropertyByKey(EMAIL_USERNAME_KEY);  

    /**用户密码*/  
    private static final String EMAIL_PASSWORD_KEY = "mail.password";  
    public static final String EMAIL_PASSWORD = ReadConfigEmail.getPropertyByKey(EMAIL_PASSWORD_KEY);     

    /**接收人*/  
    private static final String EMAIL_TO_KEY = "mail.to";  
    public static final String EMAIL_TO = ReadConfigEmail.getPropertyByKey(EMAIL_TO_KEY);  

    /**发送人*/  
    private static final String EMAIL_FROM_KEY = "mail.from";  
    public static final String EMAIL_FROM = ReadConfigEmail.getPropertyByKey(EMAIL_FROM_KEY);     

    /**服务器进行认证,认证用户名和密码是否正确*/  
    private static final String EMAIL_SMTP_AUTH_KEY = "mail.smtp.auth";  
    public static final String EMAIL_SMTP_AUTH = ReadConfigEmail.getPropertyByKey(EMAIL_SMTP_AUTH_KEY);  

    /**超时时间设定*/  
    private static final String EMAIL_SMTP_TIMEOUT_KEY = "mail.smtp.timeout";  
    public static final String EMAIL_SMTP_TIMEOUT = ReadConfigEmail.getPropertyByKey(EMAIL_SMTP_TIMEOUT_KEY);  


    /**编码设置*/  
    private static final String EMAIL_ENCODING_KEY = "mail.encoding";  
    public static final String EMAIL_ENCODING = ReadConfigEmail.getPropertyByKey(EMAIL_ENCODING_KEY);  

    private static final String EMAIL_SMTP_STARTTLS_KEY = "mail.smtp.starttls.enable";  
    public static final String EMAIL_SMTP_STARTTLS = ReadConfigEmail.getPropertyByKey(EMAIL_SMTP_STARTTLS_KEY);  

    //private static final String EMAIL_SMTP_SOCKETFACTORY_CLASS_KEY = "mail.smtp.socketFactory.class";  
    //public static final String EMAIL_SMTP_SOCKETFACTORY_CLASS = ReadConfigEmail.getPropertyByKey(EMAIL_SMTP_SOCKETFACTORY_CLASS_KEY);  


    /**安全认证设置*/  
    public static Properties safetyProperties = new Properties();  

    static{  
        //调试信息,可以取消  
        //System.setProperty( "javax.net.debug", "ssl");          
        /** 
         * #配置JavaMail的Properties时,不要指定“mail.smtp.socketFactory.class”, 
           #因为TLS使用的是普通的Socket。然后指定属性“mail.smtp.starttls.enable”为“true”。 
         * */         
        safetyProperties.put(EMAIL_SMTP_AUTH_KEY, EMAIL_SMTP_AUTH);   
        safetyProperties.put(EMAIL_SMTP_TIMEOUT_KEY, EMAIL_SMTP_TIMEOUT);   
        safetyProperties.put(EMAIL_SMTP_STARTTLS_KEY, EMAIL_SMTP_STARTTLS);   
        //safetyProperties.put(EMAIL_SMTP_SOCKETFACTORY_CLASS_KEY, EMAIL_SMTP_SOCKETFACTORY_CLASS);  
    }     

}  

7 MailType.java

public enum MailType {    
    /** 
     * 图片类型 
     * */  
    IMG,  
    /** 
     * 文件类型 
     * */  
    FILE;  

    @Override  
    public String toString() {  
        String message = null;  
        switch (this) {       
        case IMG :  
            message = ",包含图片";  
        default:  
            message = ",包含附件";  
            break;  
        }  
        return message;  
    }  
}  

8 mail.properties

#新浪邮件服务器  
mail.host=smtp.sina.com  
mail.smtp.auth=true  
mail.smtp.timeout=25000  
mail.encoding=utf-8  
mail.smtp.starttls.enable=true;   
#mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory  
#Email地址  
mail.username=XXX  
#Email密码   
mail.password=XXX  
#发送人地址  
mail.from=XXX@sina.com  
#收件人地址  
mail.to=XXX@163.com  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值