この記事は旧ブログ(amuns:blog)の記事です。

メール送信サンプルを作成しました。

今回はTurbo Delphiを使用しており、付属のIndyコンポーネントを使用してメール送信を行います。
IndyであればDelphiに限らず流用可能です。

環境

•Turbo Delphi

要件

メール送信の場合、先にログインをしないといけない場合がります。
ですので今回はPOP before SMTP 対応も行います。

・Indyでメール送信
・メール送信時に、ファイルの添付
・POP before SMTP 対応
・サブミッションポートの場合

今回は上記をすべて満たす関数を作成します。
使用する場合は、必要なもののみ処理を残して関数を作ればいいと思います。

処理

まず宣言です。usesに追加しましょう。

    // Mail用
  IdMessage, IdSMTP, IdEMailAddress, IdText,
   IdAttachmentFile, IdPOP3;

次にメール送信処理メソッドです。

//-----------------------------
// SMTPサーバ名
// Fromアドレス
// Toアドレス
// 件名
// 本文
// 添付ファイルフルパス
// ContentType(application/zipなど)
// POPホスト名(空白で認証しない)
// POPユーザ名
// POPパスワード
// サブミッションポート
//-----------------------------
function SendMail(Host,
					FromAdd,
					ToAdd,
					Subj,
					Body,
					filename,
					Ctype:String;
					// POP before SMTP
					pHost,
					pUser,
					pPass,
					sPort:String
					):Boolean;
var
	Msg : TIdMessage;
	SMTP : TIdSMTP;
	item : TIdEMailAddressItem;
	text : TIdText;
	attached : TIdAttachmentFile;
	IdPOP3: TIdPOP3;
begin
	Result := False;
	try
		//-----------------------
		// POP before SMTP 対応
		//-----------------------
		if pHost <> '' then begin
			IdPOP3 := TIdPOP3.Create(nil);
			try
				IdPOP3.Host := pHost;
				IdPOP3.Username := pUser;
				IdPOP3.Password := pPass;
				IdPOP3.Connect;
				IdPOP3.Disconnect;
			finally
				IdPOP3.Free;
			end;
		end;

		//--------------------
		// メール送信
		//--------------------
		SMTP := TIdSMTP.Create();
		Msg := TIdMessage.Create();
		try
			// SMTPサーバ
			SMTP.Host := Host;
			// マルチパート
			Msg.ContentType := 'multipart/mixed';
			Msg.From.Address := FromAdd;
			// 宛先
			item := Msg.Recipients.Add();
			item.Address := ToAdd;
			//メールの本文のパート
			text := TIdText.Create(Msg.MessageParts, nil);
			text.ContentType := 'text/plain';
			text.CharSet := 'ISO-2022-JP';
			text.ContentTransfer := '7bit';
			// 本文
			text.Body.Text := Body;
			// 件名
			Msg.Subject := Subj;

			// 添付ファイルのパート
			attached := TIdAttachmentFile.Create(Msg.MessageParts, filename);
			// 送信ファイル名
			attached.FileName := ExtractFileName(filename);
			attached.ContentType := Ctype;

			Msg.UseNowForDate := False;
			// 9時間引く
			Msg.Date := Now - (1/24*9);
			if pHost <> '' then begin
				smtp.Username := pUser;
				smtp.Password := pPass;
			end;

			// サブミッションポートの場合
			if sPort <> '' then begin
				smtp.port := StrToInt(sPort);
			end;
			// 送信
			smtp.Connect;

			// 失敗は例外。ソケットエラーが出る。
			try
				smtp.Send(Msg);
				Result := True;
			except
				// 失敗
			end;
			smtp.Disconnect();
		finally
			SMTP.Free;
			Msg.Free;
		end;
	except
		// 失敗
	end;
end;

実際に使用する場合は、以下のようになります。

 SendMail('xxx.com',
          'xxxx@xxxx.com',
          'xxxx@bbbb.com',
          'title',
          'honbun',
          'C:\test.lzh',
          'application/zip',
          'xxxx.com',
          'user',
          'ID',
          '587');

また本文・タイトルが文字化けする場合は、jconvertを追加し以下のようにしましょう。

// 本文
text.Body.Text := sjis2jis83(Body);
// 件名
Msg.Subject := CreateHeaderString(Subj);

メール送信の一例です。
いろいろカスタマイズして使用してみてください。