CakePHP

CakePHP Qdmailメール送信でメールが受信されない

Qdmailは、メール送信でBase64のコード変換や細かい作法を気することなく、日本語が文字化けしないようにメール送信を面倒見てくれる、大変優れたPHPライブラリである。国産で保守がしっかりされているので、安心して利用でき、使っている人も多いと思う。

最近サイトのお引っ越しでのリニューアルで、フォームメールのメール送信が、さくらインターネットへメールが届かない(受信しない)現象に出くわした。どうやら、原因が2つ3つ重なっていたようだ。

1.Return-PathがFrom送信者と同じでない

と、さくらインターネットのメールサーバは、メールを受け付けてくれないようである。QdmailでReturn-Pathを設定するには、 Qdmail(1.2.6b)の他、Qdsmtp(0.2.0a)を使う。Qdsmtpは、Qdmailから自動的にロードされるので、Qdmailの置 き場所(CakePHPではcontrollers/componentsディレクトリ)に、一緒に登録しておく。

    $param = array(
    'host' => 'xxx.net',
    'port' => 25,
    'from' => 'xxx@xxx.net'
);
$this->Qdmail->smtp(true);
$this->Qdmail->smtpServer($param);

2.SMTPサーバの認証が通っていない

メールが受信されるようになったので一安心していたのだが、次の日フォームメールを送ると、エラーが表示されるようになった。

QdSmtp error: Failure :status553 message:553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1) on RCPT TO:<xxx@xxx.jp>
line -> 551
QdSmtp error: Error RCPT setting line -> 497
QdSmtp error: Error :status503 message:503 RCPT first (#5.5.1) on DATA
line -> 554
QdSmtp error: Error Data sending line -> 510
Qdmail error: Qdmail Version 1.2.6b ,PHP Version 4.3.9
Qdmail error: OS Linux ; PHP Version 4.3.9 ; 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 send . Because SMTP mail method replied error line -> 2190
Qdmail error: Send Error line -> 2115

どうやらSMTPサーバに蹴られているようだ。認証は、POP Before SMTP方式なので、Qdsmtpへのパラメータを変更する。

$param = array(
    'host' => 'xxx.net',
    'port' => 25,
    'from' => 'xxx@xxx.net',
    'protocol' => 'POP_BEFORE',
    'pop_host' => 'xxx.net',
    'pop_user' => 'myname',
    'pop_pass' => 'mypass'
);

3.PHPセーフモードによるファイル書き込み禁止を回避する

ここに到達するのに、時間がかかった。

Qdsmtpはアクセス制御用のファイルを出力するので、まずは、出力をしないようにするためQdsmtpのメソッド「pop3UseFile()」を実行するのだが、「はて、Qdsmtpへの参照はどうするのだろう?」。

Qdmail関係のドキュメントを豊富に公開してくれているので、ここを見て助かったm(_ _)m。

$this->Qdmail->smtp(true);
$this->Qdmail->smtpServer($param);
$qdsmtp = & $this->Qdmail->smtpObject();
$qdsmtp->pop3UseFile(false);

さあ、これでOK。メールを送信するぞっ、っと…… orz ダメポ

うーん、さんざん悩んだ挙句、「pop3UseFile()」を使うのやめて、ディレクトリの許可属性を「rw」にしたところ、おーーーー、エラーが出ずに送信できた (T_T)。

で、「pop3TimeFilename()」で出力ファイルを決めて、めでたし、めでたしだったとさ。

POP Before SMTPは、クライアントのメーラーを利用するとしばらく送信が有効になるので、チェックするのに待ち時間が必要で貴重な休日の時間を一杯使ってしまったが、電子メールについていろいろ分かったこともあったので、良しとしよう(ムリヤリ納得)。