2008年7月10日

[PHP-users 33801] Re:既存のmail、mb_send_mailを使用しないSMTP送信について

堀田@長崎市です。

On Thu, 10 Jul 2008 14:50:34 +0900
石山 宏幸 <ishiyama@xxxxx> wrote:
Subject: [PHP-users 33800] 既存のmail、mb_send_mailを使用しないSMTP送信について

> ■最終的に知りたいこと
> ・sendmaiやqmail系のモジュールが搭載されていないor使えないサー

> バーでメールの送信をする方法
> ・ソケット通信で送信したときの動作や、その仕組み

先頭に論旨をまとめてもらっていて、わかりやすいですね。
よい質問方法の鑑だと思います(^^)v

で、その内容は、実は PHP はほとんど(まったく?)関係なくて、 SMTP
というプロトコルに関することになってしまうのですが、

> [PHが動作しているサーバー]
> 1.PHPからfsockopenで自分自身の25ポートにアクセス
> 2.HELO コマンド〜以下省略〜にてソケットにより開かれたファイル
> ポインタへコマンドを書き込んでいく。(返答により処理をする)
> 3.QUITで閉じる

この流れは、自分自身(localhost)で動作して 25 番ポートを待ち受けて
いる sendmail 等の MTA (Mail Transfer Agent)と呼ばれる(デーモン)
プロセスに接続して、MTA に対して送信を「依頼」するということにな
ります。実際にメールを送っているのは MTA の仕事です。

なので、PHP 以前に、sendmail / postfix / qmail といったパッケージ
がその OS に導入されていて、かつ(もちろん正しく設定されてから)
起動されていることが前提になります。

> mailコマンドなどは結局のところ、sendmailを直接コマンドで叩いて
> 呼び出して、ソケット通信処理をしてくれているという解釈でいいの
> でしょうか。

PHP の mail() 関数や UNIX/Linuxの mail コマンドは、sendmail パッ
ケージに附属している sendmail コマンド(同じ名前で紛らわしいです
が、前述のMTA のことではありません)を叩いているだけだと思います。
sendmail コマンドは、上記 (1)〜(3)を代行してくれているだけです。

結局のところ、実際にメールを送っているのがMTA というのは変わりま
せん。MTA が動いていないマシンでは、

> でも、ローカルで構築したsendmail系のモジュールが入ってないサー
> バーではそもそも25番のポートすらアクセスできません。ソケット通
> 信の時点でエラーになっています。

ということになってしまいます。

# Java の javamail の場合は自力で送っているらしいですが。

本当に PHP でソケット通信を行ってメールを自力で送ろうとするなら、
前述の MTA 相当のこと(すくなくともその一部)を、全部自前で作らざ
るを得なくなります。せっかく既存の仕組みがあるのに、それを無視し
て一から実装することを、この業界(?) では「車輪の再生産」とか呼ば
れていますw

背景としてはこんな感じです。MTA に頼りたくない場合は、自力で送る
ための何らかの PHP ライブラリを使うのが、一般的なやり方だと思い
ます。

--
HOTTA Michihide <hotta@xxxxx>
_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3


投稿者 xml-rpc : 2008年7月10日 15:34
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/75184
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。