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

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

ただいまの
回答率

90.21%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,656
退会済みユーザー

退会済みユーザー

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

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

$path = '/home/アカウント名/pear/PEAR/';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
require_once '/home/アカウント名/www/pear/PEAR/Mail/mimeDecode.php';
    
$params['include_bodies'] = true;
$params['decode_bodies'] = true;
$params['decode_headers'] = true;
$params['input'] = file_get_contents("php://stdin");
$params['crlf'] = "\r\n";
if (!$params['input']) {// 読み込み失敗
   exit();
}
$structure = Mail_mimeDecode::decode($params);
$mail = $structure->headers['from'];
$mail = addslashes($mail);
$mail = str_replace('"','',$mail);
$mail = preg_replace('/(^.*<|>$)/', '', $mail);
$MailBody = mb_convert_encoding($structure->body,
mb_internal_encoding(), "UTF-8");

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

$from = 'hoge@hoge.com';
$head = "From: $from\n";
$subject = 'メールテスト';
$body = $MailBody;
    
// メール送信
mb_language('japanese');
mb_internal_encoding('UTF-8');
mb_send_mail($mail, $subject, $body, $head, $from);

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

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

$values = preg_replace("/( | )/", "", $MailBody);
$array = explode("\n", $values); // とりあえず行に分割
$array = array_map('trim', $array); // 各要素をtrim()にかける
$array = array_filter($array, 'strlen'); // 文字数が0のやつを取り除く
$array = array_values($array); // 連番振り直し

foreach($array as $value) { // 配列の値を取り出す
  if(preg_match('/^名前/', $value)) { //もし値の初めに名前がつく値があったら
      $hogehoge = preg_replace('/名前/', '', $value); // 名前を削除して残った文字列を格納
   }
}

$from = 'hoge@hoge.com';
$head = "From: $from\n";
$subject = 'メールテスト';
$body = $hogehoge;
    
// メール送信
mb_language('japanese');
mb_internal_encoding('UTF-8');
mb_send_mail($mail, $subject, $body, $head, $from);

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

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

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

どなたかご教授頂けますと幸いです。
宜しく御願い致します。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

送信されたメールの文字コードとソースや内部処理の文字コードが異なる可能性もありますし、先頭に「名前」が来てないのかも知れませんし、一旦全て書き出してみるのはどうでしょう?
$hogehoge = "文字化けチェックの一行目\n";
foreach($array as $value) { // 配列の値を取り出す
  $hogehoge = $hogehoge . $value . "\n";
  if(preg_match('/^名前/', $value)) {
      $hogehoge = $hogehoge . ":: " . preg_replace('/名前/', '', $value)  . "\n";
   }
}
※検証してないのでエラーとかあるかもしれません。
旨く動けば、メールを全て書き出しつつ、名前の行の下に「:: 」で始まる行が追加されているはずです。
一行目だけ化けてて他が問題無しなら、PHPファイルの文字コードに問題あるのかも知れません。
メール本文全部文字化けしていたり、「名前」が先頭に来ているのに「:: 」の行だけ無い場合は、文字コードの問題か、正規表現がちゃんと動いていないか。
1行も出ていない場合は、配列に入れて整形してる部分に問題があるのかも。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/05 00:44

    PHPのファイルの文字コードはUTF-8でした!

    キャンセル

  • 2015/10/05 00:52

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

    キャンセル

  • 2015/10/05 02:36

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/04 22:35

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

    キャンセル

  • 2015/10/04 22:38

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

    キャンセル

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

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る