We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 28314
    • 48 Posts
    huh ぺーぺーことSsmK  huh です。
    MODxのサンプルを利用しながらサイト構築に思考錯誤しています。

    そのサンプルにあった、[ContactUs]...ContactFormでメールを送信しようとしても以下のエラーが吐き出されます。
    PHP error debug
    Error: mail() [function.mail]: SMTP server response: 451 MELON ssmtpd: Invalid mail address
    Error type/ Nr.: Warning - 2
    File: C:\Program Files\xampp\htdocs\modx\manager\includes\document.parser.class.inc.php(705) : eval()’d code
    Line: 108
    なぜこの様なエラーがおこるかまったくわかりません。ソースも見たのですが如何せんphpがまだわからなくて...

    先日無事にWebSignUpの日本語対応が終わり、サインアップ後は、登録ユーザにはサインアップメールが送信されるようになりました。(php.ini などの環境を修正)
    しかし、なぜ同様のmail()関数を使ってる(んじゃないか)ものでエラーが起こるか?
    私の技術力では限界でした。
    PHPもMODxもすべて右も左もわかりません。最悪、メールアドレス貼り付ければContactUs応急処置になるとも思ってるのですが非常に気持ち悪いです。

    環境はWinXP,xampp,Melon(仮設メーラー),MODx0.9.2
    もしかするとこれは直接MODxにかかわらないPHPやメーラの問題かもしれません。
    どなたか、お手柔らかにヒントでも教えていただけませんか?
      初心者代表 (やらいでか!http://ssmk.blogspot.com/)
      • 6158
      • 224 Posts
      おはようございます。


      File: C:\Program Files\xampp\htdocs\modx\manager\includes\document.parser.class.inc.php(705) : eval()’d code
      Line: 108
      このメッセージは document.parser.class.inc.php の 705 行目にある
      eval() から出ており、そこで読み込まれたスニペット ContactForm の 108 行
      目に書かれている mail() から出ていると解釈すればよいと思います。

      で、

      Error: mail() [function.mail]: SMTP server response: 451 MELON ssmtpd: Invalid mail address
      と言っているのですから、mail() に渡している引数でおかしなことになってい
      ると思われます。php でメールを送る仕組みを理解するために、少し調べた方
      がいいでしょう。

      まずは mb_send_mail() のマニュアルに目を通すことをお勧めします。メール
      を送るだけの小さなスクリプトを作り、確実に送る方法を身につけると後の苦
      労が小さくなります。その後で、"SMTP server response 451" をキーワードに
      して検索し、解決を図ると理解も深まり、あっさり片付くでしょう。

      どうやると「Invalid mail address」というメッセージが返ってくるか分かる
      のではないでしょうか。

      古い情報ですが、
      - [PHP-users 21440]メール送信エラー


      私はこんな風に書いて使っています。
      mb_language ("ja");
      mb_internal_encoding ("UTF-8");
      if (!mb_send_mail ($email, $emailsubject, $message, "From: ".$emailsender."\r\n"."X-Mailer.....
      

      php.ini を調整して、mail() を mb_send_mail() に変更しなくても済むように
      しても構いません。


      じゃ。
        • 28314
        • 48 Posts
        ありがとうございます。line108 の意味が非常にヒントになりました。

        ContactForm の mail()関数を echo で表示したところ、
        $to [email protected]
        $subject=[Web Inquiry] http://localhost/modx/
        $body =Name: UserName Email: [email protected] Message: テスト
        $headers =From: UserName

        と出力

        以前に小さなスクリプトでのテスト送信は問題ありませんでしたが、
        今回もecho で表示された内容をまるっきり同じく

        $to	 = '[email protected]';
        $subject = '[Web Inquiry] http://localhost/modx/';
        $message = 'Name: UserName Email: [email protected] Message: テスト';
        $headers = 'From: UserName';
        mail($to, $subject, $message, $headers);


        で送信したところ問題なく送信は可能でした。
        なんでContactFormではエラーするのか調べてみたところ

        $headers をmail()する直前で
        $headers = 'From: UserName';
        if (mail($to, $subject, $body, $headers)) {

        すると、問題なく送信されました。

        この $headers は
        $headers = "From: $from <$from_email>\r\n";

        で生成されており、理想の出力としては下記のようになるハズですが
        "From: UserName<[email protected]>\r\n"

        実際は
        "From: UserName"

        のように < 以降ブチ切れているようです。エンコードの問題なのか、バグなのか良くわかりません。
        embarrassedよかったらご教授お願いします。

        とりあえず、エラーの場所がわかり、
        $headers = "From: $from_email\r\n";
        で暫定的な対処ができたのでかなり助かりました。

        :D:D custerさん、いつもありがとうございます! laugh:D
          初心者代表 (やらいでか!http://ssmk.blogspot.com/)
          • 6158
          • 224 Posts
          こんにちは。

          私も通った道です、頑張ってください。

          Quote from: ssmk at Nov 28, 2006, 10:31 PM

          $headers は
          $headers = "From: $from <$from_email>\r\n";

          で生成されており、理想の出力としては下記のようになるハズですが
          "From: UserName<[email protected]>\r\n"

          実際は
          "From: UserName"

          のように < 以降ブチ切れているようです。エンコードの問題なのか、バグなのか良くわかりません。
          んん? mail() が From ヘッダーの内容を壊しているのではないですよね。
          何処で壊されているのか分かりますか?


          PHP マニュアル mail
          - 例 2. 追加ヘッダを付加してメールを送信する
          - 例 4. HTML メールを送信する
          を見てください。例4の From 部分は同じことをやろうとしています。



          今回の件と関わりあるかどうか分かりませんが、私が以前引っ掛かったのは、
          Quote from: ssmk at Nov 28, 2006, 10:31 PM

          (前) $headers = "From: $from <$from_email>\r\n";
          (後) $headers = "From: $from <$from_email>" . "\r\n";
          の部分。何故だか忘れましたが、CRLF を分けて書かないときちんと動かなかっ
          たような記憶があります。例 2,4 でも同じように記述されています。
            • 6158
            • 224 Posts
            もう一点。

            先の「PHP マニュアル mail」には以下のように書かれています。

            注意: mail() の Windows 版実装は、Unix 版実装とは 多くの点で違います。第一に、メッセージの生成にローカルのバイナリは使用せず、 ソケットを通じて直接操作するだけです。 これは MTA がネットワークソケットをlisten している 必要があるということを意味します(ローカルホスト、リモートマシンどちらでもかまいません)。

            第二に、 From: や Cc: Bcc: Date: のようなカスタムヘッダはMTA ではなく PHP によってパースされます。

            そのため、to 引数には "Something <[email protected]>" 形式の メールアドレスを与えることはできません。
            MTA と通信する際に mail コマンドはこれを適切にパースできません。
            ...ということは、From はどうなのか?
              • 33488
              • 429 Posts
              そうえいば、ずっとmail関数を使わないパターンで、WindowsのXAMPP使って気が付きませんでしたが・・・。
              なぜか、mail関数でやるとSMTPのエラーが返ってきてしまいますねぇ
              ぐぐっていろいろとやってみても、502のエラーが・・・
              もしかすると、PHPかXAMPPの問題?? と思ったら、PHP.INIの設定でした。
              XAMPPのWindows版のphp.iniがapache/binにあるとは・・・ずっと PHP/binを修正してました  :’(

              ついでに、メールサーバはXAMPPについてるも知らなかった というオチ。
              XAMPPのコントロールパネルでMercuryを起動して無事動きました。
              FROMもちゃんと出てました。

                • 6158
                • 224 Posts
                こんばんは。

                Quote from: ZeRo at Nov 29, 2006, 04:05 AM

                XAMPPのWindows版のphp.iniがapache/binにあるとは・・・ずっと PHP/binを修正してました  :’(
                そうですね、apache/bin/php.ini と php/bin/php.ini の2つありますね。php
                が apache のモジュールとして動く場合は apache/bin で、コマンドラインで
                は php/bin を使っていたと思います。zend studio や phpedit を使っている
                時も、php.ini を正しく指定しないと動きません。
                  • 28314
                  • 48 Posts
                  おはようございます。

                  $headers = "From: $from <$from_email>\r\n";
                  今わかるのは問題はmail()ではなく、この時点でぶち切れてしまっているということです。かわりに、
                  $headers = "From: hoge <[email protected]>\r\n";
                  とすれば、問題なく送信できます。

                  $headers = "From: $from ".’<’."$from_email".’>’."\r\n";

                  や、追加として
                  $headers .= "Content-type: text/plain; charset=utf-8"."\r\n";

                  などともやってみるとNGです。’と"と`の違いを知らないのでまなばにゃなりませぬ。

                  とりあえず送信が出来たので、もう少し時間をかけながら問題解決をしてみようと思います。

                  あと、試しにこんナン書いてみましたら

                  echo "1D.$from_email <$from_email> ".’2S.$from_email <$from_email>’;

                  以下の結果で出力 shocked

                  [email protected] 2S.$from_email <$from_email>

                  ほら、ここで<>が消えちゃうんです。
                  mail()関数というよりこちらの問題があるんじゃないかと踏んでおります。
                    初心者代表 (やらいでか!http://ssmk.blogspot.com/)
                    • 33488
                    • 429 Posts
                    0.9.5RC2/3付属のContatFormで、修正なしに英字のみであればちゃんと動きましたよ  huh
                    上記に言われている\r\nの部分もそのままで・・・。
                    ちなみに、環境はXAMPP For Win で PHP4.4.4で動かしています。
                    環境の違いもあるかも知れませんが・・・・。

                    あと、呼び出しはドキュメントに以下を書いただけです。
                    [!ContactForm? &sendTo=`xxx@localhost.com`!]
                    


                    メールサーバは、XAMPP付属のものを起動して、アカウントxxxを作っただけです。

                    日本語にするには、

                        mb_language("japanese");
                        mb_internal_encoding("UTF-8");
                        $subject = $the_subject;
                        $headers = mb_encode_mimeheader("From: $from <$from_email>\r\n","ISO-2022-JP", 'B', "\r\n");
                            
                         // clean out potential tomfoolery...
                         $message = $modx->stripTags($message);
                            
                         $body = "Name: $from\nEmail: $from_email\nMessage:\n\n" . $message;
                          if (mb_send_mail($to, $subject, $body, $headers)) {
                    

                    該当部分を上記のように変更してOKでした。

                    ということで、呼び出し部分か、PHPの環境か、それとも・・・
                      • 28314
                      • 48 Posts
                      自分の環境でもうまく出来ました。
                      mail関数とかが問題じゃなくて " ’ < とかの記号の扱い方の問題ナンですかね。
                      自分のところも \r\n は続けざまに書いて大丈夫だった気がします。ただ " や ’ の違いが明確じゃないのでSAMPLEどおりにしてます。

                          mb_language("japanese");
                          mb_internal_encoding("UTF-8");
                          $subject = $the_subject;
                          $headers = mb_encode_mimeheader("From: $from <$from_email>\r\n","ISO-2022-JP", 'B', "\r\n");
                              
                           // clean out potential tomfoolery...
                           $message = $modx->stripTags($message);
                              
                           $body = "Name: $from\nEmail: $from_email\nMessage:\n\n" . $message;
                            if (mb_send_mail($to, $subject, $body, $headers)) {
                      

                      該当部分を上記のように変更してOKでした。

                      助かります!! また検証させていただきます :’( ありがとうございます
                        初心者代表 (やらいでか!http://ssmk.blogspot.com/)