Spring3.0下使用JavaMailSenderImpl类发送邮件

1、JavaMailSenderImpl类

  Spring的邮件发送的核心是MailSender接口,在Spring3.0中提供了一个实现类JavaMailSenderImpl,这个类是发送邮件的核心类。

可以通过在配置文件中配置使用,当然也可以自己硬编码到代码中。

2、准备工作

  搭建spring环境,此处默认学习者已搭建成功。

  下载JavaMail jar包,导入工程。

  http://www.oracle.com/technetwork/java/javamail/index-138643.html

3、案例代码

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

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

import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.VelocityException;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.velocity.VelocityEngineFactoryBean;
import org.springframework.ui.velocity.VelocityEngineUtils;

public class SpringMailSender {
    // Spring的邮件工具类,实现了MailSender和JavaMailSender接口
    private JavaMailSenderImpl mailSender;

    //使用Velocity模板,需要Velocity的jar包,然后需要声明一个VelocityEngine对象
    private VelocityEngine velocityEngine;

    /**
     * 创建邮件发送器
     */
    public SpringMailSender() {
        // 初始化JavaMailSenderImpl,当然推荐在spring配置文件中配置,这里是为了简单
        mailSender = new JavaMailSenderImpl();
        // 设置参数
        mailSender.setHost("smtp.qq.com");
        mailSender.setUsername("[email protected]");
        mailSender.setPassword("555555");

        //声明一个VelocityEngine对象后,需要在构造函数中初始化(IoC is optional)
        // Velocity的参数,通过VelocityEngineFactoryBean创建VelocityEngine,也是推荐在配置文件中配置的
        Properties props = System.getProperties();
        props.put("resource.loader", "class");
        props.put("class.resource.loader.class",
                        "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        VelocityEngineFactoryBean v = new VelocityEngineFactoryBean();
        v.setVelocityProperties(props);
        try {
            velocityEngine = v.createVelocityEngine();
        } catch (VelocityException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     *
    * 方法名: simpleSend
    * 方法作用: TODO 简单邮件发送
    * 创建人:Jxufe HeHaiYang
    * 创建时间:2015-2-7 下午06:47:30
    * @param @throws Exception
    * 返回值类型: void
    * @throws
     */
    public void simpleSend() throws Exception {
        // 构建简单邮件对象
        //SimpleMailMessages实现了MimeMessageHelper,为普通邮件模板,支持文本。
        SimpleMailMessage smm = new SimpleMailMessage();
        // 设定邮件参数
        smm.setFrom(mailSender.getUsername());
        smm.setTo("[email protected]");
        smm.setSubject("Hello world");
        smm.setText("nice !");
        // 发送邮件
        mailSender.send(smm);
    }

    /**
     *
    * 方法名: attachedSend
    * 方法作用: TODO 带附件的邮件发送
    * 创建人:Jxufe HeHaiYang
    * 创建时间:2015-2-7 下午06:47:22
    * @param @throws MessagingException
    * 返回值类型: void
    * @throws
     */
    public void attachedSend() throws MessagingException {
        //使用JavaMail的MimeMessage,支付更加复杂的邮件格式和内容
        //MimeMessages为复杂邮件模板,支持文本、附件、html、图片等。
        MimeMessage msg = mailSender.createMimeMessage();
        //创建MimeMessageHelper对象,处理MimeMessage的辅助类
        MimeMessageHelper helper = new MimeMessageHelper(msg, true);
        //使用辅助类MimeMessage设定参数
        helper.setFrom(mailSender.getUsername());
        helper.setTo("[email protected]");
        helper.setSubject("Hello Attachment");
        helper.setText("This is a mail with attachment");
        //加载文件资源,作为附件
        //文件地址相对应src目录
        ClassPathResource file = new ClassPathResource("ehcache.xsd");
        //加入附件
        helper.addAttachment("ehcache.xsd", file);

        //发送邮件
        mailSender.send(msg);
    }

    /**
     *
    * 方法名: richContentSend
    * 方法作用: TODO 发送富文本邮件
    * 创建人:Jxufe HeHaiYang
    * 创建时间:2015-2-7 下午06:47:14
    * @param @throws MessagingException
    * 返回值类型: void
    * @throws
     */
    public void richContentSend() throws MessagingException {
        MimeMessage msg = mailSender.createMimeMessage();

        MimeMessageHelper helper = new MimeMessageHelper(msg, true);

        helper.setFrom(mailSender.getUsername());
        helper.setTo("[email protected]");
        helper.setSubject("邮件标题");
        //第二个参数true,表示text的内容为html,然后注意<img/>标签,src=‘cid:file‘,‘cid‘是contentId的缩写,‘file‘是一个标记,需要在后面的代码中调用MimeMessageHelper的addInline方法替代成文件
        helper.setText(
                "<body><p style=‘color:red;‘>Hello Html Email</p><img src=‘cid:file‘/></body>",
                true);
        //文件地址相对应src目录
        ClassPathResource file = new ClassPathResource("logo.png");
        //文件地址对应系统目录
//        FileSystemResource file = new FileSystemResource("C:\\Users\\HIYOUNG\\Desktop\\logo.png");
        helper.addInline("file", file);

        mailSender.send(msg);
    }

    /**
     *
    * 方法名: templateSend
    * 方法作用: TODO  使用Velocity模板发送邮件
    * 创建人:Jxufe HeHaiYang
    * 创建时间:2015-2-7 下午06:47:05
    * @param @throws MessagingException
    * 返回值类型: void
    * @throws
     */
    public void templateSend() throws MessagingException {
        // 声明Map对象,并填入用来填充模板文件的键值对
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("user", "hehaiyang");
        model.put("content", "good evening !");
        //Spring提供的VelocityEngineUtils将模板进行数据填充,并转换成普通的String对象
        //文件地址相对应src目录
        String emailText = VelocityEngineUtils.mergeTemplateIntoString(
                velocityEngine, "/velocity/mail.vm", model);
        // 和上面一样的发送邮件的工作
        MimeMessage msg = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(msg, true);
        helper.setFrom(mailSender.getUsername());
        helper.setTo("[email protected]");
        helper.setSubject("Rich content mail");
        helper.setText(emailText, true);

        mailSender.send(msg);
    }

}

Velocity模板mail.vm

<html>
<head>
<style type="text/css">
h4{
    color:red;
    background:#efefef;
}
</style>
</head>
<body>
  <h4>${user} </h4>
  <p><p>
  <i>${content}</i>
</body>
</html>

4、可能遇到的问题

异常1:

spring 发送邮件时遇到异常org.springframework.mail.MailAuthenticationException
org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException 

解决方法:

  如果遇到所示异常,请检查你所配置的发送邮箱,有没有对外开放POP3/SMTP服务。

异常2:

    Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
        at javax.mail.Session.loadProvidersFromStream(Session.java:928)
        at javax.mail.Session.access$000(Session.java:174)
        at javax.mail.Session$1.load(Session.java:870)
        at javax.mail.Session.loadResource(Session.java:1084)
        at javax.mail.Session.loadProviders(Session.java:889)
        at javax.mail.Session.<init>(Session.java:210)
        at javax.mail.Session.getInstance(Session.java:249)
   

解决方法:

  如果你使用的是JDK1.5以上环境,那么你应该会遇到所示异常,因为环境下javaee.jar包与java mail 包有冲突。

  找到javaee.jar包删除里面的mail 包以及mail下属的包,去除冲突。

5、测试

  更改SpringMailSender调用的方法,逐个测试发送邮件。

public class SenderTest {

     public static void main(String[] args){
        try {
            SpringMailSender m=new SpringMailSender();
            m.richContentSend();
            System.out.println("发送成功!");
        } catch (Exception e) {
            System.out.println(e.toString());
        }

     }
}
时间: 2024-10-18 09:13:26

Spring3.0下使用JavaMailSenderImpl类发送邮件的相关文章

在Eclipse配置并编译worldwind java2.1.0源码,选中Src目录下gov.nasa.worldwindx.examples包下ApplicationTemplate.java类文件run时提示“javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V”异常的解决办法

问题现象: 在Eclipse配置并编译worldwind java2.1.0源码,选中Src目录下gov.nasa.worldwindx.examples包下ApplicationTemplate.java类文件run时提示“javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V”异常. 解决办法: 1.定位到报错的方法为WWXML.java文件中的createDocumentBuilder方法: pub

Myeclipse10下搭建SSH框架(图解)Struts2.1+Spring3.0+Hibernate3.3 (转)

出处:http://xly3000.blog.163.com/blog/static/1324247201231163828803/ 一.建立一个Web Project ①点击File→New→Web Project 新建一个Web工程.   ②在Project Name中输入项目名ssh,在J2EE Specification Level中选择Java EE 6.0,然后点击Finish.  二.搭建Spring3.0 ①左边显示的是生成以后的Web Project 目录结构. 选择工程名(s

Spring3.0第三讲:Spring实现简单的登录

学习Spring这些技术性框架,光掌握理论知识是远远不够了,我们要懂得学以致用,用键盘将学到的敲出来,在正确与错误中寻找Spring的用法. 为了给读者一个直观的概念,这里我用Spring搭建一个简单的登录,可以让你很快的了解Spring在持久层.业务层.表现层是怎么运作的,这样后面我们分模块讲解的时候,读者也能很快的知道. 本文所用工具为Eclipse IDE,数据库为Oracle 11g. 首先我们来了解登录这个功能,用户访问登录页面,输入账号和密码,点击登录,后台验证是否有账号和密码匹配,

Spring3.0实现REST实例

Spring3.0实现REST实例 这是一个rest风格的访问,Spring从3.0开始将全面支持rest.不得不感叹Spring的强悍. 项目结构: 第一步永远是配置,使用框架永远都是先有配置,在web.xml中的配置: [xhtml] view plaincopy <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://

Spring3.0 AOP 详解

一.什么是 AOP. AOP(Aspect Orient Programming),也就是面向切面编程.可以这样理解,面向对象编程(OOP)是从静态角度考虑程序结构,面向切面编程(AOP)是从动态角度考虑程序运行过程. 二.AOP 的作用. 常常通过 AOP 来处理一些具有横切性质的系统性服务,如事物管理.安全检查.缓存.对象池管理等,AOP 已经成为一种非常常用的解决方案. 三.AOP 的实现原理. 如图:AOP 实际上是由目标类的代理类实现的.AOP 代理其实是由 AOP 框架动态生成的一个

开发基础框架:mybatis-3.2.8 +hibernate4.0+spring3.0+struts2.3

一:项目下载地址(点击 Source code(zip)) https://github.com/fzxblgong/frame_2014-12-15/releases 版本:v1.2大小:20M 二:ssm(mybatis-3.2.8 +hibernate4.0+spring3.0+struts2.3) version v1.3 功能 新增:+8.框架在支持mybatis-3.2.8基础上又整合进hibernate4,并支持注释.+9.使用注释ssh方式实现JqueryMiniUi多选树.实例

spring3.0使用annotation完全代替XML(三)

很久之前写过两篇博客: spring3.0使用annotation完全代替XML spring3.0使用annotation完全代替XML(续) 用java config来代替XML,当时还遗留下一些问题: <tx:annotation-driven />声明性事务等配置无法用简单代码来实现 web.xml无法去掉 随着servlet 3.0规范以及spring3.1.M2的发布,现在以上的问题也解决了. 先来说说web.xml,有两种方法来替代 (一)annotation Java代码  

spring3.0使用annotation完全代替XML

@Service与@Component有什么不同?那天被问到这个问题,一时之间却想不起来,就利用这篇文章来纪录spring3.0中常用的annotation. 从spring2.5开始,annotation结合BeanPostProcessor成了扩展Spring IoC容器的常用方法.Spring2.5增加了对JSR-250中@Resource, @PostConstruct, @PreDestroy的支持,Spring 3.0又增加了对JSR-330 (Dependency Injectio

Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8 整合例子

转自:http://www.blogjava.net/wangxinsh55/archive/2011/07/24/354925.html Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8整合例子(附完整的请假流程例子,jbpm基础,常见问题解决) Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8 整合例子(附完整的请假流程例子). 1.       jbpm4.4 测试环境搭建 2.       Jbpm4