Azure AppService (WebApps)で Sendmailを利用する方法。これでSendGridもPerlで使えます。

2016年12月28日

はじめに

くどうです。

Linuxではsendmailが重宝され、様々なアプリケーションで利用されています。
Postfixになっても互換コマンドが使えるなど永久に無くならないでしょう。

そこで、Azure AppService のWebAppsでsendmailを利用する方法を紹介します。
WebAppsは基本的にインストールは行えません。しかも中身はWindowsです。

では、どのようにWebAppsでsendmailを利用するか?fake sendmail for windowsを利用します。
fake sendmailはWindowsで動作するsendmail ライクなアプリケーションです。
しかも、インストールが必要なく単独で動作します。

fake sendmailを利用することでPerlに限らず、PHP、RubyなどWebAppsで動作する言語全てで利用可能です。
また、SMTP AUTHに対応しており、SendGridにも問題なく対応可能です。

今回は例として、PerlでSendGridを利用方法を紹介していきます。
WebApps + Perl + SendGrid の組み合わせです。
現状、これが一番シンプルな方法だと思います。

fake sendmailの設置

fake sendmail for windowsのサイトから、sendmail.zipをダウンロードしてきます。
解凍後、以下のファイルをkudu等を利用し、WebAppsにsendmailというフォルダを作成、保存します。
sendmail.exe
sendmail.ini
ssleay32.dll
libeay32.dll

設置例

D:/var/www/html\sendmail>ls -al
total 2276
drwxr-xr-x 1 Unknown+User Unknown+Group       0 Dec 27 14:10 .
drwxr-xr-x 1 Unknown+User Unknown+Group       0 Dec 27 12:57 ..
-rwxr-xr-x 1 Unknown+User Unknown+Group 1112064 Dec 21 06:27 libeay32.dll
-rwxr-xr-x 1 Unknown+User Unknown+Group  932864 Dec 21 06:27 sendmail.exe
-rw-r--r-- 1 Unknown+User Unknown+Group    2156 Dec 21 06:30 sendmail.ini
-rwxr-xr-x 1 Unknown+User Unknown+Group  275968 Dec 21 06:27 ssleay32.dll

次にSendGridで送信する設定をします。SendGridは事前に立ち上げUsernameを取得しておきましょう。
Passwordは作成時に設定しているものです。

sendmail.iniの以下の部分を編集します。

smtp_server=smtp.sendgrid.net
auth_username=azure_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@azure.com
auth_password=xxxxxxxxxxx

以上で、sendmailの設定は完了です。

次に実際に送信するPerlを準備します。

Perlで送信

perlをWebAppsで利用するには以下を参考ください。
App Service (Web Apps) でPerl CGIを動作させる。立ち上げてすぐ使えます。

Perlが利用できる環境で送信用スクリプトsendmail.cgiを設置します。

D:\home\site\wwwroot>ls -al
total 209
drwxr-xr-x 1 Unknown+User Unknown+Group      0 Dec 27 14:22 .
drwxr-xr-x 1 Unknown+User Unknown+Group      0 Dec 20 02:33 ..
-rw-r--r-- 1 Unknown+User Unknown+Group    376 Dec 20 02:34 Web.config
-rw-r--r-- 1 Unknown+User Unknown+Group 202392 Dec 20 02:31 hostingstart.html
drwxr-xr-x 1 Unknown+User Unknown+Group      0 Dec 27 14:10 sendmail
-rwxr-xr-x 1 Unknown+User Unknown+Group    603 Dec 27 13:00 sendmail.cgi

sendmail.cgiは以下です。基本的に、従来のsendmailと利用方法は同じです。

#! /usr/bin/perl

#事前にfuke mail の設定を行う
# sendmail/sendmail.ini内を環境に合わせて変更
#メールの設定
$mailfrom = 'xxxx@xxxx.com'; #from
$mailto = 'yyyy@yyyy.com'; #to

open(OUT, "| ./sendmail/sendmail -t");
print OUT "From: $mailfrom\n";
print OUT "To: $mailto\n"; 
print OUT "Subject: これはテストメールです \n";
print OUT "\n";
print OUT "てすとだよ! \n";
print OUT "ほげほげ \n";
print OUT " \n";
print OUT "from SendGrid \n";
close(OUT);

#結果の出力
print "Content-type: text/html\n\n";
print "送信完了!<br>";

以下の部分でfake sendmailへ渡しています。

open(OUT, "| ./sendmail/sendmail -t");

他にも、メールの内容を一度、外部出力して受け渡すことも可能です。

#! /usr/bin/perl

#事前にfuke mail の設定を行う
#メールの設定
$mailfrom = 'xxxx@xxxxx.com';
$mailto = 'yyyy@yyyyy.com';
$dir = './'; #保存場所を指定

#メール送信用のtempファイル名
$num = int(rand(100));
$tempmail = "$num.mail";

#メール本体を出力
open(OUT, ">> $dir/$tempmail");
print OUT "From: $mailfrom\n";
print OUT "To: $mailto\n"; 
print OUT "Subject: これはテストメールです \n";
print OUT "\n";
print OUT "てすとだよ! \n";
print OUT "ほげほげ \n";
print OUT " \n";
print OUT "from SendGrid \n";
close(OUT);

#fuke sendmailによる送信
$result = system("$dir/sendmail/sendmail -t < $dir/$tempmail");

#tempmail の削除
unlink $tempmail;

#結果の出力
print "Content-type: text/html\n\n";
print "送信!<br>";
print "0:成功 0以外:失敗 = $result <br>";
print "$tempmail<br>";

一旦、外部へ出力します。

open(OUT, ">> $dir/$tempmail");

コマンドとして外部へ出力したファイルを読み込みこませます。

$result = system("$dir/sendmail/sendmail -t < $dir/$tempmail");

一応、送信判定ができます。

print "0:成功 0以外:失敗 = $result 
";

送信結果

送信結果は以下です。
どちらで送信しても結果は一緒です。

まとめ

WebAppsでsendmailを利用する方法を紹介しました。sendmailは、これまでの様々なOSSで利用されているケースが多かったと思います。特に古いCMSなどなど。
紹介した通りWebAppsでは、SendGridを利用しsendmailで送信できる環境を簡単にできます。そのため、既存のアプリケーションの移行がスムーズに行えます。ぜひ活用してもらえればと思います。
ではでは

Azure,OSSAzure,Perl,SendGrid,WebApps

Posted by jkudo