Mam's 3D建築CG住宅CGパース
 
 
 

SMTP Client コンポーネントを作る(2)
Delphi 2009 2010 XE XE2 XE3で使えるSMTPコンポーネントを作る


各種関数の作成
 
前のページでTCP/IPクライアントを作成しましたが、SMTPではメールをBase64エンコードしたりURLエンコードする必要があります。 DelphiにはIndyのBase64関数等がありますが、やっぱり自力で作ります・・・。その他必要な関数も作成します。
 
Base64エンコードやその他必要な関数
interface
uses
  SysUtils, Classes, Windows, WinSock,StrUtils,StdCtrls
  ,dialogs,DateUtils;

//srcからLenバイト分をBase64エンコードして返す
function  MamSMTPBase64Encode(src:Pointer;Len:Integer):AnsiString;

//srcからURLエンコードしてstlistへ返す
procedure MamURLEncode(src: utf8String;stlist:TStringList);

//メールアドレスの<>の前をUTF8でBase64エンコードする
function MamMailAddressUTF8Encode(st:string):string;

//メールアドレスの<>内だけを取り出す
function MamGetMailAddressOnly(st:string):string;

//標準時との差を計算
function CalcJISA():String;

//メール送信時の年月日時分秒+標準時との差の文字列生成
function MamSMTPCreateDate(Value:TDateTime):string;

//自身のIPアドレスを文字列で取得する
function MamGetLocalIPAdress():string;

//--------------------------------------------
implementation

function MamSMTPBase64Encode(src:Pointer;Len:Integer):AnsiString;
//Srcのデータを長さLen分、Base64エンコードして返す
const
  Base64Char: PansiChar =
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ'+
    'abcdefghijklmnopqrstuvwxyz'+
    '0123456789+/';
var i:integer;
    enc:array[0..3] of AnsiChar;
    b1,b2,b3:byte;
begin
  result:='';
  i:=0;
  while i=Len then
    begin
      enc[1]:=Base64Char[(b1 and $3) shl 4 ];
      enc[2]:='=';
      enc[3]:='=';
    end
    else
    begin
      inc(PByte(src));
      b2:=PByte(src)^;
      enc[1]:=Base64Char[((b1 and $3) shl 4 ) + ((b2 and $f0) shr 4)];
      inc(i);
      if i>=Len then
      begin
        enc[2]:=Base64Char[(b2 and $f) shl 2];
        enc[3]:='=';
      end
      else
      begin
        inc(PByte(src));
        b3:=PByte(src)^;
        enc[2]:=Base64Char[((b2 and $f) shl 2)+((b3 and $c0) shr 6)];
        enc[3]:=Base64Char[(b3 and $3f)];
      end;
    end;
    result:=result+enc[0]+enc[1]+enc[2]+enc[3];
    inc(i);
    if i'' then stlist.Add(st);

  if stlist.Count>1 then
    for i := 0 to stlist.Count - 2 do
      stlist[i]:=stlist[i]+';';
end;

//メールアドレスの<>の前をUTF8でBase64エンコードする
function MamMailAddressUTF8Encode(st:string):string;
var u8:UTF8String;
    u8b:TBytes;
    c:integer;
    nn,aa:string;
begin
  st:=trim(st);
  c:=pos('<',st);
  if c<=1 then
  begin
    result:=st;
    exit;
  end;
  nn:=LeftStr(st,c-1);
  aa:=RightStr(st,length(st)-length(nn));
  nn:=trim(nn);
  u8:=UTF8String(nn);
  SetLength(u8b,length(u8));
  for c := 0 to length(u8)-1 do
    u8b[c]:=ord(u8[c+1]);
  nn:=string(MamSMTPBase64Encode(u8b,length(u8b)));
  result:='=?UTF-8?B?'+nn+'?= '+aa;
end;

//メールアドレスの<>内だけを取り出す
function MamGetMailAddressOnly(st:string):string;
var c:integer;
begin
  st:=trim(st);
  c:=pos('<',st)-1;
  if c<=0 then
  begin
    result:=st;
    exit;
  end;
  result:=RightStr(st,length(st)-c);
end;


//標準時との差を計算
function CalcJISA():String;
var
  st: TSystemTime;
  ft1, ft2: TFileTime;
  jst:TDateTime;
  utc:TDateTime;
  i:Int64;
  h,m:integer;
begin
  //今の日時を取得
  jst:=now();
  DateTimeToSystemTime(jst, st);
  SystemTimeToFileTime(st, ft1);
  //ローカル時刻を世界協定時刻に変換
  LocalFileTimeToFileTime(ft1, ft2);
  FileTimeToSystemTime(ft2, st);
  utc := SystemTimeToDateTime(st);
  //日本時間と世界標準時との差を分単位で取得
  i:=MinutesBetween(jst,utc);
  h:=ABS(i div 60);
  m:=ABS(i mod 60);
  if i>=0 then result:='+' else result:='-';
  Result:=Result+
    RightStr('00'+trim(Inttostr(h)),2)+
    RightStr('00'+trim(Inttostr(m)),2);
end;

//メール送信時の年月日時分秒+標準時との差の文字列生成
function MamSMTPCreateDate(Value:TDateTime):string;
const youbi:array[0..6] of string=(
        'Sun','Mon','Tue','Wed','Thu','Fri','Sat');
      tsuki:array[0..11] of string=(
        'Jan','Feb','Mar','Apr','May','Jun',
        'Jul','Aug','Sep','Oct','Nov','Dec');
begin
  result:= youbi[DayOfWeek(Value)-1]+
    ', '+FormatDateTime('d',Value)+
    ' ' +tsuki[MonthOf(Value)-1]+
    ' ' +FormatDateTime('yyyy hh:nn:ss',Value)+
    ' ' +CalcJISA;
end;
                
 

 
SMTP Client 前ページへ SMTP Client 次ページへ
 

 
  Copyright (C) 2009-2013 Mam