Indy 10 を使って GMail を送受信するには? (Delphi 2007 以前)
UTF-8、SSL を使って GMail を送受信するサンプルです。
Indy 10 のインストール
インストール方法は "63. ANSI 版 Delphi (5~2007) に最新版の Indy10 をインストールする" を参考にして下さい。
サンプルコード(送信)
uses
..., IdSMTP, Idmessage, IdSSLOpenSSL, IdExplicitTLSClientServerBase;
procedure TForm1.IdMessage_InitializeISO(var VHeaderEncoding: Char; var VCharSet: string);
begin
VHeaderEncoding := 'B';
VCharSet := 'UTF-8';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
SMTP: TIdSMTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
Msg : TIdMessage;
begin
SMTP := TIdSMTP.Create(nil);
try
SMTP.Host := 'smtp.gmail.com';
SMTP.Port := 587;
SMTP.Username := 'hoge@gmail.com'; // UserName
SMTP.Password := 'hogehoge'; // Password
SSL := TIdSSLIOHandlerSocketOpenSSL.Create;
try
SSL.Host := SMTP.Host;
SSL.Port := SMTP.Port;
SSL.Destination := SSL.Host + ':' + IntToStr(SSL.Port);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseExplicitTLS;
SMTP.Connect;
Msg := TIdMessage.Create(SMTP);
try
Msg.OnInitializeISO := IdMessage_InitializeISO;
Msg.ContentType := 'text/plain';
Msg.CharSet := 'UTF-8';
Msg.ContentTransferEncoding := 'BASE64'; // BASE64 (7bit)
//Msg.ContentTransferEncoding := '8bit'; // RAW(8bit)
Msg.From.Name := 'hoge@gmail.com';
Msg.From.Address := 'hoge@gmail.com';
Msg.Recipients.EMailAddresses := 'hoge@gmail.com';
Msg.Subject := 'Ansi String (subject)';
Msg.Body.Text := UTF8Encode('Ansi String (body)');
SMTP.Send(Msg);
finally
Msg.Free;
end;
SMTP.Disconnect;
finally
SSL.Free;
end;
finally
SMTP.Free;
end;
end;
|
サンプルコード(受信)
uses
..., IdPOP3, Idmessage, IdSSLOpenSSL, IdExplicitTLSClientServerBase;
procedure TForm1.Button2Click(Sender: TObject);
var
POP3: TIdPOP3;
SSL: TIdSSLIOHandlerSocketOpenSSL;
Msg : TIdMessage;
MsgCnt: Integer;
i: Integer;
begin
Memo1.Clear;
POP3 := TIdPOP3.Create(nil);
try
POP3.Host := 'pop.gmail.com';
POP3.Port := 995;
POP3.Username := 'hoge@gmail.com'; // UserName
POP3.Password := 'hogehoge'; // Password
SSL := TIdSSLIOHandlerSocketOpenSSL.Create;
try
SSL.Host := POP3.Host;
SSL.Port := POP3.Port;
SSL.Destination := SSL.Host + ':' + IntToStr(SSL.Port);
POP3.IOHandler := SSL;
POP3.UseTLS := utUseImplicitTLS;
POP3.Connect;
Msg := TIdMessage.Create(nil);
try
MsgCnt := POP3.CheckMessages;
for i:=1 to MsgCnt do
begin
POP3.RetrieveHeader(i, Msg);
Msg.NoDecode := (LowerCase(Msg.ContentTransferEncoding) <> 'base64') and
(LowerCase(Msg.ContentTransferEncoding) <> 'quoted-printable');
POP3.Retrieve(i, Msg);
Memo1.Lines.Add('Subject: ' + Msg.Subject);
Memo1.Lines.Add('Body:');
Memo1.Lines.Add(UTF8Decode(Msg.Body.Text));
end;
finally
Msg.Free;
end;
POP3.Disconnect;
finally
SSL.Free;
end;
finally
POP3.Free;
end;
end;
|
EncodeUTF8() / DecodeUTF8() を噛ます必要があります。
UTF8Encode() / UTF8Decode() にはバグがある のですが、Shift_JIS との相互変換では問題は起こりません (Shift_JIS の文字はサロゲートペア領域にないため)。どうしても気になるようでしたら MECSUtils.AnsiToUTF8() / MECSUtils.UTF8ToAnsi() を利用して下さい。
See Also:
Indy 10 を使ってメール(ISO-2022-JP)を送受信するには? (Delphi 2007 以前)
ISO-2022-JP を使って Mail を送受信するサンプルです。
Indy 10 のインストール
インストール方法は "63. ANSI 版 Delphi (5~2007) に最新版の Indy10 をインストールする" を参考にして下さい。
サンプルコード(送信)
uses
..., IdSMTP, Idmessage, MECSUtils;
procedure TForm1.IdMessage_InitializeISO(var VHeaderEncoding: Char; var VCharSet: string);
begin
VHeaderEncoding := 'B'; // 念のために BASE64 エンコーディング
VCharSet := 'ISO-2022-JP';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
SMTP: TIdSMTP;
Msg : TIdMessage;
BodyText, Dmy: String;
begin
SMTP := TIdSMTP.Create(nil);
try
SMTP.Host := 'smtp.hogehoge.com';
SMTP.Port := 25;
SMTP.Connect;
Msg := TIdMessage.Create(SMTP);
try
Msg.OnInitializeISO := IdMessage_InitializeISO;
Msg.ContentType := 'text/plain';
Msg.CharSet := 'ISO-2022-JP';
Msg.ContentTransferEncoding := 'BASE64'; // 念のために BASE64 エンコーディング
Msg.From.Name := 'from@hogehoge.com'; // 送信者のメールアドレス
Msg.From.Address := 'from@hogehoge.com'; // 送信者のメールアドレス
Msg.Recipients.EMailAddresses := 'to@hogehoge.com'; // 送信先のメールアドレス
Msg.Subject := '件名です';
BodyText := '本文です';
MECSUtils.ConvertString(932, 50220, BodyText, Dmy);
Msg.Body.Text := Dmy;
SMTP.Send(Msg);
finally
Msg.Free;
end;
SMTP.Disconnect;
finally
SMTP.Free;
end;
end;
|
サンプルコード(受信)
uses
..., IdPOP3, Idmessage, MECSUtils;
procedure TForm1.Button2Click(Sender: TObject);
var
POP3: TIdPOP3;
Msg : TIdMessage;
i, MsgCnt: Integer;
Dmy: String;
begin
Memo1.Clear;
POP3 := TIdPOP3.Create(nil);
try
POP3.Host := 'pop.hogehoge.com';
POP3.Port := 110;
POP3.Username := 'user_hoge'; // UserName
POP3.Password := 'pass_hoge'; // Password
POP3.Connect;
Msg := TIdMessage.Create(nil);
try
MsgCnt := POP3.CheckMessages;
for i:=1 to MsgCnt do
begin
POP3.RetrieveHeader(i, Msg);
Msg.NoDecode :=
(LowerCase(Msg.ContentTransferEncoding) <> 'base64') and
(LowerCase(Msg.ContentTransferEncoding) <> 'quoted-printable');
POP3.Retrieve(i, Msg);
Memo1.Lines.Add('Subject: ' + Msg.Subject);
Memo1.Lines.Add('Body:');
MECSUtils.ConvertString(50220, 932, Msg.Body.Text, Dmy);
Memo1.Lines.Add(Dmy);
end;
finally
Msg.Free;
end;
POP3.Disconnect;
finally
POP3.Free;
end;
end;
|
アレ?また文字コード変換ルーチンが必要になってるような?もう、どうやったら文字コード変換ルーチンが必要で、どうやったら文字コード変換ルーチンが不要なのかワカンナイ (細かいバージョンの差異で挙動がコロコロ変わる) ので、動作テストを事前に行って下さい。
See Also: