我用DELPHI + INDY 编了个"POP3协议收到邮件"程序.
但收到的邮件其标题、发信人地址都是乱码。英文都是好的。

解决方案 »

  1.   

    通过如下函数对Subject或其它信息进行处理。
    CheckTxt(Msg.Subject) 
    CheckTxt(Msg.From.Text)
    -----------------------------------------
    function CheckTxt(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  if Copy(s,s2,2)='?=' then Break;
            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:=Copy(s,1,s1-1)+v+Copy(s,s2+2,999);
    end;