PHPでMail処理

更新日2012-04-21 (土) 09:02:45

mailを受信したときそのあて先でコマンドを実行しメール処理をすることができるこれをphpのシェルで実行する。

aliases

/etc/postfix/aliasesに以下のように指定

phptest: "|/var/lib/pgsql/comingout/php/test.php

以下のコマンドも実行

# newaliases

phpの記述

メール受信処理
メールの内容ははパイプで送られてくるのでそれをphpで読み込む

test.php

#! /usr/bin/php
<?php

while(!feof(STDIN)) {
//    $lndata = fread(STDIN, 4096);
    $lndata = fgets(STDIN, 4096);
    mb_internal_encoding("JIS");
    $lndata = mb_convert_kana($lndata,'rn');
//    $lndata = ereg_replace(".", ".", $lndata);
//    echo $lndata;
// 送り元の取り出し
//addressが okada@abc-u.ac.jp の場合
    if ( ereg("^From: (.*)@.*", $lndata, $reqs)){
            $name = $reqs[1];
    }
//addressが 岡田 <okada@abc.ac.jp>の場合
    if ( ereg("^From: .*<(.*)@.*>", $lndata, $reqs)){
            $name = $reqs[1];
    }

// 日付の取り出し
    if ( ereg("^Date: (.* \+.*)\n$", $lndata, $reqs)){
            $date = $reqs[1];
    }
// Toの取り出し
    if ( ereg("^To: (.*)@.*$", $lndata, $reqs)){
            $class = $reqs[1];
    }
?>

メール送信処理

function send_mail($name,$msg,$subject){

//EUCからISO-2022-JPに変換
   $subject = mb_convert_encoding($subject, "ISO-2022-JP", "EUC-JP");
//ISO-2022-JPをMIMEでbase64=>"B"に変換
   $subject = mb_encode_mimeheader($subject, "ISO-2022-JP", "B");
   $fp = popen("/usr/bin/nkf -m0 | /usr/sbin/sendmail -oi -t", "w");

   fwrite($fp, "From: comingout@abc.ac.jp\n");
   fwrite($fp, "Reply-To: okada@abc.ac.jp\n");
   fwrite($fp, "To: $name@abc.ac.jp\n");
   fwrite($fp, "Subject: " . $subject ."\n");
   fwrite($fp, "Mime-Version: 1.0\n");
   fwrite($fp, "Content-Type: text/plain; charset=ISO-2022-JP\n\n");
   fwrite($fp, $msg . "\n");
   pclose($fp);
}

PHP関数でメール送信

こちらのほうがいいかも

SubjectのMIME化は関数がしてくれるので本文の元の文字コートを指定すればJISに変換してくれる。例はUTF-8をJISに変換してくれる

function send_mail2($re_email,$msg,$subject){

   mb_language("japanese");
   mb_internal_encoding("UTF-8");
//    $subject = mb_convert_encoding($subject, "ISO-2022-JP", "utf8");
//    $subject = mb_encode_mimeheader($subject, "ISO-2022-JP", "B");

   $header = "From: okada@ism21.net\n";
   $header = $header ."Reply-To: okada@ism21.net\n";
   $to = $re_email;
   mb_send_mail($to,$subject,$msg,$header );

}

    $subject = "○○を通過";
    $jikoku = date("H:i");
    $msg = "件名の場所を" . $jikoku . "に通過しました";
    $re_email ="okada@abc-u.ac.jp";
    send_mail2($re_email,$msg,$subject);

デバッグ(動作確認)

パイプ入力されるのでメールソースをファイルに入れて

maildata

From okada@abc.ac.jp  Mon Oct 20 11:36:03 2008
Return-Path: <okada@abc.ac.jp>
X-Original-To: phptest@[10.99.99.173]
Delivered-To: phptest@[10.99.99.173]
Received: from mail.abc.ac.jp (mail.abc.ac.jp [192.244.75.5])
        by db-bakup.abc.ac.jp (Postfix) with ESMTP id 689A82C6A2
        for <phptest@[10.99.99.173]>; Mon, 20 Oct 2008 11:36:03 +0900 (JST)
Received: from www.abc.ac.jp (www.abc.ac.jp [192.244.75.2])
        by mail.abc.ac.jp (Postfix) with SMTP id 560C41CAC6B1
        for <phptest@[10.99.99.173]>; Mon, 20 Oct 2008 11:36:16 +0900 (JST)
Date: Mon, 20 Oct 2008 11:36:02 +0900(JST)
Message-ID: <20081020113602.2a5e.okada@abc-u.ac.jp>
From: 岡田 <okada@abc.ac.jp>
To: ouyou_x@[10.99.99.173]
Subject: TEST
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
X-Mailer: WebMailer Ver0.954 on Apache/2.0.55 (Unix) with Mozilla/4.0  (compatible; MSIE 7.
0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; InfoPath.2)

33 

岡田

確認実行

$cat maildata | ./test.php

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-04-21 (土) 09:02:45 (2225d)