さて、メールサーバをXserver で使用していますが、
共有サーバで、メール着信の通知を別のアドレスに送る方法です。
まず、perlのスクリプトを用意します。
はまったポイントがいくつか。
@マークは、ダブルクォーテーション内だと、配列変数として展開されるようです。
シングルクォーテーションで囲うか、エスケープして下さい。
※ 完成後、icloudのメールアドレスに送ると文字化けしました。(gmai yahoo は問題なし)
$subject = jcode($subject)->mime_encode;を追加したら解消しました。(多分)
#!/usr/bin/perl
use Jcode;
use MIME::Words qw(:all);
use POSIX qw(strftime);
$SENDMAIL;
$sendmail_cmd = "/usr/sbin/sendmail -t";
#=====================================================
# DECODEする関数
#=====================================================
sub DecodeFld($) {
my($sBuff) = @_;
my($sRes, $sWk);
chomp($sBuff);
foreach $sWk (decode_mimewords( $sBuff, )){
($sTxt, $sCode) = @$sWk;
$sRes .= $sTxt;
}
return $sRes;
}
#=====================================================
# 本体開始
#=====================================================
$r_subject = '';
$r_mail_to = '';
$r_mail_from = '';
$flg_subject = 0;
$flg_read_end = 0;
$flg_go = 0;
#open(DATAFILE, ">", "log.txt") or die("Error:$!");
#print DATAFILE "開始\n";
#close(DATAFILE);
#ヘッダ部から情報抽出
while (<STDIN>) {
#ヘッダ情報抽出終了後、パイプを空送りしてSTDINを終了させる
if($flg_read_end){
next;
}
#ヘッダ部の終了チェック
if(length == 1){
$flg_read_end = 1;
next;
}
#Subjectの取得
if($flg_subject == 1){
if(/^[ \t](.+)/){
$r_subject .= $1;
}
else{
$flg_subject = 2;
}
}
elsif($flg_subject == 0 && /^Subject: (.+)/){
$r_subject = $1;
$flg_subject = 1;
}
#FromやTo、その他フラグの取得
if(/^From: .*<(.+)>.*/){
$r_mail_from = $1;
}
elsif(/^From: (.+)/){
$r_mail_from = $1;
}
elsif(/^To: .*<(.+)>.*/){
$r_mail_to = $1;
}
elsif(/^To: (.+)/){
$r_mail_to = $1;
}
}
# open(DATAFILE, ">", "log.txt") or die("Error:$!");
# print DATAFILE "$mail_to\n";
# print DATAFILE "$subject\n";
# close(DATAFILE);
#Subjectのデコード
$r_subject = &DecodeFld("$r_subject"); #Subject欄デコード(JISコードのまま)
# open(DATAFILE, ">>", "log.txt") or die("Error:$!");
# print DATAFILE "$mail_to\n";
# print DATAFILE "$subject\n";
# close(DATAFILE);
#文字コード変換(JIS→EUC)
#&Jcode::convert(\$subject, "euc");
# open(DATAFILE, ">>", "log.txt") or die("Error:$!");
# print DATAFILE "$mail_to\n";
# print DATAFILE "$subject\n";
# close(DATAFILE);
#通知メール対象チェック
if($r_subject =~ /^\[SPAM\]/){
$flg_go = 1;
}
#通知メール送信
#open(DATAFILE, ">>", "log.txt") or die("Error:$!");
#print DATAFILE "mail送信前\n";
#close(DATAFILE);
if($flg_go == 0){
open(MAIL, "| $sendmail -t") or $err = 1;
if($err == 0){
$nowStr = strftime("%Y_%m_%d_%H_%M_%S", localtime(time));
$subject =$r_mail_to.'に新着メール'.$nowStr;
$from = $r_mail_to;
$to = $ARGV[0];
$cc = "";
$message =<<__E_O_F__;
$r_mail_from から メールが着信しました。
件名: $r_subject
このメールは自動送信されています。
__E_O_F__
&Jcode::convert(\$subject, 'jis');
$subject = jcode($subject)->mime_encode;
&Jcode::convert(\$message, "jis");
&Jcode::convert(\$subject, 'jis');
$subject = jcode($subject)->mime_encode;
&Jcode::convert(\$message, "jis");
open($SENDMAIL, "|$sendmail_cmd") or die "$sendmail_cmd [$!]";
$text =<<E_O_M;
From: <$from>
To: $to
Cc: $cc
Subject: $subject
Content-Transfer-Encoding: 7bit
Content-type: text/plain;charset="ISO-2022-JP"
$message
E_O_M
print $SENDMAIL $text;
close($SENDMAIL);
# open(DATAFILE, ">>", "log.txt") or die("Error:$!");
# print DATAFILE "mailSent\n";
# close(DATAFILE);
}
}
(※各所にコメントで入っている
# open(DATAFILE, ">>", "log.txt") or die("Error:$!");
# print DATAFILE "XXXXX\n";
# close(DATAFILE);
はデバッグ用。ログの出力される場所は、~/ドメイン/mail/ドメイン/メールアドレス のディレクトリ内です。)
で、これをmail_alert2.pl として保存します。
場所は ~/ドメイン名/script ディレクトリに置きます。
chmod 700 で権限を設定してください。 chmod 700 ~/ドメイン名/script/mail_alert2.pl
最後に~/ドメイン名/mail/ドメイン名/メールアドレス にある、 .mailfilter の最終行に、以下を追加します。
cc "| ../../../script/mail_alert.pl 通知先メールアドレス"
これで無事、文字化けなしで通知メールが送られました。
初めてのPerlでした。
参考アドレス
Xserver、Sixcoreでメール着信通知を設定する方法 | 冨山陽平のブログ “思いきり やりぬく”
http://faq.sakuratan.com/wiki/wiki.cgi?%c3%e5%bf%ae%c4%cc%c3%ce%a5%e1%a1%bc%a5%eb%a5%d7%a5%ed%a5%b0%a5%e9%a5%e0%ce%e3
Perlで日本語のメールを送信する方法
2023-01-13 追記
ちなみにspam 扱いされると、転送されないようです。
テストのメールがspam扱いされてしまい、ダメでした。
迷惑メール設定で、ホワイトリストに追加したら転送されました。