谈谈JavaMail发送含图片带附件的复杂类型邮件
以前用JavaMail API发送过纯文本邮件,但是发送HTML格式的邮件还没试验过,今天有空就研究了下,途中卡在了邮件正文中嵌入的图片不能显示的问题上,后自己google了下,总算成功了,现将代码记录如下。虽然功能是实现了,但是还有许多需要改进的地方,比如代码中的邮件服务器配置参数,邮箱帐号密码,收件人、发件人、邮件正文内容、附件等等这些信息都可以包装成对象传入,至于这些参数如何传入解析,也可以写个专门的工具类,这个我暂时没考虑那么多,但是我心里还是清楚的,有空我会把它完善。
package com.lxw.test;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.mail.util.ByteArrayDataSource;
/**
* 发送复合类型邮件
* @author Lanxiaowei
* @createTime 2011-12-4 下午02:20:01
*/
public class Test5 {
public static void main(String[] args) throws Exception{
//创建session,建立与SMTP邮件服务器的连接
Properties properties = new Properties();
InputStream is = Test5.class.getResourceAsStream("/com/lxw/config/mail.properties");
properties.load(is);
Session session = Session.getInstance(properties,new Authenticator(){
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("vnetoolxw","beidaqn");
}
});
session.setDebug(true);
//开始构建邮件
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setSubject("用java编写的复合邮件","UTF-8");
//设置发件人
mimeMessage.setFrom(new InternetAddress("\""+ MimeUtility.encodeText("兰小伟") + "\" <>"));
//设置回复栏显示的回复人地址,不设置默认回复人就是发件人
mimeMessage.setReplyTo(new Address[]{new InternetAddress("")});
//设置收件人
mimeMessage.setRecipients(RecipientType.TO, InternetAddress.parse(
"\"" + MimeUtility.encodeText("郑楠") + "\" <>"
));
MimeMultipart mimeMultipart = new MimeMultipart("mixed");
MimeBodyPart attch1 = new MimeBodyPart();
MimeBodyPart attch2 = new MimeBodyPart();
MimeBodyPart content = new MimeBodyPart();
mimeMultipart.addBodyPart(attch1);
mimeMultipart.addBodyPart(attch2);
mimeMultipart.addBodyPart(content);
mimeMessage.setContent(mimeMultipart);
//构建附件1
DataSource ds1 = new FileDataSource("D:\\Java虚拟机学习笔记.txt");
DataHandler dataHandler1 = new DataHandler(ds1);
attch1.setDataHandler(dataHandler1);
attch1.setFileName(MimeUtility.encodeText("Java虚拟机学习笔记.txt"));
//构建附件2
DataSource ds2 = new FileDataSource("D:\\Java类加载器机制.txt");
DataHandler dataHandler2 = new DataHandler(ds2);
attch2.setDataHandler(dataHandler2);
attch2.setFileName(MimeUtility.encodeText("Java类加载器机制.txt"));
//构建正文部分
MimeMultipart bodyMultipart = new MimeMultipart("related");
content.setContent(bodyMultipart);
//html部分
MimeBodyPart htmlPart = new MimeBodyPart();
//图片部分
MimeBodyPart picPart = new MimeBodyPart();
bodyMultipart.addBodyPart(htmlPart);
bodyMultipart.addBodyPart(picPart);
//构建图片资源
byte[] imgbytes = getBytesFromFile(new File("D:\\aweil.jpg"));
DataSource picds = new ByteArrayDataSource(imgbytes,"application/octet-stream");
DataHandler picDataHandler = new DataHandler(picds);
picPart.setDataHandler(picDataHandler);
picPart.setFileName("aweil.jpg");
picPart.setHeader("Content-ID", "IMGaweil");
//picPart.setHeader("Content-Location", "");
//picPart.setHeader("Content-Location", "");
htmlPart.setContent("<font color=\"red\">测试内容,请勿回复!如有打扰,还请多多包涵!</font><br/><img src=\"cid:IMGaweil\" width=\"320\" height=\"260\" border=\"0\"/>", "text/html;charset=utf-8");
//生成邮件
mimeMessage.saveChanges();
//开始发送
Transport.send(mimeMessage);
}
/**
* 将文件转换成字节数组
*/
public static byte[] getBytesFromFile(File f) {
if (f == null) {
return null;
}
try {
InputStream stream = new FileInputStream(f);
ByteArrayOutputStream out = new ByteArrayOutputStream(1000);
byte[] b = new byte[1000];
int n;
while ((n = stream.read(b)) != -1) {
out.write(b, 0, n);
}
stream.close();
out.close();
return out.toByteArray();
} catch (IOException e){
}
return null;
}
}
我的demo中邮件正文内容是通过字符串拼接方式得到的,但是如果邮件正文内容很多,用字符串拼接拼接显然不可取,这时候要么你正文内容事先存于数据库,直接读取数据库,要么你正文内容存于外部文件,你读取文件获取。其实整个代码也没什么,唯一要注意的就是正文中图片如何显示的处理方式,该部分代码我已用紫色字体突出显示了,好了,就说这么多,有什么疑问请下方留言,也欢迎你多多拍砖!
按惯例,我还是来两张效果图吧,免得你们觉得太单调了:


不好意思,写的太匆忙,mail.properties文件里SMTP服务器配置没贴出来,现补充如下:
mail.smtp.host=smtp.sina.com
mail.host=smtp.sina.com
mail.smtp.auth=true
mail.transport.protocol=smtp
我用的是新浪的SMT平服务器来帮我发送邮件,事先需要注册一个新浪邮箱帐号,就这样,至于那些配置在新浪邮箱的帮助页面里都有说明:

本文来源 我爱IT技术网 http://www.52ij.com/jishu/92.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
