spring对邮件发送支持的很好,我们只要配置好邮件发送器,写好邮件发送具体操作类的方法,那么实现就不是很难的事,不过这个过程中经常会出现这样或那样的错误,所以待讲完本篇后我会总体总结下spring邮件发送容易发生的错误及解决办法
关于邮件发送,不外乎有这么几种情况,一种是纯文本的发送,一种是HTML形式的发送,一种就是发送时带有附件,一种就是发送时采取的事群发,针对这几个我将一一来讲下,我的代码中将第一中归为一大类,后面三种归为一代类,所以将会出现两种配置文件
第一大类邮件发送【纯文本发送】
必须包:spring.jar,common-logging.jar,mail.jar,servlet.jar,common-collection.jar
首先我们来看spring配置文件applicationContext.xml
Xml代码
true
用到的实体类Order.java
Java代码
package com.javacrazyer.comon;
import java.io.Serializable;
public class Order implements Serializable {
/* Private Fields */
private int orderId;
private String username;
private String useremail;
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUseremail() {
return useremail;
}
public void setUseremail(String useremail) {
this.useremail = useremail;
}
}
邮件发送类的接口类MailService.java
Java代码
package com.javacrazyer.comon;
/**
* 使用Spring发送邮件
*
*/
public interface MailService {
void sendOrderMail(Order order);
}
具体实现的邮件发送类SendOrderConfirmationEmailAdvice.java
Java代码
package com.javacrazyer.comon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
public class SendOrderConfirmationEmailAdvice implements MailService{
private String from="[email protected]"; //发送人邮箱地址,必须与spring配置文件中的邮箱地址一样
private String registeTemplateName = "com/javacrazyer/comon/mail_registe.txt";
private MailSender mailSender;
public void setMailSender(MailSender mailSender) {
this.mailSender = mailSender;
}
public void sendOrderMail(Order order) {
//SimpleMialMessage只能用来发送TEXT格式的邮件
SimpleMailMessage mail = new SimpleMailMessage();
mail.setFrom(this.from);
mail.setTo(order.getUseremail());
mail.setSubject("恭喜你成功注册成为SOMEDAY商城的会员!");
mail.setText(loadTemplateContent(registeTemplateName).replaceAll("\\$\\{LOGINNAME\\}", order.getUsername()));
this.mailSender.send(mail);
}
private String loadTemplateContent(String templateName){
StringBuilder sb = new StringBuilder();
BufferedReader br= null;
try{
br = new BufferedReader(
new InputStreamReader(
Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream(templateName), "UTF-8"));
String lineSeparator = System.getProperty("line.separator");
for(String str = null; (str = br.readLine()) != null;){
sb.append(str);
sb.append(lineSeparator);
}
}catch(IOException e){
e.printStackTrace();
}finally{
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
}
用到的mail_registe.txt
Java代码
亲爱的${LOGINNAME}:您好!
恭喜你成为SOMEDAY商城的会员!
你的登录用户名为:${LOGINNAME}
你的登录口令为:******(隐藏)
本站网址:http://www.yoursitename.cn
联系邮箱:[email protected]
测试发送
Java代码
package com.javacrazyer.service.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.javacrazyer.comon.MailService;
import com.javacrazyer.comon.Order;
public class UserServiceTest {
@Test
public void test() throws InterruptedException {
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
MailService sf = (MailService) context.getBean("emailService");
Order order = new Order();
order.setUsername("cheneywu");
order.setUseremail("[email protected]");
sf.sendOrderMail(order);
}
}
注意查收邮箱中的信息哦
![](http://dl.iteye.com/upload/attachment/339191/8be020a6-defb-3a81-9be2-59d4bc519c0b.png)
第二大类邮件发送【HTML格式的发送,群发,附件】
除了上面包外,还需要spring-webmvc.jar,freemarker.jar,为什么需要freemarker呢,因为要发送HTML格式的
文件,所以要先写好HTML内容的文件,然后用模板freemarker匹配其中的值,Spring中对freemarker也有很好的支持
spring配置文件applicatonContext-html.xml
Xml代码
1800
UTF-8
zh_CN
true
模板文件目mailTemplate下的模板文件registe.ftl 【这个文件无名字、后缀无所谓,只要内容是HTML内容即可】
Html代码
恭喜您成功注册!您的用户名为:${LOGINNAME}
具体邮件发送类EmailService.java
Java代码
package com.javacrazyer.comon;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import org.springframework.mail.MailSender;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import freemarker.template.Template;
public class EmailService implements MailService {
private JavaMailSender mailSender;
private FreeMarkerConfigurer freeMarkerConfigurer = null; // FreeMarker的技术类
public void setMailSender(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
public void setFreeMarkerConfigurer(
FreeMarkerConfigurer freeMarkerConfigurer) {
this.freeMarkerConfigurer = freeMarkerConfigurer;
}
/**
* 发送带模板的单个html格式邮件
*/
public void sendOrderMail(Order order) {
MimeMessage msg = mailSender.createMimeMessage();
// 设置utf-8或GBK编码,否则邮件会有乱码,true表示为multipart邮件
try {
MimeMessageHelper helper = new MimeMessageHelper(msg, true, "utf-8");
helper.setTo(order.getUseremail()); // 邮件接收地址
helper.setFrom("[email protected]"); // 邮件发送地址,这里必须和xml里的邮件地址相同一致
helper.setSubject("你好,恭喜你注册成功"); // 主题
String htmlText;
htmlText = getMailText(order.getUsername());
helper.setText(htmlText, true); // 邮件内容,注意加参数true,表示启用html格式
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 使用模板生成html邮件内容
mailSender.send(msg); // 发送邮件
}
/**
* 批量发送带附件的html格式邮件,带附件
*/
public void sendBatchEmail(Order order, List address) {
MimeMessage msg = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(msg, true, "utf-8");
String toList = getMailList(address);
InternetAddress[] iaToList = new InternetAddress().parse(toList);
msg.setRecipients(Message.RecipientType.TO, iaToList);
helper.setFrom("[email protected]");
helper.setSubject("你好,恭喜你注册成功");
String htmlText = getMailText(order.getUsername());
helper.setText(htmlText, true);
// 添加内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源
helper.addInline("a", new File("E:/11.jpg")); // 附件内容
helper.addInline("b", new File("E:/12.jpg"));
File file = new File("E:/各种框架图介绍.docx");
// 这里的方法调用和插入图片是不同的,使用MimeUtility.encodeWord()来解决附件名称的中文问题
helper.addAttachment(MimeUtility.encodeWord(file.getName()), file);
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 如果主题出现乱码,可以使用该函数,也可以使用下面的函数
// helper.setSubject(MimeUtility.encodeText(String text,String
// charset,String encoding))
// 第2个参数表示字符集,第三个为目标编码格式。
// MimeUtility.encodeWord(String word,String charset,String encoding)
mailSender.send(msg);
}
/**
* 集合转换字符串
*/
public String getMailList(List to) {
StringBuffer toList = new StringBuffer();
int length = to.size();
if (to != null && length |