回 帖 发 新 帖 刷新版面

主题:求POP3 邮件接收程序乱码解决方案

小弟近日做了一个POP3邮件的VB.Net程序

发现收到的邮件中文都变成乱码了;
使用的POP3服务器是网易的!

大家有没有碰到这种情况?

发表一下各自的看法,回贴送分[em5]

回复列表 (共5个回复)

沙发

看看编码

板凳


编码我已经看过了。
邮件头采用 Base64 
邮件体采用 QP编码
邮件体带有HTML 的程序

3 楼

编码转换
Base64(Msg.Subject);//得到的是真正的标题
函数如下:(原封不动拷过去就可以用了)
//----Base64编码转换----//
function TFm_AccEmail.DecodeBase64(s: string): String;
var
  s1,s2,s3: integer;
  t,v: string;
  Encoding: char;
  hex,step: integer;
  a1: array[1..4] of byte;
  b1: array[1..3] of byte;
  j:  integer;
  byte_ptr,real_bytes: integer;
begin
  s1:=Pos('=?',s);
  s2:= 1 ;
  hex:= 0 ;
  if s1>0 then
  begin
    for s2:=Length(s)-1 downto 1 do
    begin
      if Copy(s,s2,2)='?=' then Break;
    end;
  end;
  if (s1=0) or (s2=1) then
  begin
    Result:=s;
    Exit;
  end;
  t:=Copy(s,s1+2,s2-2-s1);
  s3:=Pos('?',t);
  Delete(t,1,s3);
  if(t='')then
  begin
    Result:= s;
    Exit ;
  end ;
  Encoding:=t[1];
  Delete(t,1,2);
  v:='';
  step:=0;
  case Encoding of
  'Q':
    while t<>'' do
    begin
      case step of
      0:
        begin
          case t[1] of
          '_': v:=v+' ';
          '=': step:=1;
          else v:=v+t[1];
          end;
        end;
      1:
        begin
          if t[1]<='9' then hex:=(Ord(t[1])-Ord('0'))*16
          else hex:=(Ord(t[1])-55)*16;
          step:=2;
        end;
      2:
        begin
          if t[1]<='9' then hex:=hex+(Ord(t[1])-Ord('0'))
          else hex:=hex+Ord(t[1])-55;
          v:=v+Chr(hex);
          step:=0;
        end;
      end;
      Delete(t,1,1);
    end;
  'B':
    begin
      byte_ptr:=0;
      for j:=1 to Length(t) do
      begin
              Inc(byte_ptr);
              case t[j] of
              'A'..'Z': a1[byte_ptr]:=Ord(t[j])-65;
              'a'..'z': a1[byte_ptr]:=Ord(t[j])-71;
              '0'..'9': a1[byte_ptr]:=Ord(t[j])+4;
              '+': a1[byte_ptr]:=62;
              '/': a1[byte_ptr]:=63;
              '=': a1[byte_ptr]:=64;
              end;
              if byte_ptr=4 then
              begin
                      byte_ptr:=0;
                      real_bytes:=3;
                      if a1[1]=64 then real_bytes:=0;
                      if a1[3]=64 then
                      begin
                              a1[3]:=0;
                              a1[4]:=0;
                              real_bytes:=1;
                      end;
                      if a1[4]=64 then
                      begin
                              a1[4]:=0;
                              real_bytes:=2;
                      end;
                      b1[1]:=a1[1]*4+(a1[2] div 16);
                      b1[2]:=(a1[2] mod 16)*16+(a1[3]div 4);
                      b1[3]:=(a1[3] mod 4)*64 +a1[4];
                      if(real_bytes>0)then
                        v:= v + chr(b1[1]) ;
                      if(real_bytes>1)then
                        v:= v + chr(b1[2]) ;
                      if(real_bytes>2)then
                        v:= v + chr(b1[3]) ;
              end;
      end;
    end;
  end;
  Result := v;
end;

4 楼

忘了跟你说,我用的是Delphi语言实现的
换汤不换药,转换一下就可以了

5 楼

谢谢!~
不过,我这个问题我想我已经知道该怎么解决了!
不过还是要感谢大家

我来回复

您尚未登录,请登录后再回复。点此登录或注册