Delphi6邮件标题解码

Unit EMail_Code;

Interface
Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
Const
  cBase64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
Function QuotedPrintableEncode(mSource: String): String;
Function QuotedPrintableDecode(mCode: String): String;
Function Base64Encode(mSource: String; mAddLine: Boolean = True): String;
Function Base64Decode(mCode: String): String;
Function GetTitle(Const Value: String): String;

 

Implementation

Uses TG;

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 Find(SubStr, Str: String; IsEnd: Boolean = False): Integer;
Var
  i: integer;
Begin
  Result := 0;
  If IsEnd Then
    Begin
      For i := Length(Str) Downto 0 Do
        If Copy(Str, i, Length(SubStr)) = SubStr Then
          Begin
            Result := i;
            Break;
          End;
    End
  Else
    For i := 0 To Length(Str) Do
      If Copy(Str, i, Length(SubStr)) = SubStr Then
        Begin
          Result := i;
          Break;
        End;

End;

Function GetTitle(Const Value: String): String;
Var
  TempStr, sStr, eStr: String;
Begin
  sStr := Copy(Value, 1, Pos('=?', Value) - 1);
  TempStr := Copy(Value, Pos('=?', Value) + 2, Length(Value));
  eStr := Copy(TempStr, Find('?=', TempStr, True) + 2, Length(TempStr));
  TempStr := Copy(TempStr, 1, Find('?=', TempStr, True) - 1);
  If Pos('?B?', TempStr) > 0 Then
    Begin
      TempStr := Copy(TempStr, Pos('?B?', TempStr) + 3, Length(TempStr));
      TempStr := Base64Decode(TempStr);
      Result := sStr + TempStr + eStr;
      Exit;
    End
  Else
    If Pos('?b?', TempStr) > 0 Then
    Begin
      TempStr := Copy(TempStr, Pos('?b?', TempStr) + 3, Length(TempStr));
      TempStr := Base64Decode(TempStr);
      Result := sStr + TempStr + eStr;
      Exit;
    End;


  If Pos('?Q?', TempStr) > 0 Then
    Begin
      TempStr := Copy(TempStr, Pos('?Q?', TempStr) + 3, Length(TempStr));
      TempStr := QuotedPrintableDecode(TempStr);
      Result := sStr + TempStr + eStr;
      Exit;
    End
  Else
    If Pos('?q?', TempStr) > 0 Then
    Begin
      TempStr := Copy(TempStr, Pos('?q?', TempStr) + 3, Length(TempStr));
      TempStr := QuotedPrintableDecode(TempStr);
      Result := sStr + TempStr + eStr;
      Exit;
    End;
  Result := Value;

End;
===========================================================================================
indy有编码解码器的
base64的例子如下

可以直接这样用..
Caption := Base64Decode(IdMessage.From.Text);
Caption := Base64Decode(IdMessage.Subject.Text);
以下是自己写的,利用Indy9內建De/EncoderMIME解码..

//------------------------------------------------------------------------------
//Base64Decode
//------------------------------------------------------------------------------
function TMainForm.Base64Decode(strInput : string) : string;
var
strDecode : string;
posStart: Integer;
posEnd : Integer;
begin
while pos('=?gb2312?b?',lowercase(strInput)) > 0 do
begin
try
posStart := pos('=?gb2312?b?',lowercase(strInput));
posEnd := pos('?=',lowercase(strInput));
strDecode := strDecode + copy(strInput,1,posStart-1) + IdDeMIME.DecodeString(copy(strInput,posStart+11,posEnd-posStart-11));
strInput := copy(strInput,posEnd+2,length(strInput)-posEnd-1);
finally
Application.ProcessMessages;
end;
end;
strDecode := strDecode + strInput;
result := strDecode;
end;

//------------------------------------------------------------------------------
//Base64Encode
//------------------------------------------------------------------------------
function TMainForm.Base64Encode(strInput : string) : string;
var
strEncode : string;
begin
strEncode := IdEnMIME.EncodeString(strInput);
result := strEncode;
end;

//------------------------------------------------------------------------------
PS.
IdDeMIME是IdDecoderMIME
IdEnMIME是IdEncoderMIME

 


如果
while pos('=?gb2312?b?',lowercase(strInput)) > 0 do  是
while pos('=?gb2312?q?',lowercase(strInput)) > 0 do
则把IdDecoderMIME换成IdDecoderQuotedPrintable   
    IdEncoderMIME换成IdEncoderQuotedPrintable

试试

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值