Topic: ContactFormについて  (Read 7352 times)

Pages: [1]   Go Down

#1: 28-Nov-2006, 01:10 AM


SSMx
Posts: 48

WWW
 Huh ぺーぺーことSsmK  Huh です。
MODxのサンプルを利用しながらサイト構築に思考錯誤しています。

そのサンプルにあった、[ContactUs]...ContactFormでメールを送信しようとしても以下のエラーが吐き出されます。
Quote
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/)

#2: 28-Nov-2006, 07:05 PM

custar
Posts: 224

おはようございます。

Quote
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() から出ていると解釈すればよいと思います。

で、
Quote
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]メール送信エラー


私はこんな風に書いて使っています。
Code:
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() に変更しなくても済むように
しても構いません。


じゃ。

#3: 28-Nov-2006, 10:31 PM


SSMx
Posts: 48

WWW
ありがとうございます。line108 の意味が非常にヒントになりました。

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

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

Code:
$to = 'to@domain.com';
$subject = '[Web Inquiry] http://localhost/modx/';
$message = 'Name: UserName Email: user@domain.com Message: テスト';
$headers = 'From: UserName';
mail($to, $subject, $message, $headers);

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

$headers をmail()する直前で
Code:
$headers = 'From: UserName';
if (mail($to, $subject, $body, $headers)) {
すると、問題なく送信されました。

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

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

実際は
 "From: UserName"

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

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

Cheesy:D custerさん、いつもありがとうございます! Cheesy:D
« Last Edit: 29-Nov-2006, 12:05 AM by ssmk »
初心者代表 (やらいでか!http://ssmk.blogspot.com/)

#4: 29-Nov-2006, 12:20 AM

custar
Posts: 224

こんにちは。

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

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

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

実際は
 "From: UserName"

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


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



今回の件と関わりあるかどうか分かりませんが、私が以前引っ掛かったのは、
(前) $headers = "From: $from <$from_email>\r\n";
(後) $headers = "From: $from <$from_email>" . "\r\n";
の部分。何故だか忘れましたが、CRLF を分けて書かないときちんと動かなかっ
たような記憶があります。例 2,4 でも同じように記述されています。

#5: 29-Nov-2006, 12:30 AM

custar
Posts: 224

もう一点。

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

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

そのため、to 引数には "Something <someone@example.com>" 形式の メールアドレスを与えることはできません。
MTA と通信する際に mail コマンドはこれを適切にパースできません。
...ということは、From はどうなのか?

#6: 29-Nov-2006, 04:05 AM


ZeRo
Posts: 428

WWW
そうえいば、ずっとmail関数を使わないパターンで、WindowsのXAMPP使って気が付きませんでしたが・・・。
なぜか、mail関数でやるとSMTPのエラーが返ってきてしまいますねぇ
ぐぐっていろいろとやってみても、502のエラーが・・・
もしかすると、PHPかXAMPPの問題?? と思ったら、PHP.INIの設定でした。
XAMPPのWindows版のphp.iniがapache/binにあるとは・・・ずっと PHP/binを修正してました  Cry

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

#7: 29-Nov-2006, 05:46 AM

custar
Posts: 224

こんばんは。

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

#8: 29-Nov-2006, 09:40 PM


SSMx
Posts: 48

WWW
おはようございます。

$headers = "From: $from <$from_email>\r\n";
今わかるのは問題はmail()ではなく、この時点でぶち切れてしまっているということです。かわりに、
$headers = "From: hoge <hoge@huge.com>\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

1D.hoge@huge.com  2S.$from_email <$from_email>

ほら、ここで<>が消えちゃうんです。
mail()関数というよりこちらの問題があるんじゃないかと踏んでおります。
初心者代表 (やらいでか!http://ssmk.blogspot.com/)

#9: 29-Nov-2006, 11:24 PM


ZeRo
Posts: 428

WWW
0.9.5RC2/3付属のContatFormで、修正なしに英字のみであればちゃんと動きましたよ  Huh
上記に言われている\r\nの部分もそのままで・・・。
ちなみに、環境はXAMPP For Win で PHP4.4.4で動かしています。
環境の違いもあるかも知れませんが・・・・。

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

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

日本語にするには、

Code:
    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の環境か、それとも・・・

#10: 30-Nov-2006, 02:33 AM


SSMx
Posts: 48

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

Quote
Code:
    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でした。

助かります!! また検証させていただきます Cry ありがとうございます
« Last Edit: 30-Nov-2006, 02:38 AM by ssmk »
初心者代表 (やらいでか!http://ssmk.blogspot.com/)

#11: 30-Nov-2006, 04:14 AM

custar
Posts: 224

こんばんは。

自分の環境でもうまく出来ました。
原因追及は後にして、取り敢えず動くようになっておめでとう。


" ' < とかの記号の扱い方の問題ナンですかね。
どうかなぁ。

'<' の影響を考え、私も <someone@example.com> というのを含ませて出力さ
せてみましたが、問題なく表示されていたので、その可能性を消していました。

但し、ファイルと php の文字コードを何にしているかによって内部でどう扱わ
れているのか、ちょっと気になっています。ちなみに、私の環境では全て
UTF-8 で、バージョンは 5.1.2 です。

#12: 30-Nov-2006, 04:17 AM


ZeRo
Posts: 428

WWW
PHPのバージョンの違いはありそうな・・・
こっちもUTF-8です。

あ、あと 上にあげたソースの一部
$headers = mb_encode_mimeheader("From: $from <$from_email>","ISO-2022-JP", 'B', "\r\n");
にしないと、ヘッダ部分が本文に出てきてしまいました(^^;;

#13: 30-Nov-2006, 09:36 PM


SSMx
Posts: 48

WWW
おはようございます。今日も徐々に追加していきます。

[環境]
WinXP
PHP Version 5.1.6
UTF-8 のつもりだけどよくわかんないでっす
MySQLの方はphpMyAdminから見ると
lochal_host は 文字セット:  UTF-8 Unicode (utf8)
しかし、至るtableにて照合順序が latin1_general_ci になってます。
SQL(←よく知らないのですが)で保存すると
Code:
-- テーブルの構造 `modx_user_messages`--
CREATE TABLE `modx_user_messages` (
  `id` int(10) NOT NULL auto_increment,
  `type` varchar(15) collate latin1_general_ci NOT NULL default '',
  `subject` varchar(60) collate latin1_general_ci NOT NULL default '',
  `message` text collate latin1_general_ci NOT NULL,
  `sender` int(10) NOT NULL default '0',
  `recipient` int(10) NOT NULL default '0',
  `private` tinyint(4) NOT NULL default '0',
  `postdate` int(20) NOT NULL default '0',
  `messageread` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM [color=blue] DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci[/color] COMMENT='Contains messages for the Content Manager messaging system.' AUTO_INCREMENT=2 ;
となってるので、phpMyAdmin かMySQLの設定ファイルのどこぞを弄れば UTF8BIN に変換できると踏んでます。
しかし、知識と時間の不足故に後回しになってます。 ZeRoさんごめんなさい。MyCfでしたっけ?設定ファイル見てみます。

あと、php.ini において
Code:
[b][mbstring][/b]
output_handler = mb_output_handler
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;
mbstring.func_overload = 1
という設定になってます。
初心者代表 (やらいでか!http://ssmk.blogspot.com/)

#14: 30-Nov-2006, 11:42 PM


ZeRo
Posts: 428

WWW
my.cnfですね xampp/mysql/bin にあります。
http://phpspot.net/php/pgMySQL4.1%8CnUTF-8%82%CC%8F%EA%8D%87.html辺りが参考になるでしょう
XAMPPのMysqlは、修正してないとデフォルトの文字コードはlatin1になっているので、それで文字列系の参照文字コードがlatin1になっているかと思います。
明示的にmy.cnfのデフォルトを変えるか、PHPのDB接続後にset names utf8に変更するかが必要になるかと・・確か7bitさんのHPに後者のパッチは公開されていたかと思います。

ついでに、実験しているWindows XAMPPでのphp.iniのmb系の設定は全部コメントになってました(^^;


#15: 1-Dec-2006, 01:05 AM

custar
Posts: 224

こんにちは。

ContactForm の mail()関数を echo で表示
echo() の内容は何処に出力させているのですか? ブラウザ? ターミナル
(cygwin/bash)? ファイル?

もしブラウザで見ているのなら、<> のメールアドレスは見えないと思います。
ブラウザが <> をタグだと判断してしまって見えなくなると思います。


また別の可能性として、"<$from_email>" の '<','>' は半角文字ですか?
全角の '<','>' だと、'<' の後が出力時に消されてしまいました。
スクリプトファイルの文字コードが UTF-8 でも SJIS でも。

#16: 1-Dec-2006, 03:17 AM


SSMx
Posts: 48

WWW
 Shocked あー、そういうことですね!
出力はブラウザでした。 あー、そっか。さすが ::)Custerさん。

一応、php.iniはデフォルト値から変更し下記のように日本語対応にしたつもりです。(ただ、MySQl内のphp.iniがあるんでしたっけ? それは触れてないです)
また、My.cnfも一週間で覚えるPHP[http://tmani.seesaa.net/article/4725522.html]を参考にそっくりやりました。シンプルでわかりやすかったので

んん、しっかし、未だに全ての文字列系の参照文字コードがlatin1になっています。手動で変換しないといけんのかな
この設定を変えることにより全部が修正されると思ってたのですが。 Cry

今日はじめて使用したマネージャの中の
 [リソース⇒ ファイル管理]
からソースファイル見てみると、すべての日本語が文字化けしてるんですよね。 Undecided

どうファイル管理の画面から日本語を正しく編集し直して保存して再度中身をみても、やっぱり文字化け。 Angry
MySQL の modxテーブル のデータの中身(ユーザ登録情報とか)も全部文字化けし、更にバックアップした modx.sql も全ての日本語が文字化け。

一応、マネージャーから見る分にも、サイトの表示にも全く問題はないのが今のところなのですが、
検索とかで引っかかることや、将来的に大事になりそうだと感じています。
が、対応がわからずやるだけのことやってみたつもりで、ちと疲れまちた Tongue

なんか基礎的な面(PHPやMySQLやエンコード)になってしまいそうですみません。あらたにスレッドを立てたほうがいいのか
(ContactFormというより言語環境について)ちょっと迷ってます。

まだ、皆さんの掲示板の内容にしっかりとついていけなくてすみません。なんとか手探りながら頑張ります。
(土日は作業は全く進めないので月曜以降の報告になります m(_ _)m & 読み辛い文面でごめんなさい)
初心者代表 (やらいでか!http://ssmk.blogspot.com/)

#17: 4-Dec-2006, 03:07 AM


SSMx
Posts: 48

WWW
まだ、答え出てないのですが、ここに書き込まれた内容をまだ、消化不足なので少々お待ちください。
せっかく頂いた助言を流してしまいそうなので、一つひとつ確かめていけたらと思ってます。

また、結果が上がり次第、順次あげさせていただきます。
初心者代表 (やらいでか!http://ssmk.blogspot.com/)

#18: 11-Dec-2006, 01:51 AM


SSMx
Posts: 48

WWW
先回の文字化けの件はまだ進展せず、です。私の全般的なスキル不足もあると考え、全般の知識を高めながら解決していこうと思います。

さて本題のContactFormですが、SQL上の modx_web_user_attributes の項目を増やしています。
そこでいまつまずいているのが、
たとえば web_userにフリガナ(furigana)という項目を追加したいのですが、まず、

SQL上に
modx_web_user_attributes テーブルに
furigana フィールドを作成

assets/snipetts/weblogin/websignup.inc.php内の
fullname関連に追従する形で
furiganaを追加して言ったのですが
Code:
$modx->invokeEvent("OnWebSaveUser",
array(
"mode" => "new",
....
"userfullname" => $fullname
"???????" => $furigana
));
で詰まりました。
invokeEvent に関しても OnWebSaveUser に関しても調べても今一歩わかりません。
文字化けしているのですがMySQLには登録されているようなのですが
上記はどういった意味合いのところなのでしょうか?
"mode"=> "new","upd"からしてみるとDBへの書き込みだとは思うのですが。

また、マネージャー側で項目を追加させるようなことは危険なのでしょうか?(本体を弄ることになるので)
« Last Edit: 11-Dec-2006, 01:53 AM by ssmk »
初心者代表 (やらいでか!http://ssmk.blogspot.com/)

#19: 11-Dec-2006, 02:19 AM


ZeRo
Posts: 428

WWW
invokeEvent自体は、ほかのプラグインに"OnWebSaveUser”というイベントを通知する機能なので、使っているプラグインがなければ、追加しなくてもよいかと思います。
やるとしたら、"furigana" => $furigana かなぁ

今のところ、OnWebSaveUserをフックしているプラグインはないんじゃないかと思います。

WebSignupのスニペットと後はコアのWebUser周りも修正が必要かも知れません。

#20: 11-Dec-2006, 05:28 PM


SSMx
Posts: 48

WWW
ちょっと、混乱してました。下記の件は WebSignup でした。失礼しました。
From:<名前> to@domain.com これは未だ解決ならず ⇒ windows固有の問題と思い込んで諦める(来年

php.iniに頼らずコードを以下に修正したら問題解決しました。(まんまなんですけど、php.iniに一切頼らず)

Quote
// encode settings
mb_language( "ja");
mb_internal_encoding( "UTF-8");
を修正
$headers = "From: $from_email\r\n"."Content-type: text/html;charset=utf-8\r\n";
$headers = "From: $from_email\r\n"."Content-type: text/html;charset=ISO-2022-JP\r\n";

mail($to, $subject, $body, $headers)
mb_send_mail($to, $subject, $body, $headers)

で完璧に解決しました。
どこか、php.ini を信じたいところがあって最後までmail()でやろうとしていたのですが、タイトルの頭が欠けてしまう等不具合が生じて胃いました。しかし、mb_send_mailに変更することで完璧に解決しました。

ZeRoさん、Custerさん他、皆様ありがとうございました。また、SQL周りの文字化け、項目の追加等、なにか成果が上がりましたらあげます。

P.S それにしても何のためのiniなんだ?と言いたくなるところだけご、私の設定が間違ってるのでしょうね。多分。


<追加です>
websignup.inc.php のWEBサインインのスニペットもコードを追ってみたところ
weblogin.common.inc.php の共通部でmail()関数を使用しています。
上記のファイルの内容を以下のように修正。
Code:
function webLoginSendNewPassword($email,$uid,$pwd,$ufn){
// encode settings
mb_language( "ja");
mb_internal_encoding( "UTF-8");
.
.
.
$message = mb_convert_encoding( $message , "ISO-2022-JP");
if(!mb_send_mail($email, $emailsubject, $message, "From: ".$emailsender."\r\n"."X-Mailer: Content Manager - PHP/".phpversion())) {
で、件名の文字化けがなくなりました。


もしかしたら、MySQLまわりの文字化けもこれに起因するものではないかと考えています
« Last Edit: 13-Dec-2006, 10:54 AM by ssmk »
初心者代表 (やらいでか!http://ssmk.blogspot.com/)
Pages: [1]   Go Up
0 Members and 1 Guest are viewing this topic.