さて、メールサーバをXserver で使用していますが、
共有サーバで、メール着信の通知を別のアドレスに送る方法です。
はまったポイントがいくつか。
@マークは、ダブルクォーテーション内だと、配列変数として展開されるようです。
シングルクォーテーションで囲うか、エスケープして下さい。
※ 完成後、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扱いされてしまい、ダメでした。
迷惑メール設定で、ホワイトリストに追加したら転送されました。