ローカルWebサーバーをセットアップするたびに、Sendmailのスタブに関する質問に遭遇します。
Windowsには優れたソリューションがあります。Windows用の偽のsendmail (sendmail.exe) http://glob.com.au/sendmail/
habrには、この決定に関する記事があります。WindowsでのPHPメール http://habrahabr.ru/post/26518/
別のWindowsソリューション: テストメールサーバーツール http://www.toolheap.com/test-mail-server-tool/
Linuxoidsの記事もあります: Linux用のSendmail-stub http://habrahabr.ru/post/49665/
個人的には、純粋なPHPのソリューションの方が好きでしたが、これについては後で説明します。
このソリューションの特徴は、構成が最小限であることです。もちろん、メッセージの内容を知る必要がない限り、ファイル自体がなくても実行できます。 私の意見では、このような方法は他のPHP開発者が知っている価値があります。
問題は、開発者として何を優先するか、あなたのニーズはスタブ、そして知識とスキルのレベルです。
プロから:
- サードパーティのサービスの欠如
- PHPがインストールされているOS向けのクロスプラットフォームソリューション
- 最小スタブファイルサイズ
- 最小設定
- すべてのスタブロジックはPHPで編集可能です。
- メッセージをファイルに保存
マイナスのうち:
- 実際のメールボックスへの転送なし
- 送信されたメッセージへの便利なアクセスの欠如
スタブ引数と機能のリスト:
- --dir <フォルダーパス> -ファイルのフォルダー
- --file <ファイル名> -特定の共有ファイルに各メッセージを保存します
- --prepend-共有ファイルの先頭に新しいメッセージを追加します
- --open-メモ帳でメッセージファイルを自動的に開く
PHP.INIファイルのパラメーター:
[mail function] ;SMTP = localhost ;smtp_port = 25 ;sendmail_from = me@example.com sendmail_path = "php.exe C:\sendmail.php --dir C:\mail --open"
php.exeへのパスがPATHに記述されている場合は、PHP.INIで省略できます。それ以外の場合は、php.exeを<PHPのあるフォルダーへのパス> \ php.exeに変更することをお勧めします
sendmail_path = "C:\server\bin\php\php.exe C:\sendmail.php --dir C:\mail --open"
Linuxでは、最初に実行することを忘れずに、ファイルへのパスをすぐに指定できます。chmod755 sendmail.php
sendmail_path = "/home/someuser/sendmail.php --dir /tmp/mail"
sendmail.phpスクリプト自体:
#!/usr/bin/env php <?php /* PHP.INI * [mail function] * ;SMTP = localhost * ;smtp_port = 25 * ;sendmail_from = me@example.com * sendmail_path = php.exe sendmail.php --dir C:\mail --open */ $is_windows = stristr(PHP_OS, 'WIN'); $options = getopt("", ['open', 'prepend', 'file:', 'dir:']); $is_open = isset($options['open']); $is_prepend = isset($options['prepend']); $is_onefile = isset($options['file']); $mail_dir = isset($options['dir']) ? $options['dir'] : sys_get_temp_dir().'/mail'; $file_name = isset($options['file']) ? $options['file'] : mkname(); $file_path = $mail_dir.'/'.$file_name; if( !is_dir( $mail_dir ) ) { mkdir( $mail_dir, 0777, TRUE ); if( !is_dir( $mail_dir ) ) { die('Mail folder ['.$mail_dir.'] not created'); } } $stream = $is_onefile ? PHP_EOL . str_repeat("-=", 10) . date('Ymd H:i:s') . str_repeat("-=", 10) . PHP_EOL : ''; while (false !== ($line = fgets(STDIN))) { $stream .= ($is_windows ? str_replace("\n", PHP_EOL, $line) : $line); } if($is_prepend && file_exists($file_path)) { $file_contents = file_get_contents($file_path); $stream .= $file_contents; } file_put_contents($file_path, $stream, $is_prepend ? 0 : FILE_APPEND); if ($is_open && $is_windows){ pclose(popen("start /B notepad ". $file_path, "r")); } function mkname($i=0) { global $mail_dir; $fn = 'mail_'.date('Ym-d_H-i-s_').$i.'.txt'; return file_exists($mail_dir.'/'.$fn) ? mkname(++$i) : $fn; }
私が約束したように、ファイルなしで行う機会もあります。
sendmail_path = "C:\server\bin\php\php.exe -r 'echo 1;'"
または、簡素化されたソリューションを使用する
sendmail_path = "C:\server\bin\php\php.exe C:\sendmail.php"
sendmail.php:
#!/usr/bin/env php <?php $mail = ''; while (false !== ($line = fgets(STDIN))) { $mail .= $line; } file_put_contents("c:/mail/mail.txt", $mail . PHP_EOL . str_repeat("-=", 20) . PHP_EOL, FILE_APPEND);
それがあなたに役立つことを嬉しく思います。