Qdmailのエラーの意味が・・・

2011/04/20 | メール

メールを送る際は、Qdmail + Qdsmtpを活用するようにしている(特に数通以上送信する場合)。今日プログラムを作っていてエラーが出た。

Qdmail error: Qdmail Version 1.2.6b ,PHP Version 5.1.6
Qdmail error: OS Linux ; PHP Version 5.1.6 ; Qdmail version 1.2.6b
php.ini status: mb_language = Japanese ; mb_internal_encoding = UTF-8 ; mb_detect_order = ASCII,JIS,UTF-8,EUC-JP,SJIS
Qdmail Status debug: 0, log: 0, errorlog: 0
Qdmail error: No recipient line -> 2849
Qdmail error: Error happen, see upper line -> 2194
Qdmail error: Send Error line -> 2115

このメッセージを見ると「No recipient line」とあることから、toの指定をしていないように読み取れる。しかし実際はプログラムで指定してある。

$qdMailObj->to($email);

ちなみに上記一行の結果をvar_dumpしてみると、ちゃんとtrueを返してくれる。解せない。

結論から言うと、$emailにはちゃんとメールアドレスが入っていたのだが、これにゴミが付いていた(メールアドレスの後ろに半角スペース)。だから事前にtrimすることで解決できた。

でもそのくらいのことがダメなんだったらtoするときにfalseを返して欲しかった(まぁ、メールアドレスのチェックまでライブラリに頼るのか、という意見もあるかとは思うが)。もしくはエラーメッセージがもう少し分かりやすければよかったのに、と思った。

postfixの設定

2011/01/30 | メール

postfixの設定で、設定変更したら必ず以下のコマンドで設定を再読込。

/etc/rc.d/init.d/postfix reload

/etc/aliasesの記述を変更したら、以下のコマンド。

newaliases

/etc/postfix/virtual他のファイルの記述を変更したら、以下のコマンド。

postmap /path/to/file

postfixで.forward

2011/01/27 | メール

最近は、昔やっていたことを思い出せないことが多い。普段使わないと忘れてしまうのは当たり前の話なのだが、やっぱり年のせいだろうか。

postfixで.forwardを使ってプログラムにパイプするときの記述方法をメモ。

|”/usr/bin/php /path/to/script.php”

コマンドをダブルクォーテーションで囲んでおく。これで動かない場合は、こんな原因が考えられる。

  • そもそもスクリプトがパースエラー
    事前にパースエラーがないよう十分なチェックが必要
  • そもそも指定ユーザにメールが届いていない
    いくらスクリプトが正しく記述されていても、当該ユーザに対してメールが送信されていなければ・・・。
  • そもそもメールサーバの指定が間違っている
    外部から送信されたメールが受け取れない、とかではお話にならない。
  • そもそもメールが受け付けられていない
    ファイヤーウォールやiptables等の設定でメールが受け取れない設定になっている。

ま、いろいろあるわな。

chkconfig –list でpostfixが見つからない

すごく嫌なのだが、またサーバの設定をすることになった。

以前(といっても10年前の話だけど)は、ネットワーク屋さんではSMTPといえばqmailが流行だったように思う(主流はもちろんsendmailだったけど設定の難解さやセキュリティ問題等で避けられることが多かった)。

今はpostfixを使っている人が多いのではないだろうか。かくいう自分もpostfix。設定が簡単だし、デフォルトのyumリポジトリで簡単に管理できるからだ(OSはCentOS)。

今日、新たに借りたVPSの設定をしていて、起動時の設定を確認してみて少しあわてた。postfix自体はインストールされているのだがchkconfigの中にpostfixが見つからないのだ。ん~。何か理由があったような気がするけど、数年に1度しか設定しないのでわからない・・・。

とりあえずpostfixをいったんアンインストールし、再度インストール。しかしそれでも状況は変わらない。とよく確認してみると、chkconfigのリストの中にsendmailがある。あー、これかも。yumでsendmailをアンインストールして再度chkconfigで確認。ありました、ありました(というか現れました)。見つかりました、postfixが。

どちらも25番ポートを使うわけで、両方起動するようになっていると問題が起きるから、うまく制御されていたわけか。

あー、でも別ポートでそれぞれ起動させたい場合はどうなるんだろう、という疑問があったけど、自分はそういう使い方はしないので、これでヨシとした。

Qdmailでの大量メール送信メモ

2010/12/13 | メール

Qdmail+Qdsmtpで大量メール送信を実現できることはメモした。しかし送信するメールがそれぞれ「添付ファイルの有無」「CCの有無」「BCCの有無」「HTMLメールかテキストメールか」など、宛先によって使い分けないといけないことも多々ある。そんな時、Qdmailを普通に使ってしまうと上手く動作しなくなる。

$qdObj=new Qdmail();
$qdObj->smtp(true);

などとして初期化し、SMTPオプション用のパラメータをセットして送信準備完了。このあとループ処理に入るわけだが、最初に添付ファイル付きメールを送信し、次に添付ファイルなしメールを送信すると仮定する(とりあえず同じ文章を送信することにする)。

$qdObj->to($to);
$qdObj->text($text);
if($attach){
$qdObj->attach($attach);
}
$qdObj->send();

「宛先と本文をセットして、添付があればそれをセットして送信」。他にもfromやらsubjectやらあるので適宜セット。これをループで回すだけなのだが、実はこれNG。最初の送信は問題ないのだが、1回目の送信で添付ファイルがセットされると、2回目の送信でも1回目と同じ添付ファイルを送信してしまう。それは同じオブジェクトを使いまわしているからだ。宛先と本文は上書きしているのだが、添付ファイルは上書きしていないことが原因だ。もちろん何がしかの上書き処理をいれればよいのだが、いろいろな項目で(CCやらBCCやら)上書き処理するのはちょっと面倒ではないだろうか。

Qdsmtpには便利なメソッドが用意されている。reset()だ。このメソッドを呼び出すと格納した内容がクリアされるのだが、このメソッド、全部クリアしてしまうのだ(そのように動作しているように見えるのだが、プログラムの中を読んでいないので定かではない)。つまりSMTP送信もコネクションも一切合切クリア。2通目を送信する際にはSMTPオプションのセットから何からやり直し。当然コネクションも貼り直し・・・。これではmb_send_mailでループ処理するのと同じことになってしまう。

でも実は大丈夫。別の方法で乗り切ることができる。

ループ処理の際、生成したインスタンス$qdObjに対して直接本文等を代入するのではなく、いったんcloneしてから処理すれば良い(ループ中の最後の処理でコピーした変数をunset()する)。これを使えば、メールの内容は毎回リセットされているし、かつ一つのSMTPコネクションで複数メールを送信できるようになる。

工夫は必要だけれども、いいライブラリは工夫次第で、その恩恵を十二分に享受することができる(ひょっとしてこれらのことも考慮したメソッドが用意されているのかもしれないけれど・・・)。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net