关于OpenSmtp邮件标题过长后出现乱

smtp

  OpenSmtp 是 .Net 平台上一个不错的邮件发送组件,但是其中存在一些 bug 影响我们的使用,我在使用中遇到了邮件主题长度较大时,邮件出现乱码的情况。
 
    经过检查源代码发现,原来的处理过程存在问题:首先主题是通过 ASCII 编码的,其次,使用了 QP 编码,但没有考虑主题与内容的区别。
 
    在主题中编码时,每一行必须都要单独编码,不可将主题全部编码。
 
    经过与 Outlook Express 对比,在 MailEncoding 类中增加一个方法,专门针对邮件主题进行 Base64 编码

public static string ConvertHeaderToBase64(string s, string charset)
  {
   int lineLength = 40;           // 每行处理 40 个字节
   Encoding encoding = Encoding.GetEncoding( charset );   // 取指定编码
   byte[] buffer = encoding.GetBytes( s );       // 转换为字节码
   StringBuilder sb = new StringBuilder();       // 保存最终结果
   string linebase64 ;           
   int block = buffer.Length%lineLength==0?buffer.Length/lineLength:buffer.Length/lineLength + 1;
   for(int i=0; i< block; i++)
   {
    if( buffer.Length - i*lineLength >=lineLength )
     linebase64 = Convert.ToBase64String( buffer, i*lineLength, lineLength );
    else
     linebase64 = Convert.ToBase64String( buffer, i*lineLength, buffer.Length - i*lineLength);
    sb.Append( "=?" );
    sb.Append( charset );
    sb.Append( "?B?" );
    sb.Append( linebase64 );
    sb.Append( "?=\r\n\t" );
   }
   sb.Remove( sb.Length-3, 3);          // 删除最后的换行符号
   return  sb.ToString();
  }
 
    然后,将 MailMessage 类中的 ToString 方法中对邮件主题的处理修改为调用自定义的方法
 
               
//    sb.Append("Subject: " + MailEncoder.ConvertHeaderToQP(cleanSubject.ToString(), charset) + "\r\n");
    sb.Append("Subject: " + MailEncoder.ConvertHeaderToBase64( cleanSubject.ToString(), charset) + "\r\n");

   重新编译即可

时间: 2024-09-13 23:41:09

关于OpenSmtp邮件标题过长后出现乱的相关文章

php mail发邮件标题中文乱码的问题解决办法

当使用下面的PHP语句发送电子邮件的时候,如果编码和接收邮箱编码不相同,会发现邮件的标题是乱码,而邮件正文却是正确的,如何才能使得邮件标题不是乱码呢? $subject = stripslashes($the_post['Title']); $headers = "MIME-Version: 1.0rn"; $headers .= "Content-type: text/plain; charset=utf-8rn"; $headers .= "Conte

PHP发送UTF-8编码中文邮件标题乱码的解决

当我们使用下面的PHP语句发送中文电子邮件的时候,会发现邮件的标题是乱码,而邮件正文却是正确的,如何才能使得邮件标题不是乱码呢? $subject = stripslashes($the_post[''Title'']); $headers = "MIME-Version: 1.0rn"; $headers .= "Content-type: text/plain; charset=utf-8rn"; $headers .= "Content-Transf

实战总结:邮件标题是邮件营销效果的关键

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 当我们在开展邮件营销活动的时候,往往效果并没有预想的这么好,很多时候我们总是把问题归结于邮件模板的设计,发送的技术问题或者其他因素.但可能问题却出在被你忽略的邮件标题上.下面我通过一个实际案例来向大家描述下邮件标题对邮件营销的效果影响. 去年年末我接到一个客户邮件营销项目,该客户是一家成立没有多久的电子商城平台,主要从事一些品牌服饰的销售业务

用CSS实现标题过长部分用省略号显示

使用方法:在CSS中同时应用width=""; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;才能达到效果. width="";定义显示宽度 overflow:hidden; 溢出隐藏 text-overflow:ellipsis;省略号显示溢出文本内容 white-space:nowrap; 强制文本在一行内显示 用width指它好宽度.overflow:hidden;将超出的内容隐藏就行了

标题过长使用javascript按字节截取字符串_javascript技巧

做为一个前端开发人员在网页展示中经常会碰到,标题过长,需要截取字符串,用CSS的实现的话各种兼容问题,各种坑. 让后台程序截一下,又各种推托,让后台按字节截一下更是和要了后台老命一样,最后可能只会安字符长度给你截一下,最后不好看,对不齐,还是回头整CSS.调兼容: 有以上有感触的前端同学默默点个赞吧. 最近接触一个项目,后台只提供接口(json),所有页面的数据渲染,数据绑定都都交给了前端.终于,不考虑SEO,页面所有的主动权到偶的手中了,不经意间就碰到字节截取老问题了. 网络上流传一个Java

java操作AD域 jar包 标题要长长长

问题描述 java操作AD域 jar包 标题要长长长 java有没有操作AD域用的三方jar包啊 还是说现在只能用jndi? 哪位大婶有的给介绍一个啊

新站改网站标题和描述后如何恢复快照和排名

前些日子林立祥网络营销团队接手了wins1818大赢家娱乐城的推广工作,一直都没有时间更新博客.今天正好抽空更新下林立祥的网络营销博客.借此机会给大家分享一下推广过程中遇到的一些问题,通常也是很多的新站会遇到的问题.正好大家可以借此了解下,不至于遇到情况后不知所措.新站改标题和说明是很危险,轻则快照回档,首页降权,重则网站直接被K.如果不是特殊情况的话,建议大家不轻易的修改标题和描述.老站修改后很容易恢复,因为百度的权重高,所以最多观察几天就恢复了,林立祥网络营销团队反复测试过.下面给大家分享新

xmlhttp Post方法提交数据到服务器端后出现乱字符的问题!!!

xml|服务器|数据|问题 xmlhttp Post方法提交数据到服务器端后出现乱字符的问题!!! 本例子需要两个文件:xmlencode.htm和xmlencode.asp======================================xmlencode.htm============ xmlencode.asp============ 这是孟子E章提供的一个方法,但是不知道该怎么用,怎么和下面的代码加在一起用.strA="submit1=Submit&str="

php mail函数发邮件标题和发件人乱码

使用mail方法发信时,如果标题或发件人含有中文就会造成乱码,而正文不会.解决办法如下 先用函数base64_encode() ? 使用 MIME base64 对数据进行编码 标题字符串前加编码类型例如: =?UTF-8?B? 标题字符串后加:?= 邮件header说明Content-type ? 防止邮件正文也乱码 首先在报文头加入声明  //如果你的网站是GBK,下面将utf-8改为gbk $headers  = 'MIME-Version: 1.0' . "\r\n"; $he