PHPおよびPHP用のSendmailスタブ

画像



ローカル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.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);
      
      







それがあなたに役立つことを嬉しく思います。



All Articles