奇特なブログ

「殊勝に値する行いや心掛け」を意味する、奇特な人になる為のブログです

SMTPプロトコルで直接サーバーと対話するメール送信ライブラリをPHPで書いた件

GitHub対象ファイル(以下のmail~で始まる4つのファイル)

github.com

 

えっと、まずこの話は、実は2010年頃に社内案件(というのとは、また違うか)でこのプログラムを書いていた(ただ、業務では結局使っていない)んですけど、その後すっかり忘れまして(苦笑)

ただ今年ふと、自分の外付けHDDに入っているプログラム(許可は勿論取りましたが)を見ていたら、このプログラムがありまして、もうちょっとで出来上がるし書いてみるかという。

 

そもそも、「何でPHPにmail関数有るのに、こんな事をするの?」という点についてですけど、以下の通り、関数の戻り値がTRUE or FALSEしか無いんですね。

 

PHP: mail - Manual

 

あと、mb_send_mailやimap_mail関数でも一緒みたいですし。

PEARもTRUEかPEAR_ERRORの様ですし。

と思ったら、「PHPMailer」というライブラリがあり、

そこにはErrorInfoという関数があるみたいですけどね(苦笑)

どういうエラー情報取れるかってのがありますけど。

ちなみに、このライブラリだと、以下の様なメッセージ(これは成功時ですけど)です。

 

CONNECTED: 220 smtp.gmail.com ESMTP un2sm9860205pac.28 - gsmtp
EHLO/HELO: 250-smtp.gmail.com at your service, [{IPアドレス}]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
AUTH LOGIN: 334 {ユーザー名を暗号化とかハッシュ化とかエンコードとかした値?}
USERNAME: 334 {パスワードを暗号化とかハッシュ化とかエンコードとかした値?}
PASSWORD: 235 2.7.0 Accepted
MAIL FROM: 250 2.1.0 OK un2sm9860205pac.28 - gsmtp
RCPT TO: 250 2.1.5 OK un2sm9860205pac.28 - gsmtp
DATA: 354 Go ahead un2sm9860205pac.28 - gsmtp
CONTENTS: 250 2.0.0 OK 1441867397 un2sm9860205pac.28 - gsmtp
QUIT: 221 2.0.0 closing connection un2sm9860205pac.28 - gsmtp

 

あと、このライブラリ、フレームワークの中に入ってますけど、他のファイルに依存していない作りにしてますので、単体で使えます。

 

といってもまぁ、この辺

http://www.atmarkit.co.jp/fnetwork/rensai/netpro03/mail-header.html のヘッダーとか大部分は現状では対応してないですし、

あと、書いた後に気付いたけど、ezwebが送信元で認証(宛先が携帯は分かるんですけど)ってとかもありますし、

あと、コード的に、以下の書き方が大変に気に食わないというのもありますし。

 

final_magic/mail_send.php at master · kitoku-magic/final_magic · GitHub

 

どうも、以下と同じ話だと思い、色々やってみたんですけど、どうもダメでしてね(そういえば、以下のコードをそのまま実行してなかった)。

 

PHPでの対話的なソケット通信についてのメモ | ブログ :: Web notes.log

 

あと、メールといえば、メールヘッダインジェクションがありますけど、

以下を見て、「ヘッダー部分に改行があったらエラー、ヌルバイトは空白に置換」としました。

 

メール送信のセキュリティ | yohgaki's blog

 

ただ、呼び出し情報全て改行だと、本文の改行も改行も無くなってしまうので、

本文は何もしていないです。

あと、メアドのチェックも一緒で、この辺はアプリによって変わるのではと思いましたので、呼び出し側で考えてくれの方が良いんじゃないかと。

 

使い方のイメージとしては、「会員登録後のメール送信」や「お問い合わせでのメール送信」辺りを想定しています。

僕個人は今、本番サーバーのアクセスパスとアクセス数をまとめた情報を自分のメアド宛に送ってますけど、これは何となく思っただけなので、あまり意味はないかと。

あと、大量のメール配信だと、以下の様なサービスじゃないと、配信するサーバーの問題もあるだろうし、現状では難しいかもしれないですね。

 

メルマガ・メール配信ASP|アクセスメール

 

あと、これはまだ本番では対応していないですけど、「メール送信の結果(要するに上記にあったログ情報)をcronに渡して、そこからPostfixとmailコマンド使って、その情報をまた送る」というのも予定しています。

「失敗(成功の時でも来ますけど、これは用途によると思われ)した時の情報が自動でメールで来たら良いでしょ」と思いまして。夜中にその対応ってのは、「お金を出していただければ良い」と思いますし。ただ、Postfixがかなり時間かかりそうですけどね。

 

そんな所です。

あと、他にもソース見て気付いた点がありましたら、突っ込んでいただければと思います。