卡卡挖

导航

使用JMAIL NET 组件 收取邮件 时 编码出现问题的解决方案

 Jmail接收到的邮件,如果标题的编码方式是UTF-8的话,直接从Base64解码出来的话中文会出现乱码(英文正常),这就导致用Jmail组件收发邮件时有些邮箱的正常,有些邮箱乱码,不够完善。

例如:

QQ邮箱:

  Subject: =?gbk?B?1rG907T4uL28/reiy80=?=

U-Mail邮箱

   Subject: =?utf-8?B?5oiR5b6X57uZ5oiR?=

 

正是因为前几天帮同学弄Jmail收邮件的时候碰到此类问题,所以从网上收集了一些这方面的一些资源,希望能让大家少走点弯路!

 

Jmail的subject共分3段,=?和?=是结束和结尾标记
第一段:utf-8,原来页面的编码方式
第二段:B是指邮件的编码方式B就是base64
第三段:5oiR5b6X57uZ5oiR标题的内容,但是经过Base64编码了
所以出现了QQ邮箱收邮件正常,而收取U-Mail中的邮件时标题乱码的现象,本质就是U-mail用到的是UTF-8编码
看到了本质要解决Jmail收件标题乱码就很简单了。只要获取subject第3个问号和第4个问号间的内容进行base64解码即可。

 

#region base64解码

        public static string base64GbkDecode(string data)

        {

            string decode = "";

            byte[] bytes = Convert.FromBase64String(data);

            try

            {

                decode = Encoding.GetEncoding("gb2312").GetString(bytes);

            }

            catch (Exception ex1)

            {

                //return "Error in base64Encode" + ex1.Message;

            }

            return decode;

        }

        public static string base64Utf8Decode(string data)

        {

            string result = "";

            try

            {

                System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();

                System.Text.Decoder utf8Decode = encoder.GetDecoder();

                byte[] todecode_byte = Convert.FromBase64String(data);

                int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);

                char[] decoded_char = new char[charCount];

                utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);

                result = new String(decoded_char);

            }

            catch (Exception e)

            {

                //return "Error in base64Encode" + e.Message;

            }

            return result;

        }

        //base64解码

        public static string DecodeStr(string allstr, string code)

        {

            //形如=?...?=是结束开始的标志

            //=?utf-8?B?5rWL6K+V5o6l5pS25pys6YKu5Lu26L+Z5piv5Li76aKY?=

            //=?gbk?B?suLK1L3TytXN4rK/08q8/tXiuPbKx9b3zOU=?=

            //返回的字符串

            string str = "";

            if (code == "gbk")

            {

                str = base64GbkDecode(allstr);

            }

            else if (code == "utf-8")

            {

                str = base64Utf8Decode(allstr);

            }

            return str;

        }

        #endregion

调用方法   

public List<Entity.tb_Mail> getMail(string PopServer, int PopPort, string User, string Pass, bool UseSSL,int type)

        {

            List<Entity.tb_Mail> lst = new List<Entity.tb_Mail>();

            using (Pop3Client client = new Pop3Client(PopServer, PopPort, UseSSL, User, Pass))

            {

                //连接POP3服务器并验证用户身份

                client.Authenticate();

                //验证成功,启动接收过程

                client.Stat();

                //枚举所有未读邮件

                

                foreach (Pop3ListItem item in client.List())

                {

                    Entity.tb_Mail tmpTbMail = new Entity.tb_Mail();

                    MailMessageEx message = client.RetrMailMessageEx(item);

                    //保存新邮件到数据库

                    if (!isHaveMail(message.MessageNumber.ToString()))

                    {

                        ///因为Access数据库的字符限制 而且加上邮件的解码 

                        ///保存数据库里的只保存邮件的ID 以此判断服务器上的新邮件数量

                        bool bb = saveMail(message.MessageNumber);

                        //tmpTbMail.mail_Body = message.Body.ToString();

                        tmpTbMail.mail_existId = message.MessageNumber.ToString();

                        tmpTbMail.mail_title = DecodeStr(message.Subject.ToString().Split('?')[3], "utf-8")

                        tmpTbMail.mail_Body = message.Body.ToString();

                        tmpTbMail.mail_getAddress = message.MessageNumber.ToString();

                        lst.Add(tmpTbMail);

                    }

                    else

                    {

                        if (type == 0)

                        {

                            //tmpTbMail.mail_Body = message.Body.ToString();

                            tmpTbMail.mail_existId = message.MessageNumber.ToString();

                            tmpTbMail.mail_title = message.Subject.ToString();

                            tmpTbMail.mail_Body = message.Body.ToString();

                            tmpTbMail.mail_getAddress = message.MessageNumber.ToString();

                            lst.Add(tmpTbMail);

                        }

                    }

                }

                //向POP3服务器发送空信息,表示客户端在线

                client.Noop();

                //重置POP3服务器上的邮件状态

                client.Rset();

                //断开与POP3服务器的连接

                client.Quit();

            }

            return lst;

        }

编辑器加载中...

posted on 2011-07-27 14:51  卡卡挖  阅读(472)  评论(0)    收藏  举报