分享
 
 
 

使用Spring邮件抽象层发送邮件

王朝other·作者佚名  2006-05-19
窄屏简体版  字體: |||超大  

Sending Email with Spring mail abstraction layer

使用Spring邮件抽象层发送邮件:

18.1. Introduction

介绍

Spring provides a higher level of abstraction for sending electronic mail which shields the user from the specifics of underlying mailing system and is responsible for a low level resource handling on behalf of the client.

Spring 支持一个更高层的抽象用来发送电子邮件,它隐藏底层邮件系统的细节并且代表客户端对低级别的控制 。

18.2. Spring mail abstraction structure

Spring邮件抽象结构

The main package of Spring mail abstraction layer is org.springframework.mail package. It contains central interface for sending emails called MailSender and the value object which encapsulates properties of a simple mail such as from, to, cc, subject, text called SimpleMailMessage. This package also contains a hierarchy of checked exceptions which provide a higher level of abstraction over the lower level mail system exceptions with the root exception being MailException.Please refer to JavaDocs for more information on mail exception hierarchy.

Sring邮件抽象层的主要包是:org.springframework.mail 包。它包含叫MailSender为发送邮件的核心接口和包含简单邮件属性例如from,to,cc,subject,text叫SimpleMailMessage的值对象. 这个包也包含一个检查异常的层次,它支持一个更高级别的抽象超过低级别的邮件系统异常伴随根异常存在MailException. 请参考JavaDocs为更多的信息杂邮件异常层次。

Spring also provides a sub-interface of MailSender for specialized JavaMail features such as MIME messages, namely org.springframework.mail.javamail.JavaMailSender It also provides a callback interface for preparation of JavaMail MIME messages, namely org.springframework.mail.javamail.MimeMessagePreparator

Spring也支持一个MailSender的专用于JavaMail特征例如MIME消息子接口,命名为org.springframework.javamail.JavaMailerSener。它也支持一个为JavaMail MIME信息的准备回调接口,命名为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

* 发送给定的简单邮件信息

* @参数 simpleMessage 发送的信息

* @throws MailException 假设信息,证明或发送错误

*/

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[])

* 创建一个新的JavaMail MimeMessage 为潜在的JavaMail的发送者的会话.

* 需要被调用来创建MimeMessage实例,它可以被客户准备并且被传递发送(MimeMessage).

* @return 这个新的MimeMessage 实例

* @see #send(Message)

* @sess #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;

}

18.3. Using Spring mail abstraction

使用Spring邮件抽象

Let's assume there is a business interface called OrderManager

让我们假定这里有一个商业接口叫OrderManager

public interface OrderManager {

void placeOrder(Order order);

}

and there is a use case that says that an email message with order number would need to be generated and sent to a customer placing that order. So for this purpose we want to use MailSender and SimpleMailMessage

并且这里有一个有用案例,可以说一个伴随订单编号的邮件信息将需要被产生并且发送给一个客户处理这个订单。所以为这个目的我们想要使用MailSender和SimpleMailSender.

Please note that as usual, we work with interfaces in the business code and let Spring IoC container take care of wiring of all the collaborators for us.

请注意照常,我们工作使用在商业代码中的接口并且让Spring Ioc 容器关心为我们的所有合作者。

Here is the implementation of OrderManager

这里是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 business calculations....

//... * Call the collaborators to persist the order

//Create a thread safe "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());

}

}

}

Here is what the bean definitions for the code above would look like:

这里是这个为这个以上代码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>

Here is the implementation of OrderManager using MimeMessagePreparator callback interface. Please note that the mailSender property is of type JavaMailSender in this case in order to be able to use 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 business 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());

}

}

}

If you want to use JavaMail MimeMessage to the full power, the MimeMessagePreparator is available at your fingertips.

如果你想使用JavaMail MimeMessage来使得足够强大,MimeMessagePreparator 是可以利用的。

Please note that the mail code is a crosscutting(横切的) concern(关注) and is a perfect candidate(候选) for refactoring into a custom Spring AOP advice, which then could easily be applied to OrderManager target. Please see the AOP chapter.

18.3.1. Pluggable MailSender implementations

Spring comes with two MailSender implementations out of the box - the JavaMail implementation and the implementation on top of Jason Hunter's MailMessage class that's included in http://servlets.com/cos (com.oreilly.servlet). Please refer to JavaDocs for more information.

18.4. Using the JavaMail MimeMessageHelper

One of the components that comes in pretty handy when dealing with JavaMail messages is the org.springframework.mail.javamail.MimeMessageHelper. It prevents you from having to use the nasty APIs the the javax.mail.internet classes. A couple of possible scenarios:

18.4.1. Creating a simple MimeMessage and sending it

Using the MimeMessageHelper it's pretty easy to setup and send a MimeMessage:

// of course you would setup the mail sender using

// DI in any real-world cases

JavaMailSenderImpl sender = new JavaMailSenderImpl();

sender.setHost("mail.host.com");

MimeMessage message = sender.createMimeMesage();

MimeMessageHelper helper = new MimeMessageHelper(message);

helper.setTo("test@host.com");

helper.setText("Thank you for ordering!");

sender.send(message);

18.4.2. Sending attachments and inline resources

Email allow for attachments, but also for inline resources in multipart messages. Inline resources could for example be images or stylesheet you want to use in your message, but don't want displayed as attachment. The following shows you how to use the MimeMessageHelper to send an email along with an inline image.

JavaMailSenderImpl sender = new JavaMailSenderImpl();

sender.setHost("mail.host.com");

MimeMessage message = sender.createMimeMesage();

// use the true flag to indicate you need a multipart message

MimeMessageHelper helper = new MimeMessageHelper(message, true);

helper.setTo("test@host.com");

// use the true flag to indicate the text included is HTML

helper.setText(

"<html><body><img src='cid:identifier1234'></body></html>"

true);

// let's include the infamous windows Sample file (this time copied to c:/)

FileSystemResource res = new FileSystemResource(new File("c:/Sample.jpg"));

helper.addInline("identifier1234", res);

// if you would need to include the file as an attachment, use

// addAttachment() methods on the MimeMessageHelper

sender.send(message);

Inline resources are added to the mime message using the Content-ID specified as you've seen just now (identifier1234 in this case). The order in which you're adding the text and the resource are VERY important. First add the text and after that the resources. If you're doing it the other way around, it won't work!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有