いきさつ
従業員が使用する、あるオンラインサービスを利用する事になりました。
そこで、全社員のアカウントをあらかじめ作成しておき、アカウント情報は従業員ひとりひとりにメールで通知する事になり、その役を仰せつかりました。
アカウント作成はデータのアップロードして(想像)
メール送信はてきとうなツール使えばすぐ終わりそう(想像)。
アカウント作成は想像通り、登録情報のcsvアップロードが利用できました。
しかし、個別にIDとパスワードを送信できるようなツールが全然見当たりません。有料のソフトはありますが、無料で使えそうなツールが見当たりません。ちょっと調べれば10個20個くらいズラッと出てくると思ったのに、検索能力が低いのでしょうか。
作ってみる
これ以上検索に時間を使っても進展なさそうだったので、諦めて作ってみました。
メールを送る事が出来れば良いので環境はなんでも良さそうですが、ちょうどこの頃PowerShellの存在を知ったところだったので、PowerShellを選びました。
コード
csvの中身を配列に入れてforで回すだけなので、面白味ないです。
#文字化け回避、コンソール上では逆に文字化けするが問題なし
function Encode-MailHeader($subject)
{
$enc = [System.Text.Encoding]::GetEncoding("iso-2022-jp");
$strBase64 = [Convert]::ToBase64String($enc.GetBytes($subject));
"=?{0}?B?{1}?=" -f "iso-2022-jp", $strBase64
}
#送信者情報
$from = "mail@from.dayo"
$smtp = "mail.smtp.dayo"
$port = 587
$user = "mail@from.dayo"
$pass = "PASSWORD" | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $user,$pass
#メールの件名
$title = "メールの件名"
$subject = Encode-MailHeader(Encode-MailHeader($title))
#csv読込
$csv = Import-Csv .\data.csv -Encoding Default -Header "csv_data_a","csv_data_b","csv_data_c","csv_data_d"
$data_a = @($csv | % {$_.csv_data_a})
$data_b = @($csv | % {$_.csv_data_b})
$data_c = @($csv | % {$_.csv_data_c})
$data_d = @($csv | % {$_.csv_data_d})
for ( $i = 0; $i -lt $data_a.Length; $i++ )
{
$to = $data_a[$i]
#メールの本文
[string]$body = ""
$body += `
$data_b[$i]+" 様" `
+"`n" `
+"`n" `
+"○○○のIDとパスワードをお送りします。"`
+"`n" `
+"`n" `
+"ID:"+$data_c[$i] `
+"`n" `
+"パスワード:"+$data_d[$i] `
+"`n" `
+"`n" `
+"このメールを受信したあなたが "+$data_b[$i]+" 様 でない場合は、速やかに○○までご連絡頂くか、" `
+"`n" `
+"このメールに返信して下さい。" `
Send-MailMessage -To $to -From $from -SmtpServer $smtp -Subject $subject -Body $body -Encoding UTF8 -Port $port -Credential $credential
}
送った相手のメーラーによって件名が文字化けする問題があり、こちらのサイトを参考にさせて貰いました。(原理はわかってない)
csvファイルは以下のようにします。(↑のスクリプトの場合は内容1=ID、内容2=パスワード)
メールアドレス,氏名,内容1,内容2
.
.
.
メールアドレス,氏名,内容1,内容2
これに限らずデータチェックとか、エラー処理とか、ログ出力とか作ってあると良いですね。
「とりあえず動く」みたいなものばかりなので、いつも動かす時は「えいやっ!(ポチッ)」って感じです。