在上一篇文章(Java邮件开发(二):使用JMail发送一封图文并茂且包含附件的邮件(下) )中,我们学会了使用JavaMail发送一封复杂的邮件。
遗留的问题有以下两个:
1.附件的名称只能为英文,中文乱码
2.友好名称的显示。
我们使用163等邮箱发送邮件时,我们经常可以看到收件人一栏中会是:张益达 这种方式。在上一版本的代码中并没有使用这样的方式。
下面解决这两个问题
1. 对于中文乱码,是因为邮件要求所有的字符必须是ascII字符,中文字符当然不可以。因此我们只需要把我们的中文全部转码就可以了。
而JavaMail提供了这样一个类:MimeUtility。使用这个类的encodeText方法就可以对中文进行编码。
2. 对于显示友好名称,我们首先要了解收件人填写时的格式。格式一般为:友好名称 <邮箱地址>,如果有多个收件人要以逗号分割
如:张益达sohu ,张益达qq <554077931@qq.com>,张益达163
示例代码如下
package
com.zyh.demo;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.OutputStream;
import
java.util.Properties;
import
javax.activation.DataHandler;
import
javax.activation.DataSource;
import
javax.activation.FileDataSource;
import
javax.mail.Message;
import
javax.mail.Message.RecipientType;
import
javax.mail.Address;
import
javax.mail.Multipart;
import
javax.mail.Session;
import
javax.mail.Transport;
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 Administrator
*
*/
public
class
Demo4 {
public
static
void
main(String[] args)
throws
Exception {
Properties props =
new
Properties();
props.setProperty(
"mail.smtp.auth"
,
"true"
);
props.setProperty(
"mail.transport.protocol"
,
"smtp"
);
Session session = Session.getInstance(props);
session.setDebug(
true
);
Message msg =
new
MimeMessage(session);
/*邮件消息头设置*/
//使用MimeUtility.encodeText()方法对中文进行编码(base64或QP)
msg.setFrom(
new
InternetAddress(
"\""
+ MimeUtility.encodeText(
"张益达sss"
) +
"\" <zyh5540@163.com>"
));
msg.setReplyTo(
new
Address[]{
new
InternetAddress(
"zyh5540@163.com"
)});
//友好名称和邮箱地址之间不要忘了有一空格,邮箱地址之间用逗号分隔
//如:张益达sohu <zyh5540@sohu.com>,张益达qq <554077931@qq.com>,张益达163 <zyh5540@163.com>
msg.setRecipients(RecipientType.TO,InternetAddress.parse(MimeUtility.encodeText(
"张益达sohu"
) +
" <zyh5540@sohu.com>,"
+ MimeUtility.encodeText(
"张益达qq"
) +
" <554077931@qq.com>,"
+ MimeUtility.encodeText(
"张益达sina"
) +
" <zyh5540@sina.com>,"
+ MimeUtility.encodeText(
"张益达163"
) +
" <zyh5540@163.com>"
));
msg.setSubject(
"From 163 这是一封复杂邮件"
);
/*邮件消息内容设置,包括两个附件和一段正文*/
Multipart msgPart =
new
MimeMultipart(
"mixed"
);
msg.setContent(msgPart);
MimeBodyPart body =
new
MimeBodyPart();
//表示正文
MimeBodyPart attach1 =
new
MimeBodyPart();
//表示附件1
MimeBodyPart attach2 =
new
MimeBodyPart();
//表示附件2
msgPart.addBodyPart(body);
msgPart.addBodyPart(attach1);
msgPart.addBodyPart(attach2);
/*以下为设置正文*/
/*正文是文字和图片混合的*/
Multipart contentPart =
new
MimeMultipart(
"related"
);
body.setContent(contentPart);
MimeBodyPart content =
new
MimeBodyPart();
//文字
MimeBodyPart img =
new
MimeBodyPart();
//图片
contentPart.addBodyPart(content);
contentPart.addBodyPart(img);
DataSource fileds =
new
ByteArrayDataSource(
new
FileInputStream(
"D:\\picture\\jpg\\touxiang.jpg"
),
"image/jpeg"
);
DataHandler imgDataHandler =
new
DataHandler(fileds);
img.setDataHandler(imgDataHandler);
img.setHeader(
"Content-ID"
,
"<touxiang.jpg>"
);
img.setFileName(MimeUtility.encodeText(
"头像.jpg"
));
//设置文字内容
content.setContent(
"<div style="
color:red;font-size:18px;
">从163发来的邮件</div>:我这里有一张图片<img style="
display: none;
" src="
" alt="
touxiang
" height="
100px
" width="
\"100px\"
"><img alt="
加载中...
" title="
图片加载中...
" src="
http:
//www.2cto.com/statics/images/s_nopic.gif">,好看吗?", "text/html;charset=utf-8");
/*正文内容设置结束*/
/*下面为设置附件*/
attach1.setDataHandler(
new
DataHandler(
new
FileDataSource(
"E:\\others\\firefox.txt"
)));
attach1.setFileName(MimeUtility.encodeText(
"文件1.txt"
));
attach2.setDataHandler(
new
DataHandler(
new
FileDataSource(
"E:\\others\\java.txt"
)));
attach2.setFileName(MimeUtility.encodeText(
"file文件2.txt"
));
msg.saveChanges();
OutputStream os =
new
FileOutputStream(
"E:\\demo4.eml"
);
msg.writeTo(os);
os.close();
Transport trans = session.getTransport();
trans.connect(
"smtp.163.com"
,
25
,
"zyh5540"
,
"test"
);
trans.sendMessage(msg,msg.getAllRecipients());
相关推荐
解决了客户使用该插件上传中文名称的附件会出线的乱码问题
java下载附件中文乱码
Java实现文件下载并解决中文文件名乱码
Overleaf直接编译:解决计算机学报模板乱码和跨页隐藏的问题。
全书一共被压缩为5个rar,这是第四个!!!! 其他的请看ID:ljtt123(本人分享) 本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何...
Java开发乱码问题解决方法: 以下是个人知道的方法汇总
我当前调试的是kettle 5.4.0.1版本,修复job中发送邮件时候中文乱码问题: 替换 data-integration\lib\kettle-engine-5.4.0.1-130.jar 这个jar包下 data-integration\lib\kettle-engine-5.4.0.1-130.jar\org\...
乱码解决 乱码解决 乱码解决 乱码解决 乱码解决 乱码解决 乱码解决
Java开发必读 解决Java EE的乱码问题
解决java web开发中遇到的前后台传值乱码问题。
JAVA反编译文件解决中文乱码问题
java解决中文乱码问题
java 中文乱码浅析及解决方案
很好用,很全面的解决java Web开发的解决中文乱码的文档
java编程中乱码问题解决方案,解决一些常见的java开发环境中的乱码问题
java中文乱码解决问题
java压缩文件成zip实现无乱码 内置类与jar包
Java生成PDF完整示例,并解决中文乱码问题, 内有生成PDF相关的三个包, iText-2.0.8.jar, iTextAsian.jar, iTextAsianCmaps.jar
解决java压缩zip文件时的中文乱码问题 ...实现:java压缩文件成zip实现无乱码。 包括:写好的工具类与jar包。 使用方法:导入ant.jar包,调用CompressExcelOperate中的方法,即可实现压缩文件,并保证没有中文乱码。
解决JAVA读取properties中文乱码问题