2

現在、Web サイト/Web アプリ経由で送信された電子メールを追跡し、SMTP エラーが原因で失敗する可能性のある電子メールを再試行する電子メール サーバー プログラムに取り組んでいます。

私ができることを探しているのは、PHP が電子メールを送信するために使用するデフォルトの方法を置き換えることです。

メール関数と同じパラメーターを持つ php スクリプトを作成し、このスクリプトを php.ini ファイルの sendmail パスに追加しようとしましたが、これを試してみると、ブラウザーは何もしていません。

ユーザーは、別のコードを記述する代わりに、独自のバージョンを使用するように php を再構成するだけで済みます。自分のバージョンに必要な詳細を渡して、それを電子メール サーバーに渡すだけです。

これは可能なことですか、あなたが提供できる助けに感謝します

4

3 に答える 3

3

基本的に、PHP と互換性のある独自の sendmail スタイルのラッパーを作成する必要があります。PHP がsendmailメール送信を呼び出すと、プロセスが開かれ、メッセージ データが sendmail に書き込まれます。

メッセージを送信するには、メッセージを再解析する必要があります。または、メッセージをログに記録/アカウント化した後、そのまま MTA に転送する必要があります。

オプションをサポートしないサンプル スクリプトを次に示しますが、このルートに進みたい場合は開始する必要があります。

#!/usr/bin/php -q
<?php

// you will likely need to handle additional arguments such as "-f"
$args = $_SERVER['argv'];

// open a read handle to php's standard input (where the message will be written to)
$fp = fopen('php://stdin', 'rb');

// open a temp file to write the contents of the message to for example purposes
$mail = fopen('/tmp/mailin.txt', 'w+b');

// while there is message data from PHP, write to our mail file
while (!feof($fp)) {
    fwrite($mail, fgets($fp, 4096));
}

// close handles
fclose($fp);
fclose($mail);

// return 0 to indicate acceptance of the message (not necessarily delivery)
return 0;

このスクリプトは実行可能にする必要があるため、権限を に設定し755ます。

php.ini次に、このスクリプトを指すように編集します (例: sendmail_path = "/opt/php/php-sendmail.php -t -s")

別のスクリプトで、メッセージを sendmail してみます。

<?php

$ret = mail('drew@example.com', 'A test message', "<b>Hello User!</b><br /><br />This is a test email.<br /><br />Regards, The team.", "Content-Type: text/html; charset=UTF-8\r\nX-Mailer: MailerX", '-fme@example.com');

var_dump($ret);  // (bool)true

それを呼び出した後、の内容に/tmp/mailin.txtは次のようなものが含まれている必要があります。

To: drew@example.com
Subject: A test message
X-PHP-Originating-Script: 1000:test3.php
Content-Type: text/html; charset=UTF-8
X-Mailer: MailerX

<b>Hello User!</b><br /><br />This is a test email.<br /><br />Regards, The team.

上記の txt ファイルの内容は基本的に、再送信できるように解析する必要があるか、使用する MTA に直接渡すことができる可能性があります。この例の引数については何もしていないので、忘れないでください。

man sendmailそのプロセスに関する詳細なドキュメントを 参照してください。のディレクティブにメールを書き込む PHP の関数へのリンクを次に示します。sendmail_pathphp.inimail()

それが役立つことを願っています。

于 2012-07-11T18:27:39.750 に答える
1

私はこれをしばらく使用しており、気に入っています。

http://sourceforge.net/projects/phpmailer/

于 2012-07-11T18:17:10.370 に答える
1

拡張機能がインストールされている場合は、関数をオーバーライドするためrunkitに使用することに興味があるかもしれません。残念ながら、PHP では、関数のネイティブ オーバーライドはサポートされていません。runkit_function_redefineemail

参考http ://ca.php.net/runkit

参考http ://ca.php.net/manual/en/function.runkit-function-redefine.php

それ以外の場合は、試してみることもできますoverride_function

参考: http: //php.net/manual/en/function.override-function.php

楽しんで頑張ってください!

于 2012-07-11T18:05:44.383 に答える