Spring Framework 开发参考手册 之十七 使用Spring邮件抽象层发送Email

原创 2005年04月28日 16:17:00

第 17 章 使用Spring邮件抽象层发送Email

17.1. 简介

Spring提供了一个发送电子邮件的高级抽象层,它向用户屏蔽了底层邮件系统的一些细节,同时负责低层次的代表客户端的资源处理。

17.2. Spring邮件抽象结构

Spring邮件抽象层的主要包为org.springframework.mail。它包括了发送电子邮件的主要接口MailSender和 封装了简单邮件的属性如from, to,cc, subject, text值对象叫做SimpleMailMessage。 一个以MailException为root的checked Exception继承树,它们提供了对底层邮件系统异常的高级别抽象。 请参考JavaDocs来得到关于邮件异常层次的更多的信息。

为了使用JavaMail中的一些特色如MIME类型的消息,Spring也提供了一个MailSender的子接口, 名为org.springframework.mail.javamail.JavaMailSender,同时也提供了一个对JavaMail的MIME类型的消息分块的回调interface, 名为org.springframework.mail.javamail.MimeMessagePreparator

MailSender:

public interface MailSender {

    /**
     * Send the given simple mail message.
     * @param simpleMessage message to send
     * @throws MailException in case of message, authentication, or send errors
     */
    public void send(SimpleMailMessage simpleMessage) throws MailException;

    /**
     * Send the given array of simple mail messages in batch.
     * @param simpleMessages messages to send
     * @throws MailException in case of message, authentication, or send errors
     */
    public void send(SimpleMailMessage[] simpleMessages) throws MailException;

}

JavaMailSender:

public interface JavaMailSender extends MailSender {

    /**
     * Create a new JavaMail MimeMessage for the underlying JavaMail Session
     * of this sender. Needs to be called to create MimeMessage instances
     * that can be prepared by the client and passed to send(MimeMessage).
     * @return the new MimeMessage instance
     * @see #send(MimeMessage)
     * @see #send(MimeMessage[])
     */
    public MimeMessage createMimeMessage();

    /**
     * Send the given JavaMail MIME message.
     * The message needs to have been created with createMimeMessage.
     * @param mimeMessage message to send
     * @throws MailException in case of message, authentication, or send errors
     * @see #createMimeMessage
     */
    public void send(MimeMessage mimeMessage) throws MailException;

    /**
     * Send the given array of JavaMail MIME messages in batch.
     * The messages need to have been created with createMimeMessage.
     * @param mimeMessages messages to send
     * @throws MailException in case of message, authentication, or send errors
     * @see #createMimeMessage
     */
    public void send(MimeMessage[] mimeMessages) throws MailException;

    /**
     * Send the JavaMail MIME message prepared by the given MimeMessagePreparator.
     * Alternative way to prepare MimeMessage instances, instead of createMimeMessage
     * and send(MimeMessage) calls. Takes care of proper exception conversion.
     * @param mimeMessagePreparator the preparator to use
     * @throws MailException in case of message, authentication, or send errors
     */
    public void send(MimeMessagePreparator mimeMessagePreparator) throws MailException;

    /**
     * Send the JavaMail MIME messages prepared by the given MimeMessagePreparators.
     * Alternative way to prepare MimeMessage instances, instead of createMimeMessage
     * and send(MimeMessage[]) calls. Takes care of proper exception conversion.
     * @param mimeMessagePreparators the preparator to use
     * @throws MailException in case of message, authentication, or send errors
     */
    public void send(MimeMessagePreparator[] mimeMessagePreparators) throws MailException;

}

MimeMessagePreparator:

public interface MimeMessagePreparator {

    /**
     * Prepare the given new MimeMessage instance.
     * @param mimeMessage the message to prepare
     * @throws MessagingException passing any exceptions thrown by MimeMessage
     * methods through for automatic conversion to the MailException hierarchy
     */
    void prepare(MimeMessage mimeMessage) throws MessagingException;

}

17.3. 使用Spring邮件抽象

让我们来假设有一个业务接口名为OrderManager

public interface OrderManager {

    void placeOrder(Order order);
}

同时有一个use case为:需要生成带有订单号的email信息,并向客户发送该订单。 为了这个目的我们会使用MailSenderSimpleMailMessage

请注意,通常情况下,我们在业务代码中使用接口而让Spring ioc容器负责组装我们需要的合作者。

这里为OrderManager的一个实现

import org.springframework.mail.MailException;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;

public class OrderManagerImpl implements OrderManager {

    private MailSender mailSender;
    private SimpleMailMessage message;

    public void setMailSender(MailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void setMessage(SimpleMailMessage message) {
        this.message = message;
    }

    public void placeOrder(Order order) {

        //... * Do the businness calculations....
        //... * Call the collaborators to persist the order

        //Create a threadsafe "sandbox" of the message
        SimpleMailMessage msg = new SimpleMailMessage(this.message);
        msg.setTo(order.getCustomer().getEmailAddress());
        msg.setText(
            "Dear "
                + order.getCustomer().getFirstName()
                + order.getCustomer().getLastName()
                + ", thank you for placing order. Your order number is "
                + order.getOrderNumber());
        try{
            mailSender.send(msg);
        }
        catch(MailException ex) {
            //log it and go on
            System.err.println(ex.getMessage());            
        }
    }
}

上面的代码的bean的定义应该是这样的:

<bean id="mailSender"
      class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host"><value>mail.mycompany.com</value></property>
</bean>

<bean id="mailMessage"
      class="org.springframework.mail.SimpleMailMessage">
    <property name="from"><value>customerservice@mycompany.com</value></property>
    <property name="subject"><value>Your order</value></property>
</bean>

<bean id="orderManager"
      class="com.mycompany.businessapp.support.OrderManagerImpl">
    <property name="mailSender"><ref bean="mailSender"/></property>
    <property name="message"><ref bean="mailMessage"/></property>
</bean>

下面是OrderManager的实现,使用了MimeMessagePreparator回调接口。 请注意这里的mailSender属性类型为JavaMailSender,这样做是为了能够使用JavaMail的MimeMessage:

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

import javax.mail.internet.MimeMessage;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessagePreparator;

public class OrderManagerImpl implements OrderManager {
    private JavaMailSender mailSender;
    
    public void setMailSender(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void placeOrder(final Order order) {

        //... * Do the businness calculations....
        //... * Call the collaborators to persist the order
        
        
        MimeMessagePreparator preparator = new MimeMessagePreparator() {
            public void prepare(MimeMessage mimeMessage) throws MessagingException {
                mimeMessage.setRecipient(Message.RecipientType.TO, 
                        new InternetAddress(order.getCustomer().getEmailAddress()));
                mimeMessage.setFrom(new InternetAddress("mail@mycompany.com"));
                mimeMessage.setText(
                    "Dear "
                        + order.getCustomer().getFirstName()
                        + order.getCustomer().getLastName()
                        + ", thank you for placing order. Your order number is "
                        + order.getOrderNumber());
            }
        };
        try{
            mailSender.send(preparator);
        }
        catch(MailException ex) {
            //log it and go on
            System.err.println(ex.getMessage());            
        }
    }
}

如果你想使用JavaMail MimeMessage以获得全部的能力,只需要你指尖轻触键盘即可使用MimeMessagePreparator

请注意这部分邮件代码是一个横切关注点,是一个可以重构至一个定制的SpringAOP advice的完美候选者, 这样就可以不费力的应用到目标对象OrderManager上来。关于这一点请看AOP章节。

17.3.1. 可插拔的MailSender实现

Spring提供两种MailSender的实现:标准的JavaMail实现和在http://servlets.com/cos (com.oreilly.servlet)里的Jason Hunter's MailMessage类之上的实现。请参考JavaDocs以得到进一步的信息。

Spring学习笔记之使用Spring发送Email

使用Spring发送Email
  • CSDN_XueXiaoQiang
  • CSDN_XueXiaoQiang
  • 2017年06月25日 23:17
  • 1391

Spring Framework 开发参考手册中文(在线HTML)

Spring Framework 开发参考手册中文(在线HTML)Spring Framework 开发参考手册AuthorsRod Johnson, Juergen Hoeller, Alef Ar...
  • zfrong
  • zfrong
  • 2009年03月09日 11:00
  • 27907

spring mvc 发送html格式velocity邮件模板(包括定时发送与按钮触发发送)

1.Maven Dependency(POM.xml) dependency>          groupId>org.apache.velocitygroupId> ...
  • Carl_WeiRenKuan
  • Carl_WeiRenKuan
  • 2015年05月12日 17:13
  • 2501

使用spring 并加载模板发送Email 发邮件 java 模板

以下例子是使用spring发送email,然后加载到固定的模板,挺好的,大家可以试试 需要使用到spring-context 包 和 com.springsource.org.apache.velo...
  • CloudCraft
  • CloudCraft
  • 2013年09月24日 23:40
  • 4699

利用spring mail 发送带附件的邮件

http://pan.baidu.com/s/1mhC86NI
  • zy_281870667
  • zy_281870667
  • 2016年05月26日 15:48
  • 2731

Spring Framework 4.x 参考文档 (一)Spring 入门

第一部分 Spring 框架概览Spring框架是您创建企业级应用的轻量级解决方案与具有潜力的一站式商店。不过,Spring是模块化的,允许你只使用需要的部分,而不必带上其他部分。你可以使用IoC容器...
  • skyvoice7
  • skyvoice7
  • 2016年03月03日 17:42
  • 758

springboot发送邮件的实现例子

springboot是集大成者,对于发送邮件的功能也不例外。而且往往是原来的功能实现更简单,方便。更符合Facade Pattern。 下面就是springboot发送邮件的实现例子,代码已封装好,按...
  • mingliangniwo
  • mingliangniwo
  • 2017年02月10日 17:00
  • 3611

spring简单邮件发送(文本/html/图片/附件)

Spring邮件抽象层的主要包为org.springframework.mail。它包括了发送电子邮件的主要接口MailSender,和值对象SimpleMailMessage,它封装了简单邮件的属性...
  • johnjobs
  • johnjobs
  • 2014年12月26日 10:31
  • 2344

Java使用spring发送邮件

Spring邮件抽象层的主要包为org.springframework.mail。它包括了发送电子邮件的主要接口MailSender,和值对象SimpleMailMessage,它封装了简单邮件的属性...
  • qq_23217629
  • qq_23217629
  • 2017年04月17日 10:00
  • 1128

使用spring框架中的组件发送邮件的详细说明

原创作者:http://blog.csdn.net/caimengyuan/article/details/51224269 在进行项目开发的时候,要做一个通过发送邮件验证码的功能来找回密码。spr...
  • qq_28663043
  • qq_28663043
  • 2017年04月13日 09:32
  • 2832
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring Framework 开发参考手册 之十七 使用Spring邮件抽象层发送Email
举报原因:
原因补充:

(最多只允许输入30个字)