`

乱码的处理!程序员永远无法避免的话题 - 4

    博客分类:
  • Java
 
阅读更多

 6、Common Mail乱码问题

  

 

以下是引用片段:
  common mail是一个小而方便的mail包,他实现了对Java Mail的封装,使用起来十分的方便,但是我在使用他的时候发现,使用纯文本的内容发送,结果是乱码,代码如下: 
  public class TestCommonMail { 
  public static void main(String[] args) throws EmailException, MessagingException { 
  SimpleEmail email = new SimpleEmail(); 
  email.setCharset("GB2312"); 
  email.setHostName("smtp.163.com"); 
  email.setSubject("test"); 
  email.addTo(" test@163.com "); 
  email.setFrom(" test@163.com "); 
  email.setMsg("我的测试"); 
  email.setAuthentication("test", "test"); 
  email.send(); 
  } 
  }

 

  分析了一下commons mail的源码找到了原因。

 

以下是引用片段:
源码如下: 
  public class SimpleEmail extends Email 
  { 
  public Email setMsg(String msg) throws EmailException, MessagingException 
  { 
  if (EmailUtils.isEmpty(msg)) 
  { 
  throw new EmailException("Invalid message supplied"); 
  } 
  setContent(msg, TEXT_PLAIN); 
  return this; 
  } 
  } 
  Email代码片段 
  public void setContent(Object aObject, String aContentType) 
  { 
  this.content = aObject; 
  if (EmailUtils.isEmpty(aContentType)) 
  { 
  this.contentType = null; 
  } 
  else 
  { 
  // set the content type 
  this.contentType = aContentType; 
  // set the charset if the input was properly formed 
  String strMarker = "; charset="; 
  int charsetPos = aContentType.toLowerCase().indexOf(strMarker); 
  if (charsetPos != -1) 
  { 
  // find the next space (after the marker) 
  charsetPos += strMarker.length(); 
  int intCharsetEnd = 
  aContentType.toLowerCase().indexOf(" ", charsetPos); 
  if (intCharsetEnd != -1) 
  { 
  this.charset = 
  aContentType.substring(charsetPos, intCharsetEnd); 
  } 
  else 
  { 
  this.charset = aContentType.substring(charsetPos); 
  } 
  } 
  } 
  } 
  email.send();的send方法将调用 
  public void buildMimeMessage() throws EmailException 
  { 
  try 
  { 
  this.getMailSession(); 
  this.message = new MimeMessage(this.session); 
  if (EmailUtils.isNotEmpty(this.subject)) 
  { 
  if (EmailUtils.isNotEmpty(this.charset)) 
  { 
  this.message.setSubject(this.subject, this.charset); 
  } 
  else 
  { 
  this.message.setSubject(this.subject); 
  } 
  } 
  // ======================================================== 
  // Start of replacement code 
  if (this.content != null) 
  { 
  this.message.setContent(this.content, this.contentType); 
  } 
  // end of replacement code 
  // ======================================================== 
  else if (this.emailBody != null) 
  { 
  this.message.setContent(this.emailBody); 
  } 
  else 
  { 
  this.message.setContent("", Email.TEXT_PLAIN); 
  } 
  if (this.fromAddress != null) 
  { 
  this.message.setFrom(this.fromAddress); 
  } 
  else 
  { 
  throw new EmailException("Sender address required"); 
  } 
  if (this.toList.size() + this.ccList.size() + this.bccList.size() == 0) 
  { 
  throw new EmailException( 
  "At least one receiver address required"); 
  } 
  if (this.toList.size() > 0) 
  { 
  this.message.setRecipients( 
  Message.RecipientType.TO, 
  this.toInternetAddressArray(this.toList)); 
  } 
  if (this.ccList.size() > 0) 
  { 
  this.message.setRecipients( 
  Message.RecipientType.CC, 
  this.toInternetAddressArray(this.ccList)); 
  } 
  if (this.bccList.size() > 0) 
  { 
  this.message.setRecipients( 
  Message.RecipientType.BCC, 
  this.toInternetAddressArray(this.bccList)); 
  } 
  if (this.replyList.size() > 0) 
  { 
  this.message.setReplyTo( 
  this.toInternetAddressArray(this.replyList)); 
  } 
  if (this.headers.size() > 0) 
  { 
  Iterator iterHeaderKeys = this.headers.keySet().iterator(); 
  while (iterHeaderKeys.hasNext()) 
  { 
  String name = (String) iterHeaderKeys.next(); 
  String value = (String) headers.get(name); 
  this.message.addHeader(name, value); 
  } 
  } 
  if (this.message.getSentDate() == null) 
  { 
  this.message.setSentDate(getSentDate()); 
  } 
  if (this.popBeforeSmtp) 
  { 
  Store store = session.getStore("pop3"); 
  store.connect(this.popHost, this.popUsername, this.popPassword); 
  } 
  } 
  catch (MessagingException me) 
  { 
  throw new EmailException(me); 
  } 
  }

 

  由代码可以知道纯文本方式最终调用了Java Mail的

  message.setContent(this.content, this.contentType);

  content是内容

  contentType是类型,如text/plain,

  (我们可以试试直接用Java mail发邮件,设置文本内容不使用setText方法,也使用setContent("测试", "text/plain")方式,你可以看到内容也是乱码)

  关键就在于text/plain,我们改成text/plain;charset=gb2312,ok乱码解决了。在commons mail我们看SimpleEmail 类中setMsg方法调用的就是 setContent(msg, TEXT_PLAIN);我们只需要将Email类中的常量TEXT_PLAIN修改一下加入 charset=你的字符集 ,重新打包jar,这样就可以了 。

分享到:
评论

相关推荐

    java乱码处理汇总

    乱码的处理!程序员永远无法避免的话题,解决乱码总汇

    Java避免UTF-8的csv文件打开中文出现乱码的方法

    Java避免UTF-8的csv文件打开中文出现乱码的方法 在Java中,避免UTF-8的csv文件打开中文出现乱码的方法是非常重要的。csv文件是 comma separated values 的缩写,常用于数据交换和导入导出操作。然而,在Java中读取...

    乱码处理文件 乱码处理文件

    乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理...

    2021年台州地区网页程序员岗位薪酬水平报告-最新数据.pdf

    最后,报告中提到的“001▇本次薪酬调研岗位列表一X”可能是报告中岗位列表的一个部分,但由于扫描文本中出现了乱码,这部分内容的具体含义无法准确理解。但可以确定的是,岗位列表应该是详细的各行业或各部门岗位...

    web开发中url乱码处理

    8. **注意事项**:确保在整个Web应用程序中保持编码的一致性,包括数据库连接、文件读写、响应输出等环节,都应使用相同的字符编码,以避免出现乱码问题。 总之,解决URL乱码问题需要理解URL编码机制,正确设置页面...

    Serv-U9.x 无法上传文件名为中文和出现乱码解决!

    这一步骤的目的是避免服务器强制使用UTF-8编码,而是采用与客户端相匹配的编码格式进行通信,减少乱码的产生。 ### 四、总结 通过上述步骤,可以有效解决Serv-U9.x版本FTP服务器在处理中文文件名时出现的乱码和...

    程序中关于乱码的处理

    【乱码处理】在中国,程序员经常需要面对的一个挑战就是乱码问题,这主要源于中英文字符编码的不同。编码机制是导致乱码的核心原因,中文字符通常使用GBK或GB2312等编码,而英文字符则普遍采用ASCII或Unicode。如果...

    oracle乱码解决功能!!!

    oracle乱码解决功能 Oracle乱码解决功能是指在使用Oracle数据库时,汉字显示异常的解决方法。这种问题的产生是由于字符集的设置不当所致。字符集是Oracle为适应不同语言文字显示而设定的,用于汉字显示的字符集...

    解决web中文乱码

    在处理乱码问题时,我们可以通过Filter来设置合适的字符编码,确保数据的正确解码和编码。 三、Filter实现中文乱码解决方案 1. 创建Filter类: 首先,我们需要创建一个实现javax.servlet.Filter接口的类,例如命名...

    提交数据到服务器中文乱码处理

    当涉及到将中文数据提交到服务器时,由于编码格式不匹配或者处理不当,可能会导致接收方接收到的数据显示为乱码。要解决这个问题,我们需要理解字符编码的基本原理,并采取相应的策略来确保数据在传输过程中的完整性...

    乱码处理操作类

    在IT行业中,乱码问题是一个常见的困扰,尤其是在处理多语言环境或者进行数据传输时。"乱码处理操作类"指的是为了正确显示或处理文本而设计的特定代码类,通常用于解决Java SSH(Spring、Struts、Hibernate)框架下...

    Java中文乱码浅析及解决方案

    Java 中文乱码问题是一个常见的编程困扰,尤其对于处理中文字符的Java程序而言。这个问题通常源于字符编码...通过细心配置和适当地指定编码,我们可以有效地避免乱码问题,确保程序在各种环境中都能正确处理中文字符。

    处理pdfmarker中文乱码及内存溢出的处理

    4. **使用流处理**:利用Node.js的流API,可以逐步生成和写入PDF,而不是一次性生成整个文档,从而减少内存占用。 5. **升级Node.js版本**:新版本的Node.js通常包含更好的内存管理和优化,升级可能有助于解决问题...

    c#汉字乱码处理

    在C#编程中,处理汉字乱码问题是一个常见的需求,尤其是在读取或写入文本文件时。当在C#控制台应用中遇到汉字输出乱码的情况,这通常是因为编码不匹配所导致的。编码是字符集与二进制数据之间的转换规则,不同的系统...

    乱码解决 乱码解决 乱码解决 乱码解决 乱码解决

    乱码通常指的是字符显示不正确或无法识别,这可能由于编码格式不匹配、文件损坏、程序设置不当等原因引起。下面将详细讨论乱码产生的原因、解决方案以及如何预防。 一、乱码产生的原因 1. **编码格式不一致**:...

    maven-javadoc-plugin 中文 注释 API 解决乱码 pom xml

    在默认情况下,`maven-javadoc-plugin`插件在生成Javadoc文档时采用的是ISO-8859-1编码格式,这种编码方式无法正确解析中文字符,从而导致中文乱码现象。 ##### 2.2 解决方案 - **POM文件配置** 在`pom.xml`文件...

    中文乱码处理问题总结

    ### 中文乱码处理问题总结 #### 一、引言 在进行中文字符处理时,经常会出现乱码问题。这主要是因为不同的系统、程序或组件可能采用不同的编码方式,而这些编码方式之间的转换不当就会导致乱码现象。本文将重点...

    MFC类库中文手册(字体加大,爽眼版)

    这文件,我也不知为毛,下载后“文件名字”会出现一些乱码,请将乱码删除后,便可打开,不关我的事,是网站系统造成的! 好吧,这个中文手册,原来网上就有,但是哥下载后,发现字体尽其过份地小,看着很累,很不爽...

    乱码 编码方式解决 gbk ISO8859-1 utf8 编码

    3. **软件编码识别错误**:部分软件可能无法准确识别文件的编码格式,尤其是在处理非标准编码或混合编码的文件时。 **解决方法**: 1. **手动指定编码**:在编程时,可以显式指定文件的编码格式,例如在Java中使用...

    servlet与jsp中文乱码处理

    然而,在处理中文字符时,由于编码不一致或者处理不当,可能会出现中文乱码问题。这个问题困扰了很多开发者,但通过了解编码原理和采用正确的方法,可以有效地解决。下面将详细阐述servlet和jsp中文乱码的处理方式。...

Global site tag (gtag.js) - Google Analytics