webシステムを利用いただく方にメールを送信いただき、
そのメールに自動返信する仕組みを構築します。
愛用しているxrea.comやcoreserver.jpはどうやら出来ないらしいので、
他のメジャーなレンタルサーバについて調べて見ました。
すると唯一、さくらインターネットでそれを実現できることが
分かったので早速アカウントを作成し、二週間のお試し期間で
実験することにしました。
本契約の時にテンパるといけないので、備忘録的ポスト。
その1.
.mailfilterを編集する。
パーミッションは600厳守!
cc "| /home/(さくらアカウント名)/www/(受信メールアドレス)/info_mail.pl (送信先メールアドレス)"
行頭を「cc」とすると受信メールを保存しますが、
「to」にするとスクリプト実行時にメールが破棄されます。注意。
その2.
メール受信時に起動するperlスクリプト。
ここでは「info_mail.pl」。perlとか久しぶり過ぎだぁ。
まぁ、眺めてるとお作法(syntax)はなんとなくわかるはず。
#!/usr/bin/perl
require "jcode.pl";
use MIME::Words qw(:all);
$sendmail = '/usr/sbin/sendmail';
#=====================================================
# DECODEする関数
#=====================================================
sub DecodeFld($) {
my($sBuff) = @_;
my($sRes, $sWk);
chomp($sBuff);
foreach $sWk (decode_mimewords( $sBuff, )){
($sTxt, $sCode) = @$sWk;
$sRes .= $sTxt;
}
return $sRes;
}
#=====================================================
# 本体開始
#=====================================================
$subject = '';
$mail_to = '';
$mail_from = '';
$flg_subject = 0;
$flg_read_end = 0;
$flg_go = 0;
$send_from = '(自動返信用メールアドレス)@(さくらアカウント名).sakura.ne.jp(または取得、設定したドメイン名';
$send_subject = '(メールタイトル)';
$send_body = '(メール本文)\n';
$send_body .= "(メール本文)";
#ヘッダ部から情報抽出
while (<stdin>) {</stdin>
#ヘッダ情報抽出終了後、パイプを空送りしてSTDINを終了させる
if($flg_read_end){
next;
}
#ヘッダ部の終了チェック
if(length == 1){
$flg_read_end = 1;
next;
}
#Subjectの取得
if($flg_subject == 1){
if(/^[ \t](.+)/){
$subject .= $1;
}
else{
$flg_subject = 2;
}
}
elsif($flg_subject == 0 && /^Subject: (.+)/){
$subject = $1;
$flg_subject = 1;
}
#FromやTo、その他フラグの取得
if(/^From: .*<(.+)>.*/){
$mail_from = $1;
}
elsif(/^From: (.+)/){
$mail_from = $1;
}
elsif(/^To: .*<(.+)>.*/){
$mail_to = $1;
}
elsif(/^To: (.+)/){
$mail_to = $1;
}
}
#Subjectのデコード
$subject = &DecodeFld("$subject"); #Subject欄デコード(JISコードのまま)
#文字コード変換(JIS→EUC)
&jcode::convert(\$subject, "euc");
#通知メール対象チェック (今回はコメントアウト)
#if($subject =~ /至急.*/){
$flg_go = 1;
#}
#通知メール送信
#入力パラメータは使用しないのでコメントアウト
# $mailbuff .= "To: $ARGV[0]\n";
if($flg_go == 1){
open(MAIL, "| $sendmail -t") or $err = 1;
if ($err == 0) {
$mailbuff = '';
$mailbuff .= 'To: '."$mail_from\n";
$mailbuff .= 'From: '."$send_from\n";
$mailbuff .= 'Subject: '."$send_subject\n";
$mailbuff .= $send_body;
&jcode::convert(\$mailbuff, "jis");
print MAIL $mailbuff;
close(MAIL);
}
}
※文字コード:EUC-JP、改行コード:LFで保存のこと。
idとパスワードでログイン管理するのもどうか、と思っているので
メールアドレスをエンコードした文字列を付加したurlを
メールに記載して返信することで認証の替わりにしたいところ。
(セキュリティ的には不十分なのでしょうけれど、猫も杓子も
パスワード、パスワード・・・、じゃ、ユーザが困っちゃうよなぁ。)
以下のサイトが大いに参考になりました。
perlスクリプトは8割がた、以下サイトのものを流用しています。感謝。