PHPでメール送信

何回か挑戦してどうしてもできなかったことが一気にできるようになることがあるようだ。
PHPでメールを送信するのもこれまでできていなかったのだが、 2日間かけてVBでメール送信ができるようになったおかげでPHPでもメールが送信できるようになった。
http://www.bnote.net/php/pear/mail_03_smtp.shtml
このサイトのお陰である。
ここに書いてあるコードを見てこれだと思った。非常にわかりやすくスッキリしている。 何よりもポート番号・認証関係がわかりやすい。これまでは認証をまったくせずにメールを送ろうとしていた。 ダメなわけである。それとポート番号。今は、OutLook Expressにしても他でも587が多い。

<?php
require_once "Mail.php";

$params = array(
  'host' => 'smtpサーバー名',
  'port' => 'ポート番号',
  'auth' => true,
  'username' => 'ログインID',
  'password' => 'パスワード',
);

$recipients = 'hogehoge@ybb.ne.jp';

$headers['From']    = 'hogehoge@ybb.ne.jp';
$headers['To']      = 'hogehoge@ybb.ne.jp';
$headers['Subject'] = 'My Subject';

$body = "Message\nMessage\nMessage\n";

$objMail =& Mail::factory('smtp', $params);
$result = $objMail->send($recipients, $headers, $body);
if (PEAR::isError($result)) {
  die($result->getMessage());
}

?>

2012年2月25日。久しぶりにPHPでメールを送信しようとしたが、できなくなった。
上のコードは、以前YBBを利用していた頃のもので今から見るとPEARを使っている。当時は、何にも知らないで適当に書いていただけ。
それで、PEARなんか使わずにやってみた。ローカルので設定は非常に難しいが、ロリポップ上では簡単に動く。 しかし他で取得したアドレスを利用してYahooに送信すると、迷惑メールに入ってしまう。たぶん、なりすましと判断されているんだろう。 ロリポップのメールアドレスから送信すればいいのかと思ってやってみたが、やはり迷惑メールに入れられてしまう。

<?php
mb_language("Japanese");
mb_internal_encoding("UTF-8");
if (mb_send_mail("hoge@yahoo.co.jp", "テストメール", "これはテストです。", "From: boo@.ne.jp")) {
  echo "メールが送信されました。";
} else {
  echo "メールの送信に失敗しました。";
}
?>

そもそもログインせずにメールを送ること自体が、怪しいと認識されて当然である。
そこでやはりPEARのMAILを使って、しかもユーザー名やパスワードを入れ認証させてメールを送ったら、予想通り受信箱にきちんと入っていた。
このスクリプトは、いつもお世話になっているTatsuo Ikuraさんのサイトからコピーしたものである。

<?php
require_once("Mail.php");
$params = array(
  "host" => "",
  "port" => 587,
  "auth" => true,
  "username" => "",
  "password" => ""
);
$mailObject = Mail::factory("smtp", $params);
$recipients = "";
$headers = array(
  "To" => "",
  "From" => "",
  "Subject" => mb_encode_mimeheader("テストメール")
);
$body = "日本語メールのテストです。これはロリポップから配信しています。";
$body = mb_convert_encoding($body, "ISO-2022-JP", "auto");
$mailObject -> send($recipients, $headers, $body);
?>

ただし、このプログラムをローカルで動かすとメールは送信されるのだが、以下のように多くの警告メッセージが出る。
レンタルサーバー上ではきちんと動くのでこのままでよしとしよう。

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\xampp\php\PEAR\Mail\smtp.php on line 365
Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\xampp\php\PEAR\Net\SMTP.php on line 450
Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\xampp\php\PEAR\Net\SMTP.php on line 467
Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\xampp\php\PEAR\Net\SMTP.php on line 474
Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\xampp\php\PEAR\Net\SMTP.php on line 517

PHP 5.6 にしたらメールが送信できなくなった

現在、レンタルサーバーはXserverにしているが、最近 PHP のバージョンを5.3から5.6に変更したところ、メールが送信できなくなった。
そこでネット検索すると、「PHP 5.6.x における OpenSSL 関連の変更」という記事やら、例によって 「Strict Standards: Non-static method Mail::factory() should not be called statically」というエラーメッセージが表示されるため、 php.iniやプログラムを根本的に変更すべきというネット記事を読んで色々やってみたがうまくいかない。

pear Net_SMTPからメールが送れなくなるというページを見つけ、 こんなことやっていいのかなという疑問を感じつつ、SMTP.php を書き換えたらメールが送れるようになった。
ちなみに、このページに「最新版では直っているかも知れません。」と書いてあったので、 最新版をダウンロードしてみたが私の環境ではうまくいかなかった。

今使っているPEARはかなり以前にローカルの Windows XP にインストールしたものをレンタルサーバーにアップして使っているのだが、 いろいろなファイルをすべてアップしているので非常に重い。
そこで今回メール送信に必要なものだけを残して他のファイルを削除してみた。

この中で、「.」で始まるファイルはローカルの Linux では隠しフォルダになっているので削除しなかった。
メール送信に必須のなものは、Mail・Net フォルダと HTTP.php 、Mail.php 、PEAR.php だけである。

それと、メールは送られるようになったのだが表題が文字化けするようになった。 しかしこれは、「mb_internal_encoding("UTF-8");」を追加することによって解決した。

sendmail.php
<?php
//--------------------------------------------- PEARをドキュメントルート直下に置く(つまりindex.htmlのあるところ)
$add_path = $_SERVER["DOCUMENT_ROOT"] . "/PEAR";
ini_set( "include_path", $add_path.PATH_SEPARATOR.ini_get( "include_path" ) ); 
//----------------------------------------------------------------------------------------------
require_once("Mail.php");
require_once("Mail/mime.php");
//----------------------------------------------------------------------------------------------
mb_internal_encoding("UTF-8");		//	Subjectが文字化けしないように
//----------------------------------------------------------------------------------------------
$params = array(
	"host" => "user.xsrv.jp",		//	user は Xserverの会員 ID
	"port" => 587,
	"auth" => true,
	"username" => "hoge@user.xsrv.jp",		//	Xserverからメール送信するためにXserverでメールアカウントを取得
	"password" => "password"					// そのパスワード
);
$mailObject = Mail::factory("smtp", $params);
//----------------------------------------------------------------------------------------------
$recipients = "foo@yahoo.co.jp" ;		//	これは配列にすると複数の相手に同時送信できる
$body = <<<EOS
これはテストメールです。
EOS;
$body = mb_convert_encoding($body, "ISO-2022-JP", "auto");
$mimeObject = new Mail_Mime("\n");
$mimeObject -> setTxtBody($body);
$bodyParam = array(
  "head_charset" => "ISO-2022-JP",
  "text_charset" => "ISO-2022-JP"
);
$body = $mimeObject -> get($bodyParam);
//----------------------------------------------------------------------------------------------
$addHeaders = array(
  "To" => "WebMember",
  "From" => "hoge@user.xsrv.jp",			//	これはXserverのメールアカウント、これを間違うと送信できない
  "Subject" => mb_encode_mimeheader("Web討論会より")  
);
$headers = $mimeObject -> headers($addHeaders);
$mailObject -> send($recipients, $headers, $body);
echo("メールを送信しました") ;
?>

どっかから引っ張ってきてくっつけた感が否めないが、これできちんと送信される。

(2016年3月29日)