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

HOTTA Michihide hotta @ net-newbie.com
2008年 7月 10日 (木) 15:34:49 JST


堀田@長崎市です。

On Thu, 10 Jul 2008 14:50:34 +0900 
石山 宏幸 <ishiyama @ minaqle.co.jp> 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 @ net-newbie.com>


PHP-users メーリングリストの案内