1. 原理介绍
Spring内置了一个邮件发送器JavaMailSenderImpl,实现了JavaMailSender接口,可以用来发送文本邮件、HTML邮件、发送附件等。
Spring提供了发送电子邮件的功能,它向用户屏蔽了底层邮件系统的一些细节,同时代表客户端负责底层的资源处理。
JavaMailSenderImpl是个普通的Java Bean,可以在配置文件中配置,也可以在程序中动态地创建。创建时设置上需要的信息。
2. 配置文件
2.1 引入jar包
activation.jar
commons-logging-1.1.1.jar
mail.jar
spring-beans-3.2.9.RELEASE.jar
spring-context-3.2.9.RELEASE.jar
spring-context-support-3.2.9.RELEASE.jar
spring-core-3.2.9.RELEASE.jar
2.2 配置文件
文件在项目中的位置:src根目录下
JavaMailSenderImpl可以配置到applicationContext-mail.xml中,在Action中直接使用即可。配置代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<!-- 注意:这里的参数(如用户名、密码)都是针对邮件发送者的 -->
<bean id="mailSender"
class="org.springframework.mail.javamail.JavaMailSenderImpl">
<!-- 邮件发送器需要配置邮件服务器、用户名、密码及是否需要验证等信息 -->
<property name="host">
<value>smtp.126.com</value>
</property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.timeout">25000</prop>
</props>
</property>
<property name="username">
<value>username@126.com</value>
</property>
<property name="password">
<value>password</value>
</property>
</bean>
</beans>
知识拓展:SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
2.3 Java代码
范例一: 发送text格式的Email类:
package drizzt.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
/**
* @author 发送text格式的Email类:
*
*/
public class EmailUtil {
private static EmailUtil emailUtil = null;
public ApplicationContext ctx = null;
private EmailUtil() {
//获取上下文
ctx = new ClassPathXmlApplicationContext("applicationContext-mail.xml");
}
public static EmailUtil getInstance()
{
if(emailUtil==null)
{
synchronized (EmailUtil.class)
{
if(emailUtil==null) {
emailUtil = new EmailUtil();
}
}
}
return emailUtil;
}
public void sentEmails(String emails,String subject,String text)
{
//获取JavaMailSender bean
JavaMailSender sender = (JavaMailSender)ctx.getBean("mailSender");
//SimpleMailMessage只能用来发送text格式的邮件
SimpleMailMessage mail = new SimpleMailMessage();
String email[] = emails.split(";");
for(int i=0;i<email.length;i++) {
try {
mail.setTo(email[i]);//接受者
mail.setFrom("chenxbook@126.com");//发件者
mail.setSubject(subject);//主题
mail.setText(text);//邮件内容
sender.send(mail)`;
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
String mail_title = "注册成功";
String mail_text= "恭喜!您已经注册成功.欢迎使用本网站,主页地址:http://www.baidu.com";
EmailUtil email = EmailUtil.getInstance();
email.sentEmails("1005190183@qq.com",mail_title,mail_text);
}
}
范例二:发送带附件的邮件
package drizzt.test;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessagePreparator;
/**
* @author Administrator
*
*/
public class SpringMail {
/**
* 发送带附件的邮件
* @param JavaMailSender 邮件发送器
* @throws Exception
* MimeMessagePreparator 回调接口,用于准备JavaMail的MIME信件。
*/
private void sendMimeMessage(final JavaMailSender sender) throws Exception {
//附件文件集合
final List files = new ArrayList(); //定义了一个集合
//实例化一个实现该接口的匿名内部类,接口本身是用来抽象的,实例化接口没有意义。
MimeMessagePreparator mimeMail = new MimeMessagePreparator() {
public void prepare(MimeMessage mimeMessage) throws MessagingException {
//设置邮件的发送方式、收件人地址
mimeMessage.setRecipient(Message.RecipientType.TO,
new InternetAddress("2747227593@qq.com"));
//设置邮件的发件人地址
mimeMessage.setFrom(new InternetAddress("15810588960@163.com"));
//设置邮件的主题
mimeMessage.setSubject("Spring发送带附件的邮件", "gb2312");
//DataHandler&FileDataSource 将图片、附件读到邮件中
// MimeMultipart类 功能:设置文本/图片/附件之间的关系类
Multipart mp = new MimeMultipart();
//向Multipart添加正文
MimeBodyPart content = new MimeBodyPart();
content.setText("内含spring邮件发送的例子,请查收!");
//向MimeMessage添加(Multipart代表正文)
mp.addBodyPart(content);
files.add("src/drizzt/test/SpringMail.java");
files.add("src/applicationContext-mail.xml");
//向Multipart添加附件
Iterator it = files.iterator();
while(it.hasNext()) {
MimeBodyPart attachFile = new MimeBodyPart();
String filename = it.next().toString();
FileDataSource fds = new FileDataSource(filename);
attachFile.setDataHandler(new DataHandler(fds));
attachFile.setFileName(fds.getName());
mp.addBodyPart(attachFile);
}
files.clear();
//向Multipart添加MimeMessage
mimeMessage.setContent(mp);
mimeMessage.setSentDate(new Date());
}
};
//发送带附件的邮件
sender.send(mimeMail);
System.out.println("成功发送带附件邮件!");
}
public static void main(String[] args) throws Exception {
ApplicationContext ctx = new FileSystemXmlApplicationContext(
"src/applicationContext-mail.xml");
JavaMailSender sender = (JavaMailSender) ctx.getBean("mailSender");
SpringMail springMail = new SpringMail();
//测试发送带附件的邮件
springMail.sendMimeMessage(sender);
}
}
知识拓展:
Spring邮件抽象层的主要包为org.springframework.mail。它包括了发送电子邮件的主要接口MailSender,和值对象SimpleMailMessage,它封装了简单邮件的属性如from, to,cc, subject,text。 包里还包含一棵以MailException为根的checked Exception继承树,它们提供了对底层邮件系统异常的高级别抽象。 要获得关于邮件异常层次的更丰富的信息,请参考Javadocs。
为了使用JavaMail中的一些特色, 比如MIME类型的信件, Spring提供了MailSender的一个子接口, 即org.springframework.mail.javamail.JavaMailSender。Spring还提供了一个回调接口org.springframework.mail.javamail.MimeMessagePreparator, 用于准备JavaMail的MIME信件。