腾讯系统邮件主题乱码,javamail发邮件乱码怎么解决

6494人阅读
Java(56)
最近碰到一个问题,Java发送邮件时,本地没有问题,测试服务器也没问题,但上线后邮件的标题和发件人乱码,正文OK
通过翻阅资料,原因及解决方法如下:
当一段&Text&或者&HTML&通过电子邮件传送时,发送的内容首先通过一种指定的字符编码转化成“字节串”,然后再把“字节串”通过一种指定的传输编码(Content-Transfer-Encoding)进行转化得到另一串“字节串”。比如,打开一封电子邮件源代码,可以看到类似的内容:
Content-Type:&text/charset=&gb2312&
Content-Transfer-Encoding:&base64
sbG+qcrQuqO17cf4yee74bGjz9W7+b3wudzA7dbQ0MQNCg0KvPKzxqO6uqO17cnnsaPW0NDEDQoNCg==
最常用的&Content-Transfer-Encoding&有&Base64&和&Quoted-Printable&两种。在对二进制文件或者中文文本进行转化时,Base64&得到的“字节串”比&Quoted-Printable&更短。在对英文文本进行转化时,Quoted-Printable&得到的“字节串”比&Base64&更短。
&&& 邮件的标题,用了一种更简短的格式来标注“字符编码”和“传输编码”。比如,标题内容为&&中&,则在邮件源代码中表示为:
//&正确的标题格式
Subject:&=?GB2312?B?1tA=?=
第一个“=?”与“?”中间的部分指定了字符编码,在这个例子中指定的是&GB2312。&
“?”与“?”中间的“B”代表&Base64。如果是“Q”则代表&Quoted-Printable。&
最后“?”与“?=”之间的部分,就是经过&GB2312&转化成字节串,再经过Base64&转化后的标题内容。&
如果“传输编码”改为&Quoted-Printable,同样,如果标题内容为&&中&:
//&正确的标题格式
Subject:&=?GB2312?Q?=D6=D0?=
&&& 如果阅读邮件时出现乱码,一般是因为“字符编码”或“传输编码”指定有误,或者是没有指定。比如,有的发邮件组件在发送邮件时,标题&&中&:
//&错误的标题格式
Subject:&=?ISO-8859-1?Q?=D6=D0?=
这样的表示,实际上是明确指明了标题为&[0x00D6,&0x00D0],即&&??&,而不是&&中&。
解决方法:
//设置邮件主题
message.setSubject(MimeUtility.encodeText(mail_subject,MimeUtility.mimeCharset(&gb2312&), null));
message.setContent(sendmessage, &text/charset=gbk&); // 设置邮件格式
message.setSentDate(new Date()); // 设置邮件发送日期
//设置邮件发件人名称
Address address = new InternetAddress(usernames, MimeUtility.encodeText(personalName,MimeUtility.mimeCharset(&gb2312&), null));
下面方法也测试了,但没有成功,邮件主题和发件人依然乱码:
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
message.setSubject(&=?GB2312?B?&+enc.encode(mail_subject.getBytes())+&?=&);
参考资料:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1083894次
积分:6611
积分:6611
排名:第3714名
原创:90篇
转载:56篇
评论:120条
(1)(3)(10)(1)(16)(5)(9)(7)(1)(8)(1)(13)(22)(6)(20)(20)(4)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'javamail彻底解决中文乱码的方法 - 刘政道 - 博客园
《31天学会CRM项目开发(C#编程入门及项目实战)》作者,IT经理,程序员
posts - 174, comments - 70, trackbacks - 0, articles - 3
用javamail以来,一直被中文乱码困扰,虽然90%的邮件都正常,但是剩下10%的乱码确实让人心里疙疙瘩瘩。通过代码subject = MimeUtility.decodeText(mimeMessage.getSubject());subject = MimeUtility.decodeText(subject);获取的subject大部分都是正确的,但偶尔出现乱码,网上给出解决办法,subject = new String(subject.getBytes("ISO8859_1"), "GBK"),的确解决了乱码问题,但是以前正确的就变成了乱码。能不能只把乱码的进行转换,要想转换的话就必须知道是不是乱码,只有是乱码的情况下我们需要尝试用GBK转换。那么如何知道是否有乱码呢?要是能知道subject的字符集就好了,但是这条路是行不通的,至少并不是完美的解决办法。那么如何呢?我以为只要有中文就可能存在乱码,那么如果subject中没有中文,就可以怀疑他是乱码,我们就尝试进行GBK转换String regEx = "[\\u4e00-\\u9fa5]";Pattern p = pile(regEx);Matcher m = p.matcher(subject);if(!m.find()){&& &subject = new String(subject.getBytes("ISO8859_1"), "GBK");&& &subject = MimeUtility.decodeText(subject);}可能影响效率,但是确实管用。java mail 纯文本附件乱码的解决方案 - balaschen - ITeye博客
博客分类:
java mail在发送纯文本附件时,当附件内容的编码和jvm缺省的编码不一致时,出现乱码。原因时java mail处理纯文本附件,使用text_plain这个datacontenthandler来处理,而text_plain又简单的使用jvm缺省编码来读取文件内容(可以使用file.encode和mail.mime.charset系统属性来更改),两者不一致时,自然就乱码了找到的问题的原因,也就容易解决了,一种方法就是把所有的附件类新全部设成application/octet-stream,把附件作为二进制流,还有一种就是当附件是存文本时,通过BOM(byte order mark)来探测文件的编码类型。 扩展FileDataSource,处理ContentType类型: public class MyFileDataSource extends FileDataSource {
private static final String DEFAULT_CONTENT_TYPE = "application/octet-stream";
private final static Pattern pattern = pile("^text/");
private String contentT
private int head_count=0;
public MyFileDataSource(File file) {
super(file);
determinateType();
private void determinateType(){
contentType = super.getContentType();
Matcher m = pattern.matcher(contentType);
if(m.find() && getFile().exists() && getFile().isFile()){
InputStream in =
in = new FileInputStream(getFile());
if(is_utf_8(in)){
contentType = contentType + "; charset=utf-8";
head_count = 3;
contentType = DEFAULT_CONTENT_TYPE;
} catch (IOException e) {
contentType = DEFAULT_CONTENT_TYPE;
} finally {
if(in!=null) {
in.close();
} catch (IOException e1) {
public MyFileDataSource(String s) {
this(new File(s));
public InputStream getInputStream() throws IOException {
InputStream in = super.getInputStream();
for(int i=0;i&head_i++) in.read();
public String getContentType() {
return contentT
private boolean is_utf_8(InputStream in) throws IOException{
byte[] b3 = new byte[3];
int count = in.read(b3, 0, 3);
if(count&3)
int b0 = b3[0] & 0xFF;
int b1 = b3[1] & 0xFF;
int b2 = b3[2] & 0xFF;
if (b0 == 0xEF && b1 == 0xBB && b2 == 0xBF){
} 使用:public static void main(String[] args) throws Exception {
String host = "your host";
String from = "mail from addr";
String to = "to addr";
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
props.put("mail.transport.protocol", "smtp");
Session session = Session.getInstance(props, null);
session.setDebug(true);
System.setProperty("mail.mime.charset", "utf-8");
MimeMessage message = new MimeMessage(session);
message.setSentDate(new Date());
message.setFrom(new InternetAddress(from,"test"));
message.setRecipients(Message.RecipientType.TO, new InternetAddress[] {new InternetAddress(to)});
message.setSubject("测试");
String html="&html&&head&&/head&\r\n\r\n &body&&h1&测试htmlmail&/h1&&img src=\"cid:aaaaaaa\"&&/body&&/html&";
MimeMultipart multipart = new MimeMultipart("related");
MimeBodyPart html_body = new MimeBodyPart();
html_body.setContent(html,"text/ charset=utf-8");
multipart.addBodyPart(html_body);
MimeBodyPart file = new MimeBodyPart();
//file.attachFile("d:\\aa.txt");
FileDataSource fds = new MyFileDataSource("d:\\test.txt");
file.setDataHandler(new DataHandler(fds));
multipart.addBodyPart(file);
message.setContent(multipart);
Transport transport = session.getTransport();
transport.connect(host, 25, "×××", "×××");
transport.sendMessage(message, message.getAllRecipients());
} finally {
transport.close();
浏览: 150032 次
.net可以在不使用证书的情况下修改密码,java做不到吗?
你好,我也遇到这个问题了,但是按照你的方法还是附件中文还是乱码 ...
can4you 写道 请教问题:你好,请教一个问题,我现在要模 ...
* Created:
请教问题:你好,请教一个问题,我现在要模拟两个事务同时更新一 ...腾讯客服--Foxmail-Foxmail的邮件内容或主题乱码怎么办?
Foxmail的邮件内容或主题乱码怎么办?
阅读邮件时,如果邮件内容或主题显示为乱码,通常是因为没有以正确的语言编码显示该邮件。可以通过以下方法进行设置:
1、如果不清楚邮件采用何种语言编码,请单击&编码&菜单下的&自动选择&,Foxmail将根据邮件内容,自动选择一种最合适的编码;
2、如果知道该邮件应采用何种语言编码,请手工选择一种编码:单击窗口的&查看&菜单,指向&编码&,然后单击正确的语言编码。
以上信息是否已解决您的问题?

我要回帖

更多关于 java发送邮件附件乱码 的文章

 

随机推荐