急啊。。谢谢了。

解决方案 »

  1.   

    放一个IdDecoderMIME控件试试。
    我以前做的一个收邮件的内容显示=?GB2312?B?。
    用IdDecoderMIME1.DecodeString();
      

  2.   

    unit   Base64Code;
        
      interface   
        
      uses   
          Windows,   SysUtils, Classes,  StrUtils ,IdCoderQuotedPrintable,IdCoderMIME;
        
          Function   GetMailTitle(Const   Value:   String):   String;
          Function   GetMailSender(Const   value:   String):String;
          const   cBase64:string='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
      implementation  Function   QuotedPrintableEncode(mSource:   String):   String;   
      Var   
          I,   J:   Integer;   
      Begin   
          Result   :=   '';   
          J   :=   0;   
          For   I   :=   1   To   Length(mSource)   Do   Begin   
                  If   mSource[I]   In   [#32..#127,   #13,   #10]   -   ['=']   Then   Begin   
                          Result   :=   Result   +   mSource[I];   
                          Inc(J);   
                      End   Else   Begin   
                          Result   :=   Result   +   '='   +   IntToHex(Ord(mSource[I]),   2);   
                          Inc(J,   3);   
                      End;   
                  If   mSource[I]   In   [#13,   #10]   Then   J   :=   0;   
                  If   J   >=   70   Then   Begin   
                          Result   :=   Result   +   #13#10;   
                          J   :=   0;   
                      End;   
              End;   
      End;   {   QuotedPrintableEncode   }   
        
      Function   QuotedPrintableDecode(mCode:   String):   String;   
      Var   
          I,   J,   L:   Integer;   
      Begin   
          Result   :=   '';   
          J   :=   0;   
          mCode   :=   AdjustLineBreaks(mCode);   
          L   :=   Length(mCode);   
          I   :=   1;   
          While   I   <=   L   Do   Begin   
                  If   mCode[I]   =   '='   Then   Begin   
                          Result   :=   Result   +   Chr(StrToIntDef('$'   +   Copy(mCode,   I   +   1,   2),   0));   
                          Inc(J,   3);   
                          Inc(I,   3);   
                      End   Else   If   mCode[I]   In   [#13,   #10]   Then   Begin   
                          If   J   <   70   Then   Result   :=   Result   +   mCode[I];   
                          If   mCode[I]   =   #10   Then   J   :=   0;   
                          Inc(I);   
                      End   Else   Begin   
                          Result   :=   Result   +   mCode[I];   
                          Inc(J);   
                          Inc(I);   
                      End;   
              End;   
      End;   {   QuotedPrintableDecode   }   
        
      Function   Base64Encode(mSource:   String;   mAddLine:   Boolean   =   True):   String;   
      Var   
          I,   J:   Integer;   
          S:   String;   
      Begin   
          Result   :=   '';   
          J   :=   0;   
          For   I   :=   0   To   Length(mSource)   Div   3   -   1   Do   Begin   
                  S   :=   Copy(mSource,   I   *   3   +   1,   3);   
                  Result   :=   Result   +   cBase64[Ord(S[1])   Shr   2   +   1];   
                  Result   :=   Result   +   cBase64[((Ord(S[1])   And   $03)   Shl   4)   +   (Ord(S[2])   Shr   4)   +   1];   
                  Result   :=   Result   +   cBase64[((Ord(S[2])   And   $0F)   Shl   2)   +   (Ord(S[3])   Shr   6)   +   1];   
                  Result   :=   Result   +   cBase64[Ord(S[3])   And   $3F   +   1];   
                  If   mAddLine   Then   Begin   
                          Inc(J,   4);   
                          If   J   >=   76   Then   Begin   
                                  Result   :=   Result   +   #13#10;   
                                  J   :=   0;   
                              End;   
                      End;   
              End;   
          I   :=   Length(mSource)   Div   3;   
          S   :=   Copy(mSource,   I   *   3   +   1,   3);   
          Case   Length(S)   Of   
              1:   Begin   
                      Result   :=   Result   +   cBase64[Ord(S[1])   Shr   2   +   1];   
                      Result   :=   Result   +   cBase64[(Ord(S[1])   And   $03)   Shl   4   +   1];   
                      Result   :=   Result   +   cBase64[65];   
                      Result   :=   Result   +   cBase64[65];   
                  End;   
              2:   Begin   
                      Result   :=   Result   +   cBase64[Ord(S[1])   Shr   2   +   1];   
                      Result   :=   Result   +   cBase64[((Ord(S[1])   And   $03)   Shl   4)   +   (Ord(S[2])   Shr   4)   +   1];   
                      Result   :=   Result   +   cBase64[(Ord(S[2])   And   $0F)   Shl   2   +   1];   
                      Result   :=   Result   +   cBase64[65];   
                  End;   
          End;   
      End;   {   Base64Encode   }   
        
      Function   Base64Decode(mCode:   String):   String;   
      Var   
          I,   L:   Integer;   
          S:   String;   
      Begin   
          Result   :=   '';   
          L   :=   Length(mCode);   
          I   :=   1;   
          While   I   <=   L   Do   Begin   
                  If   Pos(mCode[I],   cBase64)   >   0   Then   Begin   
                          S   :=   Copy(mCode,   I,   4);   
                          If   (Length(S)   =   4)   Then   Begin   
                                  Result   :=   Result   +   Chr((Pos(S[1],   cBase64)   -   1)   Shl   2   +   
                                      (Pos(S[2],   cBase64)   -   1)   Shr   4);   
                                  If   S[3]   <>   cBase64[65]   Then   Begin   
                                          Result   :=   Result   +   Chr(((Pos(S[2],   cBase64)   -   1)   And   $0F)   Shl   4   +   
                                              (Pos(S[3],   cBase64)   -   1)   Shr   2);   
                                          If   S[4]   <>   cBase64[65]   Then   
                                              Result   :=   Result   +   Chr(((Pos(S[3],   cBase64)   -   1)   And   $03)   Shl   6   +   
                                                  (Pos(S[4],   cBase64)   -   1));   
                                      End;   
                              End;   
                          Inc(I,   4);   
                      End   Else   Inc(I);   
              End;   
      End;   {   Base64Decode   }   
        
      Function   GetMailTitle(Const   Value:   String):   String;   
      Var   
          iPos:   integer;   
      Begin   
          Result   :=   Value;   
    //      If   Copy(Value,   1,   2)   <>   '=?'   Then
    //          Begin   
    //              Result   :=   Value;   
    //              exit;   
    //          End;   
          //'?B?'前面的都要去掉
          iPos   :=   Pos('?B?',   Value);   
          If   iPos   =   0   Then   
              Begin   
                  iPos   :=   Pos('?Q?',   Value);   
                  If   iPos   =   0   Then   
                      Begin   
                          Result   :=   Value;   
                          exit;   
                      End;   
                  Inc(iPos,   3);   
          //最后的'?='也要去掉   
                  Result   :=   Copy(Value,   iPos,   Length(Value)   -   iPos   -   1);   
                  Result   :=   QuotedPrintableDecode(Result);
              End   
          Else
              Begin   
                  Inc(iPos,   3);   
          //最后的'?='也要去掉   
                  Result   :=   Copy(Value,   iPos,   Length(Value)   -   iPos   -   1);   
                  Result   :=   Base64Decode(Result);   
              End;   
        
      End;   
      //由于发件人是中文+'<[email protected]>',组成的,所以多加了这个函数!   
      Function   GetMailSender(Const   value:   String):String;
      var   
          iPos:integer;   
          preStr:String;   
          bkStr:String;   
      begin   
          Result:=   value;
          If   Copy(Value,   1,   2)   <>   '=?'   Then
              Begin
                  Result   :=   Value;
                  exit;
              End;   
          iPos   :=   Pos('?= <',   Value);
          if   iPos=0   then
              begin
                  Result   :=   Value;   
                  exit;
              end   
          else
              begin   
                  preStr:=Copy(Value,1,iPos+1);
                  bkStr:=Copy(Value,iPos+2,length(Value)-iPos+2);   
                  Result:=   GetMailTitle(preStr)+   bkStr;   
              end;   
      end;end.
      

  3.   

    http://www.faqs.org/rfcs/rfc2047.html