使用indy.IdPOP3和IdMessage接收文件时,为何不能对中文进行解码?例如 Subject [=?GB2312?B?1tDOxLXEU3ViamVjdA==?=]好像是不能对mime进行解码请网友推荐几本讲解indy的书

解决方案 »

  1.   

    在D7中,如果通过SMTP发送邮件正文显示不出来!
      

  2.   

    我也遇到过相同的问题,不过已经解决了:)
    下面应该是你要的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
        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 := Copy(s, 1, s1 - 1) + v + Copy(s, s2 + 2, 999);
    end;