<< imgタグがあったら画面の中心に表示する 質問一覧 多重配列の要素を取りだす方法 >>

  • 0P
PEAR::Mailでメールが送れません

フォームからメッセージと件名を下記phpに送信

DBから条件にあった会員のメールアドレスを取得

PERE::Mailでメール送信

という作業をしたいのですが、メールが送れません。エラーも返ってきません。
ちなみに、SMTPサバが違うのかと思い
$mail =& Mail::factory("smtp", $param);

$mail =& Mail::factory("sendmail");
でやってみましたが
エラーメッセージ:sendmail returned error code 127
と返ってきました。

各変数は連想配列も含めて、それぞれ格納されているのは確認できています。
どなたかご指摘頂けないでしょうか?


  1. require_once('databace.php');
  2. require_once("Mail.php");
  3. require_once("mimeDecode.php");
  4.  
  5. //条件にあったメールアドレスを配列に格納
  6. $sql="SELECT * FROM table1  where code='$val' ";
  7. $result = mysql_query($sql,$connect);
  8. $address=array();
  9. while($row = mysql_fetch_array($result)){
  10. $address[]=$row['mailaddr'];
  11. }
  12.  
  13. //メッセージと件名を取得
  14. $subject =$_POST['subject'];
  15. $message =$_POST['message'];
  16.  
  17. //SMTPサーバー情報
  18. $param['host'] = "host";
  19. $param['port'] =25;
  20. $param['auth'] = TRUE;
  21. $param['username'] = "user";
  22. $param['password'] = "pass";
  23.  
  24. //ヘッダー情報
  25. $header['From'] = "a@a.a";
  26. $header['Subject'] = mb_encode_mimeheader($subject, 'ISO-2022-JP');
  27. $header['Reply-To'] = "mail@a.a";
  28.  
  29. //本文エンコード
  30. $message = mb_convert_encoding($message, 'ISO-2022-JP', mb_detect_encoding($message));
  31.  
  32. //メール送信
  33. $mail =& Mail::factory("smtp", $param);
  34. $ret = $mail->send($address, $header, $message);
  35. if(PEAR::isError($ret)) {
  36.   die("エラーメッセージ:".$ret->getMessage());
  37. }else{
  38.     $login_url = "アドレス";
  39.     header( "Location: ".$login_url );
  40.     exit;
  41. }

UNIX 専用サーバー
Mac OS

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。

QPEAR::Mailでメールが送れません crie2001  [03月04日 10時36分] 
┗Re:PEAR::Mailでメールが送れません shimix  [03月04日 11時29分] 
  ┗Re:Re:PEAR::Mailでメールが送れません crie2001  [03月04日 18時06分] 
    ┗Re:Re:Re:PEAR::Mailでメールが送れません shimix  [03月04日 19時00分] 
      ┗Re:Re:Re:Re:PEAR::Mailでメールが送れません crie2001  [03月05日 10時02分] 
        ┗満開Re:Re:Re:Re:Re:PEAR::Mailでメールが送れません shimix  [03月05日 10時32分] 
          ┗Re:Re:Re:Re:Re:Re:PEAR::Mailでメールが送れません crie2001  [03月05日 20時09分] 

コメント一覧

並び替え( ツリー順 / 投稿順[降順] / 投稿順[昇順]

Re:PEAR::Mailでメールが送れません

#日本語処理関係が気にはなりますが、ひとまず置いといて・・

>エラーも返ってきません。

display_errorsは適切に(デバッグ用に)設定されていますでしょうか?error_reportingの値も含めて確認してください。

>UNIX 専用サーバー
>Mac OS 

phpinfoでSMTPやsendmail_pathがセットされているか確認してください。mailmb_send_mailでは送信出来ますか?

というかphpスクリプトを置いているサーバとsmtpサーバは同一ですよね。もし違うサーバであれば、その関係はどうなっていますか(ポート25が繋げる環境かどうかは確認されてますか)。


(追記)
"sendmail"を試そうということですから、同一サーバですよね?そうであれば
  1. $mail = Mail::factory("mail");
を試してみてください。mailmb_send_mailで送信出来るならMail::factory("mail")は問題ないハズですがどうでしょうか。

で、同一サーバならSMTPはlocalhostで書かれていますか?(念のため確認)
  1. $param['host'] = "localhost";



(蛇足)
レンタルサーバなどで(メールサーバのIPが送信先で弾かれるので)自分のISPのSMTPなどを経由して送るなどはありますが、それ以外で(localhostで)PEAR::Mailを使う(mb_send_mailを使わない)理由は何でしょうか(添付ファイルなどの関係であれば、Mail::factory("mail")でいいと思うので)。

Re:Re:PEAR::Mailでメールが送れません

早速の返答有り難うございます

phpinfoでSMTPやsendmail_pathがセットされているか確認してください。mailmb_send_mailでは送信出来ますか?

はい、セットされています。mail関数mb_send_mail関数共に送信可能です。

>"sendmail"を試そうということですから、同一サーバですよね?そうであれば

すいません、初歩的ミスです。外部サーバーSMTPを利用しようとしています。のでsendmailは通りませんよね。mail関数mb_send_mail関数共に送信可能です。※外部サーバーを利用する理由▶現在、契約した専用サーバー(GMO)が契約後に1アカウントしかメールを作れないという契約で、そのアドレスはすでに別の利用目的で使っているので、契約内容を変更中。それまでの間、外部サーバー(現在レンタル中の別のレンタルサーバー)でテスト稼動。

>同一サーバならSMTPはlocalhostで書かれていますか?

SMTPで送信することを考えていましたの、外部サーバーのhostを設定しております。


>レンタルサーバなどで(メールサーバのIPが送信先で弾かれるので)自分のISPのSMTPなどを経由して送るなどはありますが、それ以外で(localhostで)PEAR::Mailを使う(mb_send_mailを使わない)理由は何でしょうか(添付ファイルなどの関係であれば、Mail::factory("mail")でいいと思うので)。

複数のメールを同時に配信したいと思っています。(スパムや怪しい業者ではありませんw)
mailmb_send_mailをループさせる方法も考えましたが、開閉を繰り返すmb_send_mailなどは重たくなるのでPEAR::Mailの利用を考えました。
1000や2000人になる事は無いと思いますが、数百人規模の配信になると思いますので、mailmb_send_mailを使わない方法で考えています。

いろいろ調べた結果、PEAR::Mailやなんやらを使うのがいい、という記事を見ましたので、PEAR::Mailを使用しましたが、1000以下のメールを一斉に送る場合の方法はなにかありますか?

cornなどでDBに保存したメールの内容を、分割して送る方法っていうのがいくつかあったのですが、いまいち方法がわからなかったのと、2000も3000も送るわけではないので、この方法を選択しました。

Re:Re:Re:PEAR::Mailでメールが送れません

あぁ、外部サーバですか・・。数百という数はどうなんでしょうねぇ。

某レンタルサーバで(spamデータベースに載ることが多いので)自分のISPのSMTPを経由して送信テストしたときのスクリプトが下記です。デバッグ用の記述が多いですが(汗

  1. <?php
  2. print 'start<br>';
  3. print '<hr>';
  4. require_once('Mail.php');
  5. mb_language("japanese");
  6. mb_internal_encoding("UTF-8");
  7. $params = array(
  8.     'host'     => 'secure.plala.or.jp',
  9.     'port'     => 25,
  10.     'auth'     => true,
  11.     'username' => 'xxxxx@example.com',
  12.     'password' => 'xxxxxxxxxx',
  13.     'debug'    => true,
  14.     'protocol'=>'SMTP_AUTH'
  15.     );
  16. var_dump($params);
  17. print '<hr>';
  18.   
  19. $headers = array(
  20.   'From'    => 'xxxxx@example.com',
  21.   'To'      => 'xxxxx@example.net',
  22.   'Subject' => mb_encode_mimeheader(mb_convert_encoding("メールのタイトル","JIS","UTF-8"))
  23.  );
  24. var_dump($headers);
  25. print '<hr>';
  26.  
  27. $recipients = 'xxxxx@example.net';
  28.   
  29. $body = mb_convert_encoding("メールの内容1\r\nメールの内容2","JIS","UTF-8");
  30.   
  31. $smtp = Mail::factory('smtp'$params);
  32. $e = $smtp->send($recipients$headers$body);
  33.   
  34. if ( PEAR::isError($e) ) echo $e->getMessage() . "\n";
  35. print 'done';
  36. ?>

$paramsに'protocol'=>'SMTP_AUTH'を追加してみてください。で、'debug' => trueを入れておくとSMTPの会話内容がわかるので、状況が把握しやすいと思います。

Re:Re:Re:Re:PEAR::Mailでメールが送れません

有り難うございます。大変参考になりました。

送信ができました。

送信メールを見ると、
[To](送信先)の欄が、おそらくarraryでいくつも送っているのが原因だと思いますが

undisclosed-recipients:;

と出ます。そこで$headerに[To]の項目に送信可能なダミーアドレスを入れて、header[Bcc]にアドレスの配列を入れて送信してみましたが、同じ状態で送信されてきます。

To(送信先)を表示させない、またはダミーアドレス(送受信可能なアドレス)を一つ入れておく方法など、良い方法は無いでしょうか?

Re:Re:Re:Re:Re:PEAR::Mailでメールが送れません

$header['to']だけ(適当なメールアドレスを)セットして$header['bcc']には何もセットしない状態でもダメでしょうか?SMTPサーバの動作として、メールヘッダにToがなければundisclosed-recipients:;をセットする可能性はありますが、Toがあれば何もしないと思うのですが・・。

#私の環境(のSMTPサーバ)では、そういう動作をします。

つまりメールヘッダにToがなければundisclosed-recipients:;をセットするのはSMTPサーバ側の問題だと思います。Toは必須なので(配送に無関係でも)代わりのものをセットしているのだと推測されます。PEAR::Mailのsmtp.phpを読んでも、$recipientはsmtp->rcptToでSMTPサーバに投げているだけですし、メールヘッダはメールボディ(本文)とともに(改行で繋いで)smtp->dataでデータとして投げているだけです。ひょっとしたらRFC822.phpで何か補正しているかもしれないと思いましたが、そういうこともないようです。

#というかDEBUGをTRUEにしているのですから、やりとりは全部見えていますよね(汗



なお、メールクライアントがメールサーバに引き渡す時点で(エンベロープのrcpttoでなく)メールヘッダとしてBccを渡すことはあり得ません。万一メールサーバが削除してくれなかったら困ったことになりますので。メールサーバはメールヘッダにReceivedを追加はしても既存のものは触らないのが基本です。Toにundisclosed-recipients:;をセットするなど、ある程度の補正をするメールサーバが多いのも事実ですが、そのままで大丈夫なデータをSMTPに引き渡すべきですね。

Re:Re:Re:Re:Re:Re:PEAR::Mailでメールが送れません

ありがとうございます!

無事、実装できました。
ほんとうに助かりました。

さて、ここからこの送信作業を、ajaxで非同期にしたいと思います(泣)

送信phpはこれで完了ですので、次はフォーム側での非同期処理ですね。

shimix様はそちらも、詳しいのでしょうか?

もしお詳しいのであれば、あれ程度ajaxの作業を進めていきますので、ここで、またご教授頂けないでしょうか?
・・・というよりも、phpの質問から外れてしまいますので、ここでは御法度なのでしょうか?(_ _);
imgタグがあったら画面の中心に表示する 質問一覧 多重配列の要素を取りだす方法