見出し画像

【永久保存】大量の宛先に一斉個別メールを送るスクリプト

 こんにちは〜インフラエンジニアのtamolabです!皆さんは業務で複数人の人に一斉メールを送る場合どのように実施しておりますでしょうか?たくさんの人にメールを送るには「宛先にたくさん入れる」場合が良い時もあれば、「宛先は個別にする」場合がいい時もあります。今回は後者の「宛先を個別にする」場合を想定して、便利なスクリプトを紹介します。

図1

1. ユースケース

画像4

 主に以下のようなユースケースがあるかと思います。これを使えば10,000人であろうと1,000,000人であろうと短時間でミスなしに確実にメール送信ができます。

・サーバのスクリプト上で、エラー時に自動でメール送信したい。
・複数人に案内メールを出したい。
・ヒューマンエラーなしに完璧にメール送信したい。

2. 動作環境

画像5

 このスクリプトは以下の二点が整っていれば動作します。

・Perl (5.16系)が動作する環境
・sedmailが動作する環境

3. ソースコード

画像6

【ディレクトリ構成】

 ディレクトリ構成は下記のようになります。

画像2

【userlist.txt】

ここにはメールのドメイン以外の部分(AAA@gmail.comのAAAの部分)を改行区切りで記載します。実施にメールを送る対象となります。

a-account
b-account
c-account
d-account
e-account

【subtitle.txt】

メールのタイトルを記載ます。

【重要】XXXXに関するアンケート回答のご協力依頼

【body.txt】

メールの本文を記載します。

いつもお世話になっております。
XXXXです。....

【main.pl】

「to」「from」「cc1」「cc2」「bcc」などは適宜変更してください。userlist.txtのアカウントに「@gmail.com」を付与した形で、toに指定してメール送信します。ドメイン部分を変えることもできるので、その場合も本コードを直接編集してください。

#!/usr/local/bin/perl5.16.3
require "jcode.pl";
require "mimew.pl";

#Description
$sendmail = '/usr/sbin/sendmail -t -i';
$subjectfile = "subject.txt";
$bodyfile = "body.txt";
$userlist = "userlist.txt";

#Sender etc...
$from = 'from@XXXX.co.jp';
$cc1 = 'cc01@XXXX.co.jp';
$cc2 = 'cc02@XXXX.co.jp';
#$bcc = '';
#$reply = '';

open(SUBJ,"<$subjectfile");
$subj = <SUBJ>;
close(SUBJ);
open(BODY,"<$bodyfile");
foreach(<BODY>){
	$msg .= $_;
}
close(BODY);

#-----------------------------------------------------------------
sub sendMail {

       ($to, $cc1, $cc2, $bcc, $subj, $msg) = @_;

       &jcode::convert(\$subj, "jis");

       $subj = &mimeencode($subj);
       jcode::convert(\$msg, "jis");

       open(SENDMAIL, "|$sendmail -f $from") || die "sendNoticeMail:$!\n";
       print SENDMAIL "From: $from\n";
       print SENDMAIL "To: $to\n";
	if($bcc ne ""){
      		print SENDMAIL "Bcc: $bcc\n";
	}
	if($cc1 ne ""){
      		print SENDMAIL "Cc: $cc1, \n";
	}
	if($cc2 ne ""){
      		print SENDMAIL "Cc: $cc2\n";
	}
	if($reply ne ""){
      		print SENDMAIL "Reply-To: $reply\n";
	}
       print SENDMAIL "Subject: $subj\n";
       print SENDMAIL "\n";
       print SENDMAIL "$msg\n";
       close(SENDMAIL);
}
#-------------------------------------------------------------

open(TO,"<$userlist");
foreach(<TO>){
	chomp;
	sleep 2;
	$to = "$_\@gmail.com";
	&sendMail($to,$cc1,$cc2,$bcc,$subj,$msg);
}
close(TO);

4. 実行

画像7

$ perl mail.pl

 上記で終了です。 これで今回userlistで指定したアカウントに一通ずつメールを送信することができました。

画像3

一コマンドで実行できるので、スクリプトの中で記載したりすることで、アラート通知のように利用することもできます!

5. キーワード

画像8

#perl #メール #sendmail #一斉メール #スクリプト   #IT #インフラエンジニア

6. お問い合わせ

画像9

 本投稿のコメントでも構いませんし、下記からお問い合わせいただいても大丈夫です。
 note.tamolab@gmail.com

サポートをお願いいたしますmm もしXXXXな記事を書いて欲しい、XXXXな記事は不適切だなどのご要望がありましたら、お知らせください!