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

Norio Suzuki suzuki @ tricorn.co.jp
2008年 7月 10日 (木) 15:43:31 JST


鈴木です。

At Thu, 10 Jul 2008 14:50:34 +0900,
石山 宏幸 wrote:
> 
> [PHが動作しているサーバー]
> 1.PHPからfsockopenで自分自身の25ポートにアクセス
> 2.HELO コマンド〜以下省略〜にてソケットにより開かれたファイルポインタへ
> コマンドを書き込んでいく。(返答により処理をする)
> 3.QUITで閉じる
> 
> この方法は、サーバーにqmailやsendmailといったモジュール?が
> 導入されていなくても送信が出来るという考え方でいいのでしょうか。


ソケット通信の基本的な考え方は間違っていないと思います。

ただ、最終的なメールの送信先は、自サーバ内のユーザなのでしょうか?
それとも外部サーバ(外部ドメイン)のユーザなのでしょうか?

おそらく後者だと思うのですが、ライブラリ等を使わずに、全て PHP で実装す
ると、かなり面倒ですよ?

自サーバに Sendmail や qmail, Postfix などの MTA をインストールできない
場合、その代替措置として、別のメールサーバが用意されているような気がす
るのですが、そちらの利用方法を調べた方が良いのではないかと思います。


もし、MTA を使わず、全てを PHP で実装するなら、ざっくり考えてもこの辺の
コードが必要です。

1. メールアドレスからドメイン部分を抜き出す
2. DNS を利用し、ドメイン部分の MX サーバの IP を取得する
3. MX サーバの IP アドレスへソケット通信をオープンする
4. SMTP プロトコルで送信
5. エラーの場合はエラー処理

これらは Sendmail や qmail, Postfix などの MTA が行っている事をそのまま
再実装することになります。

なお、SMTP プロトコルの知識がないといろいろと問題が発生します。

SMTP プロトコルに精通しているので無ければ、ソケット通信ではなく、既存の
ライブラリを利用した方が安全だと思います。


;; ---------------------------------------------------------
;; 鈴木則夫 <suzuki @ tricorn.co.jp>
;; トライコーン株式会社 http://www.tricorn.co.jp/
;; 160-0015 東京都新宿区大京町24 住友外苑ビル5F
;; Tel 03-5919-0041 Fax 03-5919-0042


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