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(93250220, 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(50220932, Msg.Body.Text, Dmy);
          Memo1.Lines.Add(Dmy);
        end;
    finally
      Msg.Free;
    end;
    POP3.Disconnect;
  finally
    POP3.Free;
  end;
end;

 アレ?また文字コード変換ルーチンが必要になってるような?もう、どうやったら文字コード変換ルーチンが必要で、どうやったら文字コード変換ルーチンが不要なのかワカンナイ (細かいバージョンの差異で挙動がコロコロ変わる) ので、動作テストを事前に行って下さい。

See Also:


 BACK