1.spring中配置mailSender组件,beans.xml:
<!-- 据spring帮组文档,此处javaMail只需要mail.jar和JAF的activation.jar
JavaMail1.4之后只需要mail.jar
1.创建mailSender-->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<!-- <property name="host" value="smtp.sina.com"/>
<property name="protocol" value="smtp"/>
<property name="username" value="kh_itat"/>
<property name="password" value="password"/>
-->
<property name="javaMailProperties">
<props>
<!-- 可以通过这里设置mail的部分私有属性 -->
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.debug">true</prop>
</props>
</property>
</bean>
<!-- 正常情况下发送邮件,需要异步发送,否则会把大量的时间浪费在邮件发送上面,
此时可能造成用户重新刷新,使用spring的ThreadPoolTaskExecutor
可以方便实现多线程 -->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="10" />
<property name="queueCapacity" value="25" />
</bean>
2.外部测试
@Resource(name="mailSender")
JavaMailSender mailSender;
@Test
public void test01(){
try {
/*创建MimeMessage*/
MimeMessage msg=mailSender.createMimeMessage();
/*通过MimeMessageHelper来完成对邮件信息的设置*/
MimeMessageHelper helper=new MimeMessageHelper(msg,true,"utf-8");
helper.setFrom("kh_itat@sina.com");
helper.setTo("zhchl2010@hotmail.com");
helper.setSubject("spring发送JavaMail邮件");
/*设置邮件正文*/
helper.setText("<div style='color:red;font-size:15px;'>JavaMail通过Spring发送邮件</div>"
+ "<img src='cid:sss'/>", true);
/*添加附件*/
helper.addAttachment(MimeUtility.encodeText("日志"),
new FileSystemResource("F:/web/test/log4j/zhchl.log"));
/*添加邮件内容中的图片*/
FileSystemResource fsr=new FileSystemResource("F:/web/test/ImageTrans/Koala.jpg");
helper.addInline("sss",fsr);
mailSender.send(msg);
} catch (MailException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
3.发邮件的内部线程
private class SendMailThread implements Runnable{
private Message msg;
private Integer[] userIds;
private AttachDto ad;
private String[] newName;
private String realPath;
private UserEmail ue;
public SendMailThread(UserEmail _ue,Message msg, Integer[] userIds, AttachDto ad,
String[] _newName,String _realPath) {
super();
this.msg = msg;
this.userIds = userIds;
this.ad = ad;
this.newName=_newName;
this.realPath=_realPath;
this.ue=_ue;
}
@Override
public void run() {
sendMail(ue,msg,userIds,ad,newName,realPath);
}
}
4.spring多线程发邮件
@Resource(name="mailSender")
JavaMailSender mailSender;
@Resource
private TaskExecutor taskExecutor;
/*spring发邮件*/
//sendMail(msg,userIds,ad);
/*spring多线程发送邮件,将发送邮件放置到一个线程中,这样就实现了异步处理*/
taskExecutor.execute(new SendMailThread(ue,msg,userIds,ad,newNames,SystemContext.getRealPath()));
spring发邮件,较为直观的处理代码
public void send(String username, String password, List<String> receives,
String subject, String content) {
try{
JavaMailSenderImpl jms=(JavaMailSenderImpl)mailSender;
jms.setUsername(username);
jms.setPassword(password);
MimeMessage email=jms.createMimeMessage();
MimeMessageHelper helper=new MimeMessageHelper(email,true,"utf-8");
//TODO 发送者友好显示
String domain=jms.getHost();
helper.setFrom(username+"@"+domain.substring(domain.indexOf(".")+1));
for(String to:receives){
helper.addTo(to);
}
//TODO 附件添加
/*格式化内容:替换图片和附件*/
List<String> imgs=listContentImgUrl(content);
/*必须先设置好内容的值,之后再来设置相应的嵌入附件,否则最后一个图片不会替换
* 建议:现设置好内容,之后再一次性添加图片
* 先定义一个Map保存cid和图片地址的对应关系*/
Map<String,String> imgMaps=new HashMap<String,String>();
int i=0;
/*完成内容的替换*/
for(String is:imgs){
imgMaps.put("x"+i,is);
content=content.replace(is,"cid:x"+i);
i++;
}
helper.setText(content, true);
/*添加嵌入式图片,key是cid,value是图片的地址
* 如果是本地图片文件(不以http开头),应该使用FileSystemResource传图片
* 首先得获取根目录webapp绝对路径*/
for(String key:imgMaps.keySet()){
String url=imgMaps.get(key);
if(url.startsWith("http")){
DataSource ds=new URLDataSource(new URL(url));
helper.addInline(key, ds);
}else{
String path=request.getSession().getServletContext().ge tRealPath("url");
helper.addInline(key, new FileSystemResource(path));
}
}
helper.setSubject(subject);
jms.send(email);
} catch (MailException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
/**格式化内容中的图片,返回内容中所有的img标签条目*/
protected List<String> listContentImgUrl(String content){
Pattern p=Pattern.compile("<img.*?\\s+src=['\"](.*?)['\"].*?>");
Matcher m=p.matcher(content);
List<String> srcs=new ArrayList<String>();
while(m.find()){
srcs.add(m.group(1));
}
return srcs;
}