質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

8282閲覧

メールの内容を取得してPHPの処理をする

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/10/04 12:04

メールの受信をトリガーとしてPHPプログラムを起動し、返信するというものを作っています。
メールの本文を取得し、そこに対して処理を書いているので、その処理結果を本文として返すと空メールのような状態で返ってきてしまいます。

初心者で調べながらの作業ですが、なかなか粘っても解決出来そうになく、質問させて頂きます。

PHP

1$path = '/home/アカウント名/pear/PEAR/'; 2set_include_path(get_include_path() . PATH_SEPARATOR . $path); 3require_once '/home/アカウント名/www/pear/PEAR/Mail/mimeDecode.php'; 4 5$params['include_bodies'] = true; 6$params['decode_bodies'] = true; 7$params['decode_headers'] = true; 8$params['input'] = file_get_contents("php://stdin"); 9$params['crlf'] = "\r\n"; 10if (!$params['input']) {// 読み込み失敗 11 exit(); 12} 13$structure = Mail_mimeDecode::decode($params); 14$mail = $structure->headers['from']; 15$mail = addslashes($mail); 16$mail = str_replace('"','',$mail); 17$mail = preg_replace('/(^.*<|>$)/', '', $mail); 18$MailBody = mb_convert_encoding($structure->body, 19mb_internal_encoding(), "UTF-8"); 20 21// ここに本文を受け取った後の処理 22 23$from = 'hoge@hoge.com'; 24$head = "From: $from\n"; 25$subject = 'メールテスト'; 26$body = $MailBody; 27 28// メール送信 29mb_language('japanese'); 30mb_internal_encoding('UTF-8'); 31mb_send_mail($mail, $subject, $body, $head, $from);

このような記述でメールの受信をしたらその本文を$MailBodyに格納して、メールを送信元に送信するというところまでは無事に辿り着いたのですが。。。

ここに本文を受け取った後の処理の所に、

PHP

1$values = preg_replace("/( | )/", "", $MailBody); 2$array = explode("\n", $values); // とりあえず行に分割 3$array = array_map('trim', $array); // 各要素をtrim()にかける 4$array = array_filter($array, 'strlen'); // 文字数が0のやつを取り除く 5$array = array_values($array); // 連番振り直し 6 7foreach($array as $value) { // 配列の値を取り出す 8 if(preg_match('/^名前/', $value)) { //もし値の初めに名前がつく値があったら 9 $hogehoge = preg_replace('/名前/', '', $value); // 名前を削除して残った文字列を格納 10 } 11} 12 13$from = 'hoge@hoge.com'; 14$head = "From: $from\n"; 15$subject = 'メールテスト'; 16$body = $hogehoge; 17 18// メール送信 19mb_language('japanese'); 20mb_internal_encoding('UTF-8'); 21mb_send_mail($mail, $subject, $body, $head, $from);

上記のように、メールを受け取ったら1行ずつ配列に格納して取り出し、処理を行っていきたいです。

送られてくる本文の例)
名前テスト太郎
年齢15
生年月日2000#2#20

なので、$hogehogeにはテスト太郎が入って、それを返信の本文として使用したいと思いこういった記述になりました。
しかし、実際に動かすと空メールが返ってくるだけで、$hogehogeには何も値がないこと?になってしまっています。

どなたかご教授頂けますと幸いです。
宜しく御願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

送信されたメールの文字コードとソースや内部処理の文字コードが異なる可能性もありますし、先頭に「名前」が来てないのかも知れませんし、一旦全て書き出してみるのはどうでしょう?

php

1$hogehoge = "文字化けチェックの一行目\n"; 2foreach($array as $value) { // 配列の値を取り出す 3 $hogehoge = $hogehoge . $value . "\n"; 4 if(preg_match('/^名前/', $value)) { 5 $hogehoge = $hogehoge . ":: " . preg_replace('/名前/', '', $value) . "\n"; 6 } 7}

※検証してないのでエラーとかあるかもしれません。
旨く動けば、メールを全て書き出しつつ、名前の行の下に「:: 」で始まる行が追加されているはずです。
一行目だけ化けてて他が問題無しなら、PHPファイルの文字コードに問題あるのかも知れません。
メール本文全部文字化けしていたり、「名前」が先頭に来ているのに「:: 」の行だけ無い場合は、文字コードの問題か、正規表現がちゃんと動いていないか。
1行も出ていない場合は、配列に入れて整形してる部分に問題があるのかも。

投稿2015/10/04 12:27

編集2015/10/04 14:13
hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/10/04 12:36

ありがとうございます!! 文字化けチェックの一行目は、何を入れたらいいんでしょうか?><
hirohiro

2015/10/04 12:41

日本語なら何でもいいと思います。(例示したままでも) もし、PHPのコードがshift-jisなどで記述されていたら $hogehoge = "文字化けチェックの一行目\n"; この1行目がshift-jisで、その後に追加されるメール本文がutf-8ってことになり、 $hogehoge内にshift-jisとutf-8が混在します。 それを強引にutf-8に変換してメール送信すると、1行目が化ける可能性が高いので、そのチェック用です。 この場合「preg_match('/^名前/', $value)」このソース上の「名前」もshift-jisなので、utf-8の「名前」にHITしない可能性もあると思います。
退会済みユーザー

退会済みユーザー

2015/10/04 12:47

ご返信ありがとうございます。 メールが返ってきました。1行目は「文字化けチェックの一行目」と文字化けせずに出てきました。他の文字も文字化け箇所は見当たりませんでした。 ですが、「名前」が先頭に来ているのに「::」の行は見当たりません。(これは文字コードの問題なのでしょうか。) また、配列の個数分メール本文が繰り返してしまっています。。。
hirohiro

2015/10/04 12:58 編集

>>また、配列の個数分メール本文が繰り返してしまっています。。。 ということは、この行が機能してないっぽいですね。   $array = explode("\n", $values); // とりあえず行に分割 foreach($array as $value) これのvalueに一行だけでなく、全行入ってしまってるっぽい?
退会済みユーザー

退会済みユーザー

2015/10/04 12:58

改行コードが異なるからなんですかね。。。
退会済みユーザー

退会済みユーザー

2015/10/04 13:00

$body = $array[0]; と指定すると「名前」という返信が確認出来たので、行に分割はできてそうでした!
hirohiro

2015/10/04 13:13 編集

すみません。↑は問題なさそうです。 $str = "一行目\n名前 太郎\n3行目\n\n"; $array = explode("\n", $str); $array = array_map('trim', $array); // 各要素をtrim()にかける $array = array_filter($array, 'strlen'); // 文字数が0のやつを取り除く $array = array_values($array); $hogehoge = "aa"; foreach($array as $value) { // 配列の値を取り出す if(preg_match('/^名前/', $value)) { //もし値の初めに名前がつく値があったら $hogehoge = preg_replace('/名前/', '', $value); // 名前を削除して残った文字列を格納 } } echo $hogehoge; // 太郎 このコードを動かしてみたら期待通りの結果が得られたので、コードそのものには問題なさそうなんですが
hirohiro

2015/10/04 13:21 編集

あ、ごめんなさい。私が書いたコードに問題がありました。 配列の個数分返ってきてたのはこのせいです。失礼しました。 $hogehoge = $hogehoge . $values . "\n"; これ $hogehoge = $hogehoge . $value . "\n"; $values -> $value
退会済みユーザー

退会済みユーザー

2015/10/04 13:22

ご検証頂きましてありがとうございます! コードそのものには問題なさそうであれば、何が原因なんでしょう...^^;
hirohiro

2015/10/04 13:26

if(preg_match('/^名前/', $value)) これにHITしないんでしょうね。 メール本文の「名前」のところ「name」に変更できるならそうして if(preg_match('/^name/', $value)) コードのほうもこう変えて それでもし期待通りの結果が来たら、文字コードのせいかもですね。 確認ですが、phpファイルはutf-8で保存されていますか? またphpの実行コードはutf-8になっていますでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/04 13:34

$hogehoge = "文字化けチェックの一行目\n"; foreach($array as $value) { // 配列の値を取り出す $hogehoge = $hogehoge . $values . "\n"; if(preg_match('/^名前/', $value)) { $hogehoge = $hogehoge . ":: " . preg_replace('/名前/', '', $value) . "\n"; } } ↓ $hogehoge = "文字化けチェックの一行目\n"; foreach($array as $value) { // 配列の値を取り出す $hogehoge = $hogehoge . $value . "\n"; $values -> $value; if(preg_match('/^名前/', $value)) { $hogehoge = $hogehoge . ":: " . preg_replace('/名前/', '', $value) . "\n"; } } こういうことでしょうか?
hirohiro

2015/10/04 13:36

はい。それで、「配列の個数分メール本文が繰り返してしまって」は解決すると思います。 「:: 」から始まる行は無いままでしょう。 if(preg_match('/^名前/', $value)) これにうまくHITしていないように思います。
退会済みユーザー

退会済みユーザー

2015/10/04 13:42

nameに変更してみたら「::」から始まる行が出てきました!
hirohiro

2015/10/04 13:46

ということは、PHPを記述しているファイルか内部処理の文字コードと、メールを変換した文字コードが一致していない可能性が高いように思います。 $MailBody = mb_convert_encoding($structure->body, mb_internal_encoding(), "UTF-8"); この$mailBody内の「名前」と PHPのif(preg_match('/^名前/', $value))この「名前」のバイナリ値が異なるため一致しないんだと推測
退会済みユーザー

退会済みユーザー

2015/10/04 13:47

なるほどです! 文字コードの不一致によるものだったんですね。 >>phpファイルはutf-8で保存されていますか? →これはmb_internal_encoding('UTF-8');この指定が入っているかってことでしょうか?
hirohiro

2015/10/04 14:07 編集

PHPを何らかのエディタで編集していると思いますが、そのファイルの文字コードの話です。エディタにもよりますが、大抵保存時に文字コードを選択できると思います。 .phpファイルが仮にshift-jisなら、その中も日本語もshift-jisなので… ただ他の全てのphpがshift-jisなのに、そのファイルだけutf-8ってのも問題なので、それが原因だったとしても対応は別の方法でやったほうがいいと思います。 例えばもしshift-jisなんだったとしたら $s = mb_convert_encoding("名前", "UTF-8", "shift-jis"); if(preg_match('/^'.$s.'/', $value)) こんな感じで動くかも知れません ただまぁPHP側がshift-jisで無くなったら動かなくなりますので、移植性は凄く悪くなりますね。
退会済みユーザー

退会済みユーザー

2015/10/04 14:15

$MailBody = mb_convert_encoding($structure->body, mb_internal_encoding(), "UTF-8"); この取得するところの文字コードはこのままで大丈夫でしょうか?
hirohiro

2015/10/04 14:41 編集

>> $MailBody = mb_convert_encoding($structure->body,mb_internal_encoding(), "UTF-8"); あーそうか、これってひょっとして一旦EUC-JPに変換してます?  mb_internal_encoding()は内部処理コードを参照するようです -> http://phpjp.com/mb_internal_encoding.htm この行為に意味があるのかはわかりませんが、とりあえず、内部処理コードとPHPファイルの文字コードが一致してない可能性が高そうです。 ※元がutf-8みたいだし不要ならこの行外しちゃってもいいのかも?その辺りは解りません そのまま残す場合はこんな感じでしょうか $MailBody = mb_convert_encoding($str, mb_internal_encoding(),'UTF-8'); $s = mb_convert_encoding("/^名前/", mb_internal_encoding()); ..... if(preg_match($s, $value)) {
退会済みユーザー

退会済みユーザー

2015/10/04 15:44

PHPのファイルの文字コードはUTF-8でした!
退会済みユーザー

退会済みユーザー

2015/10/04 15:52

あれ、、 $MailBody = mb_convert_encoding($structure->body, "UTF-8", "jis"); この記述に変えてみたら行けました!!!
退会済みユーザー

退会済みユーザー

2015/10/04 17:36

jis はバグの温床、sjis-win を使うべき。
guest

0

php

1$hogehoge = preg_replace('/名前/', '', $value); // 名前を削除して残った文字列を格納

php

1$hogehoge .= preg_replace('/名前/', '', $value);

文字列が連結されていない。

投稿2015/10/04 13:25

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/10/04 13:35

回答ありがとうございます! foreachの前に$hogehoge=""という記述はいりますでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/04 13:38

あったほうがいいですよね。Undefined variable ... が出るだろうから。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問