PHPのPEAR:Mailを用いGMailのSMTPサーバでメールを送信する

PFU Happy Hacking Keyboard Lite2 日本語配列かな印字なし USBキーボード ブラック PD-KB220B/U

PFU Happy Hacking Keyboard Lite2 日本語配列かな印字なし USBキーボード ブラック PD-KB220B/U

プログラムを作ろう!  MS VISUAL C++ 2010 入門 (MSDNプログラミングシリーズ)

プログラムを作ろう! MS VISUAL C++ 2010 入門 (MSDNプログラミングシリーズ)

  • ほぼ必要最低限のPHPコード
    • GMailのアカウントからYahooメールのアカウントへ送信できる。別に宛先はどこでもいい。
    • 自宅にメールサーバを構築しようかと考えたのだがふとGMailの事を思い出し、これならサーバをつけっぱにしなくてもいい!と思いかなり軽率な動機でやってみた。しかしよくよく考えると自宅サーバなどよりよほど安定してそうだ。本格的にこれを使うことにするか・・・
    • GMailはUIの使い勝手こそデスクトップアプリには及ばないが、Googleが用意してくれているサーバを使えるという点が使える。ThunderBirdではソフトウェアの仕様としてGMail用のアカウント作成を促すUIまで存在する。それほど信頼のおけるサーバだと認識してよいだろう。
<?php
	$res = require_once("mail.php");
	if( $res ) echo $res; else echo "ページエラー";
	
	$params =
		array(
			'host' => 'tls://smtp.gmail.com', // tlsプロトコル指定をつけないとだめかも        
			'port' => 465,
			'auth' => true,
			'debug' => false,
			'username' => 'gmail_account', // メールアドレスではなくてユーザ名のみ
			'password' => 'gmail_password'
			);
	$headers  =  
		array (
			'To' => 'yahoo_account@yahoo.co.jp',
			'From' => 'gmail_account@gmail.com',
			'Subject' => 'test'
			);
		
	$mailto = 'yahoo_account@yahoo.co.jp';
	$body = 'boooooooooooooooodyyyyyyyyyyyy!!!'; 
	$smtp = Mail::factory( 'smtp',  $params );
	$smtp->send( $mailto,  $headers,  $body );
?>
  • 正直このやり方の答えをググッって見つけるのには少し苦労した。TLSプロトコル指定をしなければならないのとユーザ名指定のところでは、変な解説をしているところにあたってしまい、大いに迷わされた。この例では日本語メールが扱えないので少し修正しなければならない。ここで重要なのはGMailSMTPサーバをPHPから扱えるようになること。
    • 大筋ではこのような説明をしてくれている所ばかりなのだが微妙に間違っている。説明してくれている本人はそれでできたのだろうかと思う。そして正しい答えがなかなかないorz。しかしあるところにはあったw。
    • Subjectに入れる文字列をmb_encode_mimeheaderでエンコードしなくてもYahooメールでは普通に日本語表示してくれる!つまりエンコードされていないデータを賢くも(たまたま?)エンコードしなおして表示してくれているということか。ボディには試してないがおそらくできるのではないか?ちなみにOutlookで受信してみたらできなかった。設定次第ではできるのかもしれないが、決してお勧めできるものではない。
<?php
	require_once("mail.php");
	require_once("Mail/mime.php");
	
	mb_language("japanese"); //
	mb_internal_encoding("EUC_JP"); //
	
	$params =
		array(
			'host' => 'tls://smtp.gmail.com',          
			'port' => 465,
			'auth' => true,
			'debug' => false,
			'username' => 'g_account',
			'password' => 'g_pass'
			);
		
	$headers  =  
		array (
			'To' => 'some@some.com',
			'From' => 'g_account@gmail.com',
			'Subject' => mb_encode_mimeheader("さぶじぇくと") // エンコード
			);
		
	$mailto = 'some@some.com';
	
	$body = "おはよう。朝御飯";
	$body = mb_convert_encoding( $body, "ISO-2022-JP", "auto" ); // エンコード
	$smtp = Mail::factory( 'smtp',  $params );
	$smtp->send( $mailto,  $headers,  $body );
?>
  • 気になる点
    • GMailSMTPサーバが使用する暗号通信プロトコルが変更になった場合などはどうか?そういった変更が結構な頻度であるとすると、いちいち対応しなくてはならなくなる。
  • あとはフォームからデータをPOSTして送るようにしてやればそこそこ使えるものになるだろう。UI部分はAjaxやHTMLだとかっこよくするのに手間暇かけるだけなのでもちろんFlexを使う。
    • Flexで作成したSWFからPHPスクリプトにPOSTしたデータなどは文字コードにずれが出るので、受け取った文字列のデータなどは上の例ではすべてISO-2022-JPエンコードしなおしてからメール本文に付け加えたりしてやらねばならない。そうしないと本文が文字化けする。Flex側でFlexアプリの文字コードを変えてみたがどうもうまくいかなかった。PHPエンコードすれば大丈夫なのでやっていないがそのうち調べてみる。

Battlefield 3 - Limited Edition (PC・輸入版)

Battlefield 3 - Limited Edition (PC・輸入版)

バトルフィールド 3

バトルフィールド 3

バトルフィールド 3

バトルフィールド 3

バトルフィールド 3

バトルフィールド 3

よくわかるPHPの教科書

よくわかるPHPの教科書

Webサイト制作者のための PHP入門講座

Webサイト制作者のための PHP入門講座

PHP 逆引きレシピ (PROGRAMMER'S RECiPE)

PHP 逆引きレシピ (PROGRAMMER'S RECiPE)

パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)

ゼロからわかる PHP超入門

ゼロからわかる PHP超入門

学生のためのPHP言語 ─基礎からウェブシステムまで

学生のためのPHP言語 ─基礎からウェブシステムまで