*****高分再问POP3返回值解码问题*****

beegee 2003-08-26 11:38:14
利用POP3协议从邮件服务器得到邮件信息,但解码始终未解决,搜索了很多贴子解决得也不好。

尤其是中英文混杂的邮件内容或标题,如何解析?
如:“微软Microsoft国际商用机器公司IBM”,用POP3得到的内容是:“=CE=A2=C8=EDMicrosoft=B9=FA=BC=CA=C9=CC=D3=C3=BB=FA=C6=F7=B9=AB=CB=BEIBM=”,如何解析?
对于“=CE=A2=C8=ED”之内的代码,似乎还是可以解析的,但一但混合起来,怎么办?
另外,谁有代POP3功能的w3 jmail?可以发给我吗?我在下载的Free版本没有POP3功能:-(
...全文
13 点赞 收藏 14
写回复
14 条回复
humin1906 2003年09月08日
ynzaichun,你好。你有的话能给我也发一份吗,我急需。万分感谢!!!
humin1906@sina.com
回复 点赞
beegee 2003年09月02日
ynzaichun,你有pop3的.NET组件?能发给我吗?
我的邮件是:
lihq@zt.com.cn
谢谢了!我一定加分!
回复 点赞
yuzaichun 2003年08月31日
我有pop3的.net组件,你要么?
回复 点赞
beegee 2003年08月28日
另外请问dwg_cn及所有高手,如果Content-Transfer-Encoding:是8bit或7bit怎么解析啊?
回复 点赞
beegee 2003年08月28日
多谢各位!我主要是想解决混杂时如何解析的问题。提问的同时我也作了摸索,完成以下代码,结构很差,但可以用:
//专解析QP汉语
string DeCode(string input)
{
System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("gb2312");
string temp;
int cnt=0;
for(int i=0;i!=-1;i=input.IndexOf("=",i+1))
cnt++;
byte[] b=new byte[cnt];
cnt=0;
for(int i=0;i!=-1;i=input.IndexOf("=",i+1))
{
temp=input.Substring(i+1,2);
b[cnt++]=byte.Parse(temp,System.Globalization.NumberStyles.HexNumber);
}
return encoding.GetString(b);
}
bool IsHex(char chr)
{
int ichr=Convert.ToInt16(chr);
if (((ichr>=48)&&(ichr<=57))||((ichr>=65)&&(ichr<=70)))
return true;
else
return false;
}

//主要函数
string QPDecode(string input)
{
string strRtn = "";
string strCanDecode="";
int ilen = input.Length;
//
for (int i = 0; i < ilen; i++)
{
//
if((i<ilen-1)&&(input[i]=='='))
{
char chrNextOne = input[i+1];
char chrNextSnd = input[i+2];
if (IsHex(chrNextOne)&&IsHex(chrNextSnd))
{
//如果是该轮搜索的第一次,就设定为开始索引
strCanDecode += input.Substring(i,3);
i++;
i++;
}//如果连续两字符都是16进制字符
else
{
strRtn += Convert.ToString(input[i]);
}
}
else
{
if (strCanDecode !="")
{
strRtn += DeCode(strCanDecode);
strCanDecode = "";
}
strRtn+=Convert.ToString(input[i]);
}
}
if (strCanDecode !="")
{
strRtn += DeCode(strCanDecode);
strCanDecode = "";
}
return strRtn;
}

//检查字符是否为软回车结束
bool IsReturn(string input)
{
int ilen = input.Length;
if (ilen==0)
return false;
if (input[ilen-1]=='=')
return true;
else
return false;
}

//剪去软回车
string CodeTrim(string input)
{
if (!IsReturn(input))
return input;
int ilen = input.Length;
string strRtn=input.Substring(0,ilen-1);
return strRtn;
}
回复 点赞
beegee 2003年08月28日
谢谢各位!但不知道是不是先前没有把问题说清楚,我是说混杂时如何解析!而且还要出来软回车问题。我自己提问的同时也在琢磨,尝试写了如下代码,结构不好,但基本解决问题:
string DeCode(string input)
{
System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("gb2312");
string temp;
int cnt=0;
for(int i=0;i!=-1;i=input.IndexOf("=",i+1))
cnt++;
byte[] b=new byte[cnt];
cnt=0;
for(int i=0;i!=-1;i=input.IndexOf("=",i+1))
{
temp=input.Substring(i+1,2);
b[cnt++]=byte.Parse(temp,System.Globalization.NumberStyles.HexNumber);
}
return encoding.GetString(b);
}
bool IsHex(char chr)
{
int ichr=Convert.ToInt16(chr);
if (((ichr>=48)&&(ichr<=57))||((ichr>=65)&&(ichr<=70)))
return true;
else
return false;
}

string QPDecode(string input)
{
string strRtn = "";
string strCanDecode="";
int ilen = input.Length;
//
for (int i = 0; i < ilen; i++)
{
//
if((i<ilen-1)&&(input[i]=='='))
{
char chrNextOne = input[i+1];
char chrNextSnd = input[i+2];
if (IsHex(chrNextOne)&&IsHex(chrNextSnd))
{
//如果是该轮搜索的第一次,就设定为开始索引
strCanDecode += input.Substring(i,3);
i++;
i++;
}//如果连续两字符都是16进制字符
else
{
strRtn += Convert.ToString(input[i]);
}
}
else
{
if (strCanDecode !="")
{
strRtn += DeCode(strCanDecode);
strCanDecode = "";
}
strRtn+=Convert.ToString(input[i]);
}
}
if (strCanDecode !="")
{
strRtn += DeCode(strCanDecode);
strCanDecode = "";
}
return strRtn;
}

//检查字符是否为软回车结束
bool IsReturn(string input)
{
//
int ilen = input.Length;
if (ilen==0)
return false;
//
if (input[ilen-1]=='=')
return true;
else
return false;
}

//剪去软回车
string CodeTrim(string input)
{
//
if (!IsReturn(input))
return input;
int ilen = input.Length;
string strRtn=input.Substring(0,ilen-1);
return strRtn;
}
回复 点赞
rqxiang 2003年08月27日
关注,学习,顶!望有牛人答复!
回复 点赞
hjcy_2002 2003年08月27日
呵呵
回复 点赞
jjstar 2003年08月27日
打个标,正琢磨这个呢
回复 点赞
beegee 2003年08月27日
自己up 一下
回复 点赞
dwg_cn 2003年08月27日
刚好我得到了解码的程序

/// <summary>
/// quoted-printable解码程序.
/// </summary>
/// <param name="encoding">解码目标字符集</param>
/// <param name="data">需要解码的字符串</param>
/// <returns></returns>
public static string QDecode(System.Text.Encoding encoding,string data)
{
MemoryStream strm = new MemoryStream(System.Text.Encoding.Default.GetBytes(data));

int b = strm.ReadByte();

MemoryStream dStrm = new MemoryStream();

while(b > -1){
// Hex eg. =E4
if(b == '='){
byte[] buf = new byte[2];
strm.Read(buf,0,2);
if(!(buf[0] == '\r' && buf[1] == '\n')){
int val = int.Parse(System.Text.Encoding.Default.GetString(buf),System.Globalization.NumberStyles.HexNumber);
//int val = int.Parse(System.Text.Encoding.Default.GetString(buf));
byte[] temp=new Byte[]{(byte)val};
dStrm.Write(temp,0,temp.Length);
}
}
else{
string encodedChar = encoding.GetString(new byte[]{(byte)b});
byte[] d = System.Text.Encoding.Default.GetBytes(encodedChar);
dStrm.Write(d,0,d.Length);
}

b = strm.ReadByte();
}
return encoding.GetString(dStrm.ToArray());
}
回复 点赞
beegee 2003年08月27日
up
回复 点赞
beegee 2003年08月26日
更多?
回复 点赞
bborn 2003年08月26日
pop3的编码是什么编码?
可以看看vc的资料
好像.net框架里带了不少方便解码的函数
可以试试
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告