ようこそゲストさん

Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte

サポート

作者は、操作に関する質問はメールでは受け付けていません。
質問のある方、動作・バグ報告などはこのエントリーまたは関連する記事にコメントをつけることで行って下さい。ただし、作者の都合により、その質問には回答が寄せられないことがあります。

ご意見、感想も大歓迎です。というか感想聞きたいです。
質問の前にこちらの、トラブル時に試してみること、をお試し下さい。
なお、質問の際には、下記情報をお教えいただければ、解決の可能性が高くなります。
■Qdmailバージョン
■QdSmtpバージョン
■PHPのバージョン
■OS名称 & バージョン
■MTAの種類(sendmailかPostfixかqmailか)
■お使いのソースコード(公開されて支障がある部分は適当に変更してください。)
■ソースコードの文字コード、改行コード
■デバッグモード http://hal456.net/qdmail/debug での出力内容
なお、PHPのmail関数は問題が多いです。
mail関数でダメなときは、SMTP送信をお試し下さい。


操作に関する質問以外で、作者に連絡を取りたい場合は、プロフィール&連絡先をご覧下さい

記事リスト

# spok 2008年10月24日(金) 午後11時09分

サポートの過去ログは、
http://hal456.net/qdmail/support_past_1
http://hal456.net/qdmail/support_past_2
http://hal456.net/qdmail/support_past_3
に移動しました。

# kt 2008年10月25日(土) 深夜0時25分

qdmailを設置しているメールサーバがPostfixで、VERPという形式を利用したいと思っています。
http://www.postfix-jp.info/trans-2.1/jhtml/VERP_README.html

通常のsendmailでの送信の場合は
optionのmtaOptionに"-V+= -f bounce"というように指定すればVERP形式で送信されました。

SMTP送信の場合、
「MAIL FROM:<sender@domain> XVERP」
このような指定をしなければいけないのですが、qdmailのsmtpの設定で
'from'=>'home@domain VERP'

としても
QdSmtp error: Error :status501 message:501 Bad address syntax on MAIL FROM:<hoge@domain VERP>

というエラーメッセージが表示され、メッセージを見ると<>中にVERPが記述されています。

<>の外に追記したい場合、どのように記述すれば良いのでしょうか?

# spok 2008年10月25日(土) 深夜1時10分

VERPの機能は知りませんでした。情報ありがとうございます。
Qdsmtpを2.0.0a以降にバージョンアップし、
http://hal456.net/qdsmtp/xverp
を参考にSMTPのパラメータを指定してみていただけますでしょうか。
当方はsendmail環境なので、動作の結果をお教えいただければ幸いです。

# kt 2008年10月26日(日) 午後5時27分

更新していただきありがとうございます。

ただ、以下のようなエラーが出ます。

QdSmtp error: Unkown Error :status555 message:555 Unsupported option: XVERP on MAIL FROM:<from@example.com> XVERP
line -> 562
QdSmtp error: Error From setting line -> 488
QdSmtp error: Send Data Error or Auth Error line -> 415
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 send . Because SMTP mail method replied error line -> 2190
Qdmail error: Error 'TO' Separate mode in Sendbase function , the Address is -> to@example.com line -> 2096
Qdmail error: Send Error line -> 2115


送信方法はqd_send_mailです。XVERPの設定をしない場合は、送信出来たので
こちらのソースには問題ないかと思います。

お手数ですが、再度お願いします。

# spok 2008年10月26日(日) 午後7時33分

推測ですが、555のエラーということは、そのSMTPサーバーは、VERPをサポートしていないということ思います。

そのSMTPサーバーは、sendmailコマンドでVERPを使ったのと同じlocalhostのサーバーでしょうか?
そうだとすると外部向けには、VERPを使えないようにしているということかと思います。



レンタルサーバーのXserverにて試してみましたが(PostFix)、ログをみると、そもそもVERPはサポートしていませんでした。

SMTPのログをとってみていただき、EHLOコマンドの後にVERPがあるかどうかをみていただければ、そのサーバーがVERPをサポートしているかどうかわかるかと思います。


Xserverの例)(VERPは含まれていない)

QdSmtp EHLO ****.****.jp
Server 220 sv****.****.jp ESMTP Postfix
Server 250-sv****.****.jp
Server 250-PIPELINING
Server 250-SIZE 102400000
Server 250-VRFY
Server 250-ETRN
Server 250-STARTTLS
Server 250-AUTH LOGIN PLAIN
Server 250-AUTH=LOGIN PLAIN
Server 250 8BITMIME
以下、略。


こちらのログでは、正しく命令はセットされているものの、相手から、
Unsupported option
としてエラーが返ってきています。

繋いでいるサーバーが、VERPをサポートしているにもかかわらず、エラーになる場合はお手数ですが、再度ご連絡ください。

# spok 2008年10月26日(日) 午後7時35分

SMTPのログは以下のようにしてとることができます。出力されたログには、メールアドレス等の情報が記載されていますので、注意してください。

$option = array(
'type' => 'text',
'smtp' => $param,
'option'=>array(
'logLevel'=>2,
'errorlogLevel'=>2,
'smtpLoglevelLink'=>true,
),

これは、Qdmailのログレベルを2に設定し、それと同じレベルのログをとるよう、Qdsmtpに命令する方法です。

# kt 2008年10月26日(日) 午後8時44分

>そのSMTPサーバーは、sendmailコマンドでVERPを使ったのと同じlocalhostのサーバーでしょうか?

同じサーバです。自宅サーバなので、VERPを使えるのは確認しました。

エラーログの件ですが、上記に記載していただいたoptionの指定をして実行し、qdsmtp_error.logには以下のように記載されています。(※メールアドレスの箇所は省きました)

2008-10-26 20:40:03
QdSmtp error: Unkown Error :status555 message:555 Unsupported option: XVERP on MAIL FROM: XVERP
line -> 562
2008-10-26 20:40:03
QdSmtp error: Error From setting line -> 488
2008-10-26 20:40:03
QdSmtp error: Send Data Error or Auth Error line -> 415

もし、こちらのログを取る設定方法がおかしければ、再度ご指摘いただければと思います。よろしくお願いします。

# spok 2008年10月26日(日) 午後9時04分

たびたびすいません。エラーログでなく、qdsmtp.logのEHLO以下をご確認いただだき、

Server 250-VERP (またはXVERP)

という表記があれば、VERPが使用可能ということになりますが、これの表記をご確認ください。

>VERPを使えるのは確認しました
とのことですが、どのように確認されましたでしょうか?

PostFixのsendmailコマンドで使用可能であっても、SMTPサーバーとしては使用不可能な設定もあるかと思います。

私自身はPostFixは詳しいわけではないのですが、例えば、「PostFix詳解(オーム社、荒木靖宏著)」P288-290によると、XVERPのネットワークの制限(authorized_verp_clients)などの指摘もあります。

この場合、お使いのQdmail&Qdsmtpの環境で確実にVERPが使えるかどうかは、qdsmtp.logの、EHLO以降のログを確認するのがもっとも手っ取り早いと思います。

# kt 2008年10月26日(日) 午後10時14分

sendmail形式で送信されていたのと、Postfixのバージョンを満たしているので「SMTP送信でもVERPが使える」と思っていました。

ただ、私もPostfixについてそれほど詳しいわけではありませんので、明確な確認方法は提示出来ません。

また、qdsmtp.logを見ると
>Server 555 Unsupported option: XVERP

というメッセージがあるのですが、サポートされていないみたいですね。

とりあえず現時点ではPostfixの設定をどのように変更してSMTP送信されるように有効化するかわかりかねます。質問しておいて申し訳ないのですが、今後出来るようになりましたら、御報告させていただきます。

# spok 2008年10月26日(日) 午後11時40分

http://www.postfix-jp.info/trans-2.1/jhtml/postconf.5.html
のページで、authorized_verp_clientsがついたオプションをみるとヒントがあると思います。
たぶんデフォルトでは、外部からの接続に対しては、VERPは開放していないと思いますので、PHPスクリプトが置いてあるドメインなどを登録するようにすればいいような気がします(気がするだけ)。

# spok 2008年10月26日(日) 午後11時44分

authorized_verp_clientsかsmtpd_authorized_verp_clientsですね。
PostFixのバージョンによって異なるようです。
「デフォルトでは、どのクライアントも XVERP を指定することはできません。」
とあるので、明確にドメインやIPアドレスで指定してあげないとダメみたいですね。

# kt 2008年10月27日(月) 午後4時36分

コメントありがとうございます。

こちらのテスト環境のPostfixは2.2.10なんですが、
main.cfに以下の記述を追記したところ、SMTP送信でVERPが反映されました。

smtpd_authorized_verp_clients = $mynetworks

とりあえず御報告させていただきました。

# spok 2008年10月27日(月) 午後6時04分

ご報告ありがとうございました。
動作するようになってよかったです。

# FK 2008年10月28日(火) 深夜2時33分

はじめまして。
Qdmail + QdmailReceiver を使用するために勉強させていただいています。

Docomoの906からデコメにflashが使えるようになったようですが、Content-IDを取得することができません。

gif/jpegの場合は

--mimemk00
Content-Type: image/gif;
name="ikari_l_a_01.gif"
Content-Transfer-Encoding: base64
Content-ID: <02@081029.021115@__N906imyu@docomo.ne.jp>

と取得できるのですが、

flashの場合は

--mimemk00
Content-Type: application/x-shockwave-flash;
name="event01.swf"
Content-Transfer-Encoding: base64

というように、Content-IDがでてきません。

Flashは対応していないのでしょうか・・・。
それとも、設置面でなにか不備があるのでしょうか。

ただ、HTML部には
--mimemk01
Content-Type: text/html; charset="iso-2022-jp"
Content-Transfer-Encoding: quoted-printable

<HTML><HEAD><META http-equiv=3D"Content-Type" content=3D"text/html; charset=
=3Diso-2022-jp"></HEAD><BODY><DIV><OBJECT data=3D"cid:01@081029.021115@__N9=
06imyu@docomo.ne.jp" type=3D"application/x-shockwave-flash"></OBJECT></DIV>=
<DIV><IMG src=3D"cid:02@081029.021115@__N906imyu@docomo.ne.jp"></DIV><DIV>=
=1B$B$L$R$+$J$d=1B(B</DIV><DIV><IMG src=3D"cid:03@081029.021115@__N906imyu@=
docomo.ne.jp"></DIV><DIV><A href=3D"http://www.caba2.cc/">http://www.caba2.=
cc/</A></DIV><DIV> </DIV></BODY></HTML>
--mimemk01--

と出てきます。


使い方は
携帯メールからpostfixを使ってデコメをプログラムに渡し、

$body = $DECODE -> bodyAutoSelect();

で、情報を取得するという使い方をしています。

お忙しいとは思いますが、どうか教えてください。
よろしくお願いします。

# spok 2008年10月29日(水) 午後10時43分


FKさん

現象を確認いたしました。次回更新にて対応したいと思います。
flash というよりも、OBJECT data 形式に未対応ということです。

ちょっと本業多忙中でして、そのうちに対応したいと思います。

# FK 2008年10月29日(水) 深夜0時22分

早速の返信ありがとうございます。

906シリーズがかなり多くなっており、実際インラインで使うflashもgif/jpgの違いもわからない人ばかりなので・・・。

お忙しいとは思いますが、よろしくお願いいたします!

# kt 2008年10月30日(木) 午後5時41分

QdSmtpの事で気になった事があります。(書く場所を間違っていたらすみません)

存在しないメールアドレスを指定すると以下のようなエラーメッセージが表示されます。

QdSmtp error: Failure :status553 message:553 5.3.0 <aaa@domain>... Recipient is not local (2) on RCPT TO:<aaa@domain>
line -> 551
QdSmtp error: Error RCPT setting line -> 497
QdSmtp error: Error :status503 message:503 5.0.0 Need RCPT (recipient) on DATA
line -> 554
QdSmtp error: Error Data sending line -> 510
QdSmtp error: Send Data Error or Auth Error line -> 415
Qdmail error: Qdmail Version 1.2.6b ,PHP Version 5.2.0
Qdmail error: OS WINNT ; PHP Version 5.2.0 ; 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: Error 'TO' Separate mode in Sendbase function , the Address is -> aaa@domain line -> 2096
Qdmail error: Send Error line -> 2115


これは宛先のメールサーバにアクセスして、メールアドレスの存在を調べているのでしょうか?

# spok 2008年10月30日(木) 午後7時22分

>これは宛先のメールサーバにアクセスして、メールアドレスの存在を調べているのでしょうか?
違うと思います。

# kt 2008年10月30日(木) 午後8時28分

そうですか。存在するメールアドレスを指定したら出ないエラーだったので、そう言う事がQdmailとQdsmtpで出来るのかと思いました。

# spok 2008年10月30日(木) 午後10時37分

これは送信SMTPサーバーが返すエラーです。

# yuipapa 2008年11月01日(土) 午後5時38分

いつもおせわになっております。

初めて、質問させていただきます。
関数型のQdmailを使用し、メール送信をしているのですが、
他のサイトでは、全く問題なく使用できていたのですが、
なぜか、メール本文に、
Message-Id: <Qdmail.1.2.5b_f7d9f800cc19851c4296522dc78074ac25fef0da@hal456.net>

Content-Type: text/plain; charset="iso-2022-jp"

Content-Transfer-Encoding: 7bit

MIME-Version: 1.0

X-PHP-Qdmail: version-1.2.5b The_MIT_License http://hal456.net/qdmail PHPver 4.3.9

send-by MailFunction
Date: Sat, 1 Nov 2008 17:23:56 +0900 (JST)

と、いうようにヘッダー情報が混入してしまいます。
どこか設定を、間違えているのでしょうか。
ご指摘いただけると幸いです。

■Qdmailバージョン(1.2.6b)
■PHPのバージョン(4.3.9)
■MTAの種類(sendmailかPostfixかqmailか)
■お使いのソースコード


$to = array(HONSYA_MAIL_ADDR,"本社担当");
$from = array( $email, $name."様" );
$subject = "お客様からのお問い合わせ";
$mailbody = $name." 様\r\n\r\n";
$mailbody .="お問い合わせ内容:\r\n".$body."\r\n";

qd_send_mail( $option, $to, $subject, $mailbody, $from );

■ソースコードの文字コード(SJIS)、改行コード(CRLF)

# spok 2008年11月01日(土) 午後7時57分

MTAがqmailの可能性があります。つまり、CRLFをMTAが勝手にCRCRLFに変更してしまうことが原因と考えられます。
http://hal456.net/qdmail/trouble_4
を参考に、改行コードをLFのみにしてみてください。

# yuipapa 2008年11月01日(土) 深夜0時08分

http://hal456.net/qdmail/trouble_4
を参考に、改行コードを変更してみましたが、結果は同じでした。
他に考えられる原因は、ありますか。

# yuipap 2008年11月01日(土) 深夜0時22分

//$subject = mb_decode_mimeheader($subject);
$option =

array(
array( 'type'=>'text' ),
array( 'option'=> array(
'lineFeed'=>"\n",
)
),
);
qd_send_mail( $option, 'yuipapa@virtualbrain.com', "TEST", "TEST", "yuipapa@virtualbrain.com" );

で送信テストを行ってみましたが、
Message-Id: <Qdmail.1.2.5b_5ab4948fd375629eb244a5e03c8c563ea8cc27e6@hal456.net>
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
X-PHP-Qdmail: version-1.2.5b The_MIT_License http://hal456.net/qdmail PHPver 4.3.9
send-by MailFunction
Date: Sun, 2 Nov 2008 00:18:57 +0900 (JST)

TEST
と、ヘッダーが、本文に付加されてメールが届いてしまいます。

# spok 2008年11月02日(日) 午前6時17分

array(
'type'=>'html' ,
'option'=> array(
'lineFeed'=>"\n",
),
);
としてみてください。

# spok 2008年11月02日(日) 午前6時18分

マニュアルの記載が間違っておりましたので修正しておきました。

# yuipapa 2008年11月02日(日) 午後5時33分

ありがとうございました。
解決しました。qdmailは、qmilと相性が悪いのでしょうか。
(ご指摘の通り、問題のサイトはqmalでした)

# kt 2008年11月02日(日) 午後8時08分

いつもお世話になっております。

Qdmailの動作で気になる箇所があったので、デバッグモードで調べたく思い、
http://hal456.net/qdmail/debugを参考に
qd_send_mail('text','宛先メールアドレス',$subject,$body,'差出人メールアドレス',2)
としました。

しかし、以下のようなエラーが出ます。

Warning: reset() [function.reset]: Passed variable is not an array or object in /home/test/public_html/lib/qdmail/qdmail.php on line 2883
Qdmail error: No attach file '' line->3036
Qdmail error: Error happen, see upper line -> 2194
Qdmail error: Send Error line -> 2115

添付ファイルがありませんというようなエラーに見えるのですが、
添付ファイルを送信しようとしていません。

これは何が原因でしょうか?お手数おかけしますが、ご意見いただければと思います。
バージョンは最新のものを使っています。

# spok 2008年11月02日(日) 深夜0時26分


ktさん

マニュアルの記載が間違っていました。
qd_send_mail( 'メールタイプ' ,
'address@example.com',
'件名',
'本文',
'from@example.com',
         $attach, // 添付ファイルがない場合は、null
2
);
としてみてください。
マニュアルも修正しておきました。

# spok 2008年11月02日(日) 深夜0時29分


yuipapa さん

相性が悪いといえば悪いのでしょうが、そもそもqmailがRFCに違反しまくりのMTAであるのに、多くは軽い(またはメンテナンス性がよい)という理由で多くのサーバーに採用されている現状では、どうしようもないことかと思っています。
またQdmailは、PHPのマニュアルを守るようにしており、それを守ろうとすると、qmailと相性が悪くなる、ということも原因のひとつです。
どちらかというと、Qdmailとqmailの相性というよりも、qmailとPHPの相性の問題です。
しかし、Qdmailは様々な部分で、qmail対策をしており、他のPHPメーラーよりも、qmail対策の最も進んだスクリプトであると自負しております。
(参考)
http://ya.maya.st/mail/qmail-violations.html

# kt 2008年11月02日(日) 深夜0時55分

デバッグモードの件、ありがとうございます。エラー無く送信内容が表示されました。

それでデバッグモードにして調べたいと思った事なのですが、
以下のソースをご覧ください。

for($i=0;$i<5;$i++){
$flag = qd_send_mail("text",$to,$subject,$body,$from,$attach,2);
echo $flag."<br>";
}

BCCやCCを使うのではなく、複数宛先に送信する為に上記のようにforで繰り返して送信させようとしました。
(上記ソースでは簡単にしています)

既存のプログラムがmail関数だったので、テストも兼ねてQdmailを利用してみたのですが、
なぜか送信が1秒置きに行われています。(ほぼきっかり1秒です)

mail関数だと5通ぐらいは一瞬で送信出来たので、サーバの問題でもないかと思います。
自宅サーバでもさくらのサーバでも同じ現象が起きました

qdmail.phpのソースを見てもsleepの設定がないので、1秒間隔で送信されるのはおかしいと思っているのですが、
いかがでしょうか?見落としている設定がありましたら、ご指摘下さい。

再度すみませんが、よろしくお願いします。

# spok 2008年11月02日(日) 深夜1時20分

QdmailにはSleepの機能はありません。

サーバーの問題でなければ、Qdmailは、送信実行前に重い処理を行っているので、それが原因かもしれません。
またデバッグモードもスピードを低下させます。メモリもそれなりに使用するので、場合によってはそれが制約条件となっているかも知れません。

それを回避するために、toSeparateモードがあるのですが。。。。
http://hal456.net/qdmail/toseparate
しかし、これでも状況によりけりですが、あまり高速化は期待できないかも知れません。
素のmail関数と比べれば、当然にQdmailはスピードは落ちます。

また、メール送信そのものを高速化したければ、mail関数を用いる方法は使ってはいけなくてSMTP送信で対応すべきです。(もちろん、送信前の処理の重たさはmail関数でもSMTPでも変わりはないのですが。)

(参考)
http://www.cpa-lab.com/tech/0151

# kt 2008年11月02日(日) 深夜1時34分

回答ありがとうございます。実際の送信はSMTPで行っているのですが、メールログを見るとなぜか1秒間隔で送信されていたので、どこに原因があるかソースを縮小して探っていました。

Qdmailは大変高機能で素晴らしく、HTML・添付メールを送る時や文字化けにも対処しているので、かなり重宝しているのですが、「送信スピードが落ちる」となると、一括メール配信系には利用出来ませんね。

toSeparateを使わなかったのも、個別でログに書き出したかったり、DBと連動しているのでその対処で使いませんでした。

SMTP送信でも「1秒ごとに送信される」という状況は変わりませんので、用途を限定するしか方法はなさそうです。メール送信部分を全部Qdmailに変えたかったのですが、諦めます。

# kt 2008年11月02日(日) 深夜1時48分

追記テストですが、

toSeparateにし、さくらのSMTPを使い、100通送信してみました。
(http://www.cpa-lab.com/tech/0130 にある実験と同じ事をしました。)

1通目と100通目の差違は16秒でした。
spokさんが実験された時間より1/10程遅いのですが、私のやり方が悪いんですかね‥。
件名も本文も「test mail」だけ書いて送信しただけなんですけどね。

# spok 2008年11月03日(月) 午後1時47分


ktさん

送信前処理が重いのですから、そのままでは当然高速一括メール配信には向きません。
Qdmailは(多少の例外はあれど)、1通1通のメールボディを丁寧に作成していきます。

ちなみに、QdmailはtoSeparateモードであっても、個別にログを書き出し、DB連動で、置き換えをすることはできます。
http://hal456.net/qdmail/simple_replace

それが実行速度的にktさんが満足するレベルかどうかはわかりませんが。

文字化けや、添付ファイル、など複雑な機能に対応すればするほど実行スピードが落ちるのは当たり前なので(または私の技術の限界)、スピードを第一に求められるのであれば、ご自分でメール本文を作成するのがよろしいかと思います。そのために、Qdmailは、作成した本文を渡す機能をつけてあります。

http://hal456.net/qdmail/return

でメール本文(ヘッダーも含む)で取得し、送信先毎に必要な部分だけを変更し、それをQdSmtpに渡せば、それなりに高速で作動すると思います。
Qdmailで基本のメールボディを作成し、それを変数に代入し、個別に変更する部分は、個別の差し替えプログラムを自作すれば、割と簡単にできるかと思います。(ただし、iso-2022-jpで送信することが前提でしょうけれども。)
その上で、ローカルのsendmailに渡すか、QdsmtpなどでSMTP送信するのがよろしいかと思います。

これでQdmailが作成したメール本文を、ご自分のスクリプトで、個別配送先ごとに置き換えを行い、それをQdSmtpに渡せば、現状より高速で送信することができるでしょう。
http://hal456.net/qdsmtp/send

もしくは、その本文を、ご自分で、sendmail関数(またはそのラッパー)に渡すということでもいいかと思います。(PHP では1行のスクリプトでできる話です。)場合によっては、その方が早いこともあるでしょう。

前述のようにQdmailには、置き換え機能がありますが、文字化け対応、Base64対応、その他エラーチェックのために、原則として、毎回毎回メール本文のエンコードを行っています。(attachBuildOnce、bodyBuildOnceという高速化のためのメソッド&パラメータも埋め込んであるのですが、技術力のないユーザーがストレスなく使えるレベルになっていませんので、マニュアルには記載していない状況です。)

Qdmailの置き換え速度が遅い理由は、文字化け対応と、Base64対応、その他のエラーチェックのためです。

なお、レンタルサーバー上のテストでは、そのサーバーの性能と、他のユーザーの負荷の違いがありますから、厳密な再現性はないでしょう。
そもそも私はテストスクリプトやその他のサーバーの設定状況もも公開していないのに、「同じ事」をどのように確認されたのでしょうか。

# kt 2008年11月03日(月) 午後4時27分

ご丁寧に解説ありがとうございます。

実際の仕様はQdmailの制限をかなり絞ったり、一部改変していたりします。置き換え文字はQdmailではなく、str_replaceで置き換えていますね。

おっしゃるとおり、ヘッダーの作成が丁寧ですし、細かい部分まで行き届いていますので、自作するより使い勝手が良く、利用させていただいておりました。

>そもそも私はテストスクリプトやその他のサーバーの設定状況もも公開していないのに、「同>じ事」をどのように確認されたのでしょうか。

っと、おっしゃられると証明する事は不可能です。あくまで「同じような状況」を「再現しようとした」だけであり、全く同じテストをしたわけではありませんから。突っ込まれると
非常に辛いです。


私はこれまで「こういう使い方も出来るかな?」と言ったユーザ視点で実験し、書かせていただき、Qdmailという素晴らしいプログラムが少しでも広まればと思い利用させていただきました。

その上で度々実験して書かせていただいたので、別にプログラム批判がしたいわけでは毛頭ありませんし、おしゃるような指摘も重々承知しています。それだけはご理解下さい。


これまで何度か質問・意見定義して申し訳ありませんでした。

# spok 2008年11月03日(月) 午後5時35分

誤解のないように申し上げますが、Qdmailへのご意見、ご批判、ご質問などは大歓迎です。

# spok 2008年11月03日(月) 午後5時48分

SMTPの接続は、通常は毎回毎回閉じているので、下記を参考にしていただければ、ある程度は早くなると思います。(continueメソッド)

http://hal456.net/qdsmtp/send

また、ローカルのsendmailコマンドに渡したほうが早い場合も十分にあり得ますので、お試し下さい。

また、お使いのサーバーが、ローカルのsendmailコマンドの制限と外部からのSMTP接続の宣言をわけている可能性もあるかと思います。
外部からの接続に対し、同時に立ち上がるプロセスを制限しているSMTPサーバーもあるかと思いますので、その確認もなさったほうがよろしいかと思います。
PostFixの場合の例)http://www.kobitosan.net/postfix/jhtml/rate.html#process
sendmailの場合の例)http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/ja/security-guide/s1-server-mail.html

ただし上記を詳しく読み込んだわけではありませんので、あくまでもご参考まで。

# spok 2008年11月03日(月) 午後5時57分


ktさん

>str_replaceで置き換えていますね。

というのはプログラムのどこで置き換えをされていますか?

A)Qdmailに渡す前の自前スクリプト内
B)Qdmailの内部のメソッドを書き換えた(どのメソッドを書き換えましたでしょうか?)
C)Qdmailから完成したメール本文(ヘッダー含む)を取り出した後

# 初心者です。 2008年11月07日(金) 午後6時35分

はじめまして。TWと申します。
今回、PHPでメール送信する場合、SMTP経由で送信するという試みに、
qdmailを使用させていただきました。また、非常に使いやすく、とても感激しております。
私は、qdmailのみならず、PHP自体が初心者で、悪戦苦闘しておりますので、
ご教授いただけると幸いです。

早速ですが、
メール送信自体は問題なくされているのですが、
時々、以下のようなエラーログが出力されます。
2008-11-07 09:51:54
Qdmail error: Qdmail Version 1.2.6b ,PHP Version 4.4.7
Qdmail error: OS WINNT ; PHP Version 4.4.7 ; Qdmail version 1.2.6b
php.ini status: mb_language = Japanese ; mb_internal_encoding = SJIS ; mb_detect_order = ASCII,JIS,UTF-8,EUC-JP,SJIS
Qdmail Status debug: 0, log: 1, errorlog: 1
Qdmail error: No send . Because SMTP mail method replied error line -> 2190
2008-11-07 09:51:54
Qdmail error: Send Error line -> 2115
2008-11-07 09:51:54
Qdmail error: Error happen, see upper line -> 2194
2008-11-07 09:51:54
Qdmail error: Send Error line -> 2115
2008-11-07 09:51:54
Qdmail error: Error happen, see upper line -> 2194
2008-11-07 09:51:54
Qdmail error: Send Error line -> 2115

これはどのようなときに発生するエラーなのでしょうか。

# spok 2008年11月08日(土) 午前10時40分


TWさん

お使いいただきありがとうございます。

上記のエラーは、「Qdsmtpがエラーを出してるよ!」とQdmailが指摘しているものです。
つまり、Qdsmtpのログ及びエラーログをみる必要があります。

http://hal456.net/qdsmtp/log

を参考にQdSmtpのログとエラーログをみてみてください。

ログの取り方がわからない場合には、
■Qdmailバージョン
■QdSmtpバージョン
■PHPのバージョン
■OS名称 & バージョン
■お使いのソースコード(公開されて支障がある部分は適当に変更してください。)
■ソースコードの文字コード、改行コード

をお知らせ下さい。

# ありがとうございます。 2008年11月08日(土) 午後4時24分

早速のご回答、ありがとうございました。
PHP自体が初心者なので、初歩的なご質問で失礼致しました。
現在、Qdmailの方はログの設定をしています。(下記、ソースです。)
これに加えて、QdSmtpのログ出力を有効にする場合は、どのようにしたらよいのでしょうか。

■お使いのソースコード(公開されて支障がある部分は適当に変更してください。)
require_once('../conf/qdmail.php');
include "../conf/qdsmtp.php";
$pop_user = 'XXXXXXXXXXXXXXX';
$pop_pass = 'YYYYYYYYYYYYYYY';

$param = array(
'host'=> 'ZZZZZZZZZZZZZZZZZZZ',
'port'=> 25,
'from'=> $mailaddress,
'protocol'=>'POP_BEFORE',
'pop_host' =>'ZZZZZZZZZZZZZZZZZZZZZ',
'pop_user' => $pop_user,
'pop_pass'=> $pop_pass
);

$mail = & new Qdmail();
$mail -> smtp(true);
$mail -> smtpServer($param);
$mail -> logLevel(1);
$mail -> errorlogLevel(1);

$mes =mb_convert_kana($mes,"KVa");

if($user_email_1) //ユーザー1にメール送信
{
$mail -> to($user_email_1);
$mail -> subject($subject);
$mail -> from($mailaddress);
$mail -> text($mes);
$return_flag = $mail -> send();
}
if($user_email_2) //ユーザー2にメール送信
{
$mail -> to($user_email_2);
$mail -> subject($subject);
$mail -> from($mailaddress);
$mail -> text($mes);
$return_flag = $mail -> send();
}
if($user_email_3) //ユーザー3にメール送信
{
$mail -> to($user_email_3);
$mail -> subject($subject);
$mail -> from($mailaddress);
$mail -> text($mes);
$return_flag = $mail -> send();
}
if($user_email_4) //ユーザー4にメール送信
{
$mail -> to($user_email_4);
$mail -> subject($subject);
$mail -> from($mailaddress);
$mail -> text($mes);
$return_flag = $mail -> send();
}
if($user_email_5) //ユーザー5にメール送信
{
$mail -> to($user_email_5);
$mail -> subject($subject);
$mail -> from($mailaddress);
$mail -> text($mes);
$return_flag = $mail -> send();
}

■Qdmailバージョン
 1.2.6b

■QdSmtpバージョン
 0.2.0a

■PHPのバージョン
 4.4.7

■OS名称 & バージョン
 Windows2003Server

■ソースコードの文字コード、改行コード
 申し訳ありません、何をお答えしたらよいのか、わかりません・・・。

以上、宜しくお願い致します。

# spok 2008年11月08日(土) 午後4時52分


$mail -> errorlogLevel(1);

の後に、

$mail -> smtpLoglevelLink( true );

をいれてください。
これで、Qdmailのログ設定をQdsmtpが共有するようになります。
(マニュアルに記載していなかったのですいません。)

出力されるログファイルにはメールアドレスやメッセージ本文が入っていますので、外部からアクセスされないようにお気を付け下さい。

# spok 2008年11月08日(土) 午後4時57分

エラーログよりも、通常のログをみたほうが、smtpのどこでエラーがでているかわかりやすいと思います。

# ありがとうございます。 2008年11月08日(土) 午後4時59分

早速のご回答ありがとうございました。
今、試せる環境におりませんので、
試せる環境で実行しまして、また、改めてご連絡致します。
ありがとうございました。

# ご報告と質問 2008年11月10日(月) 午後1時19分

spokさんからご教授いただきました、
$mail -> smtpLoglevelLink( true );
を加えましたら、ログが出力されるようになりました。ありがとうございました。

ただ、もう1点質問をさせて下さい。
$mail -> smtpLoglevelLink( true );
を追記しましたら、ログは出力されるようになりましたが、
エラーだったときにエラーメッセージが画面に表示されてしまうので、
$mail -> errorDisplay( false );
も記述しました。

そうしましたら、Qdmailのエラーメッセージは非表示になったのですが、
Qdsmtpのエラーメッセージは画面に表示されたままになっています。

ここを非表示する場合は、どのようにしたらよろしいでしょうか。
度々申し訳ありませんが、以上、ご確認を宜しくお願い致します。


■$mail -> smtpLoglevelLink( true );
 のみ記述のエラーメッセージ
QdSmtp error: Failure :status550 message:550 5.1.1 <*****@*****.com>: Recipient address rejected: User unknown in local recipient table on RCPT TO:<*****@*****.com>
line -> 551
QdSmtp error: Error RCPT setting line -> 497
QdSmtp error: Error :status503 message:503 No recipient(s). on DATA
line -> 554
QdSmtp error: Error Data sending line -> 510
Qdmail error: Qdmail Version 1.2.6b ,PHP Version 4.4.7
Qdmail error: OS WINNT ; PHP Version 4.4.7 ; Qdmail version 1.2.6b
php.ini status: mb_language = Japanese ; mb_internal_encoding = SJIS ; mb_detect_order = ASCII,JIS,UTF-8,EUC-JP,SJIS
Qdmail Status debug: 0, log: 1, errorlog: 1
Qdmail error: No send . Because SMTP mail method replied error line -> 2190
Qdmail error: Send Error line -> 2115
Qdmail error: Error happen, see upper line -> 2194
Qdmail error: Send Error line -> 2115

■$mail -> smtpLoglevelLink( true );
 $mail -> errorDisplay( false );
 を記述のエラーメッセージ
QdSmtp error: Failure :status550 message:550 5.1.1 <*****@*****.com>: Recipient address rejected: User unknown in local recipient table on RCPT TO:<*****@*****.com>
line -> 551
QdSmtp error: Error RCPT setting line -> 497
QdSmtp error: Error :status503 message:503 No recipient(s). on DATA
line -> 554
QdSmtp error: Error Data sending line -> 510

# spok 2008年11月10日(月) 午後9時18分

ああ、この方法だと確かにエラーは画面表示されてしまうかも知れないですね。。。
次回更新時にはなんとかしたいと思います。
もし、今のバージョンでしのぐのであれば、qdsmtp.phpの31行目付近の
var $error_display = true;

var $error_display = false;
に変更してください。

# spok 2008年11月10日(月) 午後9時22分


このエラーは、「メールボックスが利用できないため、要求された処理は実行不能。 」ということです。

POP_BEFOREの時間切れか、そもそもPOP_BRFOREをサポートしていないか。でしょうか。

そのSMTPサーバーがSMTP AUTHを使えるのであれば、SMTP AUTHを利用したほうがいいかと思います。

# ありがとうございました。 2008年11月11日(火) 午前9時14分

spokさんの仰るとおりに設定し、エラーメッセージ非表示にすることが出来ました。
ありがとうございました。

ご丁寧にご教授いただき、ありがとうございました。


#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/028/tb/