トップへ(mam-mam.net/)

GMailのSMTPサーバー経由でメールを送信する ~Delphiソースコード集

検索:

GMailのSMTPサーバー経由でメールを送信する ~Delphiソースコード集

GMailの設定を行う

外部のメーラーを使えるようにGMailの設定を行います

1-(1)ギアマークをクリックし、設定をクリックします。

1-(2)メール転送とPOP/IMAPをクリックします。
●すべてのメールでPOPを有効にする を選択します
●IMAPを有効にする を選択します。
変更を保存する をクリックします。

1-(3)Googleアカウントをクリックします。

1-(4)アカウントにアクセスできるアプリをクリックします。

1-(5)安全性の低いアプリの許可を有効にします。

2.Delphiを起動してプロジェクトを作成する

2-(1)Delphiを起動し、新規作成⇒VCL フォーム アプリケーション
をクリックします。

2-(2)ツールパレットからBUTTONを1つ、フォームへドラッグします

3.OpenSSL系のDLLファイルをダウンロードして展開しパスの通った場所に設定する

https://indy.fulgan.com/SSL/
からOpenSSLをダウンロードし、解凍します。
libeay32.dll
ssleay32.dll
ファイルをパスの通った場所(c:\windowsフォルダや、これから作成する実行ファイルと同じ位置等)に配置します。

4.プログラムを記述する

ドラッグドロップしたBUTTONをダブルクリックします。
以下の赤字部分のソースコードを記述してください。(4行の追加のみ)
unit Unit1;

interface

uses
  System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure msgOnInitializeISO(var VHeaderEncoding:Char;var VCharSet:String);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  IdMessage,IdSSLOpenSSL,IdSMTP,IdExplicitTLSClientServerBase
  ,IdEMailAddress;

procedure TForm1.msgOnInitializeISO(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();
  try
    smtp.Host:='smtp.gmail.com';
    smtp.Port:=465;
    smtp.Username:='gmailのユーザー名、通常はgmailのメールアドレス';
    smtp.Password:='gmailのパスワード';
    ssl:=TIdSSLIOHandlerSocketOpenSSL.Create();
    try
      ssl.Host:=smtp.Host;
      ssl.Port:=smtp.Port;
      ssl.Destination:=ssl.Host+':'+IntToStr(ssl.Port);
      smtp.IOHandler:=ssl;
      //utUseImplicitTLSはSSL/TLS通信指定、
      //utUseExplicitTLSはStartTLS(途中からSSL/TLSに切替える通信で通常はポート587を使う)指定で
      //  smtp.UseEhlo=True;も指定する(サーバーがStartTLSをサポートしているかTIdSMTPが検出)
      smtp.UseTLS:=TIdUseTLS.utUseImplicitTLS;

      smtp.Connect;//接続
      msg:=TIdMessage.Create();
      try
        msg.ContentType:='text/plain';
        msg.CharSet:='UTF-8';
        msg.ContentTransferEncoding:='BASE64';
        msg.From.Address:='hoge@hoge.hoge';//メールの送り元。通常はgmailのアドレス

        msg.Recipients.Add.Address:='hoge_to1@hoge.hoge' ;//送り先1人目
        msg.Recipients.Add.Address:='hoge_to2@hoge.hoge' ;//送り先2人目。不要な場合はこの行を削除
        msg.CCList.Add.Address    :='hote_cc1@hoge.hoge' ;//Ccの送り先。不要な場合はこの行を削除
        msg.BccList.Add.Address   :='hoge_bcc1@hoge.hoge';//Bccの送り先。不要な場合はこの行を削除

        msg.Subject:='メールの件名を記述';

        msg.Body.Add('メール本文1行目');
        msg.Body.Add('メール本文の2行目');

        msg.OnInitializeISO:=msgOnInitializeISO;

        smtp.Send(msg);//メールの送信
      finally
        msg.Free;
      end;
      smtp.Disconnect();
    finally
      ssl.Free;
    end;
  finally
    smtp.Free;
  end;
end;

end.

4.実行する

実行ボタンを押すとコンパイルされ実行します。(デバッグ実行でもOKです。)
実行されたら、button1を押すとメールが送られます。

5.その他

HTML形式メールの場合は以下のようにする
procedure TForm1.Button1Click(Sender: TObject);
var smtp:TIdSMTP;
    ssl:TIdSSLIOHandlerSocketOpenSSL;
    msg:TIdMessage;
begin
  smtp:=TIdSMTP.Create();
  try
    smtp.Host:='smtp.gmail.com';
    smtp.Port:=465;
    smtp.Username:='gmailのユーザー名、通常はgmailのメールアドレス';
    smtp.Password:='gmailのパスワード';
    ssl:=TIdSSLIOHandlerSocketOpenSSL.Create();
    try
      ssl.Host:=smtp.Host;
      ssl.Port:=smtp.Port;
      ssl.Destination:=ssl.Host+':'+IntToStr(ssl.Port);
      smtp.IOHandler:=ssl;
      smtp.UseTLS:=TIdUseTLS.utUseImplicitTLS;

      smtp.Connect;//接続
      msg:=TIdMessage.Create();
      try
        msg.ContentType:='text/html';
        msg.CharSet:='UTF-8';
        msg.ContentTransferEncoding:='BASE64';
        msg.From.Address:='hoge@hoge.hoge';//メールの送り元。通常はgmailのアドレス

        msg.Recipients.Add.Address:='hoge_to1@hoge.hoge' ;//送り先

        msg.Subject:='メールの件名を記述';

        msg.Body.Add('<span style="color:red;">メール本文1行目</span>');
        msg.Body.Add('<p>メール本文の2行目</p>');

        msg.OnInitializeISO:=msgOnInitializeISO;

        smtp.Send(msg);//メールの送信
      finally
        msg.Free;
      end;
      smtp.Disconnect();
    finally
      ssl.Free;
    end;
  finally
    smtp.Free;
  end;
end;


HTML形式メールで添付画像つきで、それを表示する本文を送る場合はは以下のようにする
uses
  IdMessage,IdSSLOpenSSL,IdSMTP,IdExplicitTLSClientServerBase
  ,IdEMailAddress,IdText,IdAttachmentFile;

procedure TForm1.Button1Click(Sender: TObject);
var smtp:TIdSMTP;
    ssl:TIdSSLIOHandlerSocketOpenSSL;
    msg:TIdMessage;
begin
  smtp:=TIdSMTP.Create();
  try
    smtp.Host:='smtp.gmail.com';
    smtp.Port:=465;
    smtp.Username:='gmailのユーザー名、通常はgmailのメールアドレス';
    smtp.Password:='gmailのパスワード';
    ssl:=TIdSSLIOHandlerSocketOpenSSL.Create();
    try
      ssl.Host:=smtp.Host;
      ssl.Port:=smtp.Port;
      ssl.Destination:=ssl.Host+':'+IntToStr(ssl.Port);
      smtp.IOHandler:=ssl;
      smtp.UseTLS:=TIdUseTLS.utUseImplicitTLS;

      smtp.Connect;//接続
      msg:=TIdMessage.Create();
      try
        msg.ContentType:='multipart/related: type="text/html"';
        msg.CharSet:='UTF-8';
        msg.ContentTransferEncoding:='BASE64';
        msg.From.Address:='hoge@hoge.hoge';//メールの送り元。通常はgmailのアドレス

        msg.Recipients.Add.Address:='hoge_to1@hoge.hoge' ;//送り先

        msg.Subject:='メールの件名を記述';

        //メール本文
        with TIdtext.Create(Msg.MessageParts) do
        begin
          ContentType:='text/html';
          CharSet:='UTF-8';
          Body.Add('<br><h3>HTMLメール本文開始</h3>');
          Body.Add('<img src="cid:image1">');  //ここで添付ファイルのContentIDを指定する
        end;

        //添付ファイルを追加
        with TIdAttachmentFile.Create(
          Msg.MessageParts,'image1.jpg') do
        begin
          FileName:='image1.jpg';
          ContentTransfer:='BASE64';
          ContentType:='image/jpeg';
          ContentDisposition:='inline';
          ContentID:='image1';
        end;

        msg.OnInitializeISO:=msgOnInitializeISO;

        smtp.Send(msg);//メールの送信
      finally
        msg.Free;
      end;
      smtp.Disconnect();
    finally
      ssl.Free;
    end;
  finally
    smtp.Free;
  end;
end;