functionとforeachでメール送信

このQ&Aのポイント
  • HTMLのメールフォームからPOSTでデータを受信してクライアントとユーザーの両方にメールを送るプログラムを作成していますが、メールが届かない問題や本文の不要な文字が表示される問題に悩んでいます。
  • 1. functionで関数を作りforeachでデータを取得してメール送信する方法についての質問です。2. メールの本文にある不要な文字を消す方法についての質問です。
  • 既存のプログラムではメールが届かない問題や本文に不要な文字が表示される問題が発生しており、解決方法についてのアドバイスを求めています。
回答を見る
  • ベストアンサー

functionとforeachでメール送信

こんにちは。前にも質問をさせて頂いたのですが・・・ HTMLのメールフォームからPOSTでデータを受信してクライアントとユーザーの両方にメールを送るようなプロゴラムを記述しています。 データの受け取りからメールの送信のスクリプトを function message(){ foreach($_POST as $key => $val){ print( $key .":" .$val. "<br>"); }; }; $message= " テスト送信 <br>"; $message.= message(); if(mail("クライアントのメールアドレス" , "テストメール", $message, $head)&& mail(message(34) , "テスト確認メール", $message, $head)){ print("・・・"); }else{ print("ご注文メール送信に失敗しました。<br />\n"); print("再度ご注文フォームより注文して下さい。\n"); print("<a href=\"#\">戻る</a>"); }; としています。message(34)はユーザーのアドレスを取得しています。 しかし実行すると画面にPOSTで取ってるデータが2回表示され肝心のメールは クライアントには " テスト送信 と本文に表示されてユーザーにはメールが届きません。 質問が2つですみませんが、 1、functionで関数を作りforeachでデータを取得しメールで送信するというやり方は無謀なのでしょうか? もしできるのでしたらやり方を教えて頂けないでしょうか? 2、メールの本文にある"を消すにはどうしたらいいのでしょうか? かれこれ1週間近く悩んでいるのですが、一向にできそうにありません・・・。皆さんの知恵と知識をお借りできたらなと思います、どうかよろしくお願いします。 他に何かいる情報があれば教えて下さい。分かる範囲で補足していきます。

  • PHP
  • 回答数4
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • shu_a
  • ベストアンサー率87% (14/16)
回答No.4

さっきは気づかなかったのですが、原因がわかりました。 $head .= "Content-type: text/html; charset=\"Jis\r\n\""; は、 $head .= "Content-type: text/html; charset=\"Jis\"\r\n"; ですね。たぶん。

amountainblast
質問者

お礼

ありがとうございます。できました。 \"の位置が悪かったんですね。 何度もすみません。非常に助かりました^^。

その他の回答 (3)

  • shu_a
  • ベストアンサー率87% (14/16)
回答No.3

下記の mb_convert_encodin は mb_convert_encoding の間違えです。

  • shu_a
  • ベストアンサー率87% (14/16)
回答No.2

return については参照URLを。 頭にダブルコーテーションがついてしまう問題については、送信前の文字列を出力してみてはどうでしょうか。 また、文字コードの問題が考えられます。 $message,$head は JIS コードで送信しているでしょうか? mb が有効ならば、 $head = mb_convert_encodin($head, "JIS"); $message = mb_convert_encoding($message, "JIS"); によって変換すべきです。 i18n_convert という関数もあります。

参考URL:
http://php.planetmirror.com/manual/ja/functions.returning-values.php
amountainblast
質問者

お礼

何度もありがとうございます。 送信前の文字列なのですが、$messageは"がなくちゃんと表示されています。$headは MIME-Version: 1.0 Content-type: text/html; charset="Jis " と表示されます。 mb_convert_encodingをしても変わりませんでした。 $headの指定の仕方が悪いのでしょうか?もしそうだとしたら何か他に指定する方法はありますか?

  • shu_a
  • ベストアンサー率87% (14/16)
回答No.1

function message(){ foreach($_POST as $key => $val){ print( $key .":" .$val. "<br>"); }; }; は文字列を返していないのではないでしょうか? 印字ではなく、文字列を返すようにすればよいと思います。 あと foreach の終わり、function の終わりには ;(セミコロン)は不要です。 function message(){ foreach($_POST as $key => $val){ $buf .= $key .":" .$val. "<br>"; } return $buf; } [質問について] 1. 無謀でもないような気がします。正しく文字列を取得できるようにすれば良いと思います。 2. 上記の方法で試すと解決すると思います。

amountainblast
質問者

お礼

ありがとうございます。 1に付いては解決しました。 いまいちreturnの使い道が分からないのですが、returnとはどのように使うのですか??? 2ですが、どうもメールのヘッダ指定の仕方に問題があるみたいなんです・・・ メールのヘッダ指定に $head = "MIME-Version: 1.0\r\n"; $head .= "Content-type: text/html; charset=\"Jis\r\n\""; として mail($soushin , "テスト確認メール", $message, $head); としてメールを送信すると、頭に"が付きます。 そして2行目の$head .= "Content-type: text/html; charset=\"Jis\r\n\""; をコメントアウトすると"は表示されなくなりますが、本文中に<br>が表示されてしまいます。 どうしたら上手いこと行きますでしょうか???

関連するQ&A

  • foreachの中で、リンクをPOST送信したい

    ・PHPのforeachで一覧表示しているリンクテキストをクリックして、POST送信したいです ・この時、foreachの$val['url']内容に応じて、action送信先を変更したいのですが、どうすれば良いでしょうか? ■完成イメージ <?php foreach ($key as $val): ?> <form name="test"> <a href="#" onClick="hoge($val['url'])"> </form> ・1行目内容 … 送信先 $val['url'] ・2行目内容 … 送信先 $val['url'] ・3行目内容 … 送信先 $val['url'] ■分からないこと ・foreachで回した後にクリックすることになると思うので、現状だとaction送信先は、全てループ一番最後の$val内容固定になってしまいます(多分…) ・リンクテキストのPOST送信先を、foreach内容に応じて変えるにはどうすれば良いでしょうか? ※foreach内容に応じて、リンクテキストがPOST送信できるのであれば、やり方は何でも良いです

  • foreachでのメール一斉送信処理がうまくいきません

    以下のようなファイルからデータを読み込みメールを送信させたいのですが、一つ目のデータに対してはメール送信が行われますが、2行目以降に対してメール送信が行われません。 下記のuser.txt例ですと1行目のAさん宛てには送信されますが,2行目のBさんにはメール送信がされません。 どうしてなのでしょうか? ユーザーに応じたメッセージを送信する必要があり、BCC送信は利用できません。 #user.txtの内容----------- #Aさん,a@mail.com,0 #Bさん,b@mail.com,0 #------------------------ #読み込んだファイルから一行づつ各項目データを読み込む #@checkにはuser.txtが入っている。 foreach $item (@check){ @check_array = split(/\,/, $item); #1件づつメールを送信する require "./mails_user.pl"; } #外部 mails_user.plの内容----------- open (MAIL, "|$mailprog -t") or &Make_Error('mail_trouble'); print MAIL "To: $check_array[1]\n"; print MAIL "From: 送信元アドレス\n"; print MAIL "Subject: タイトル\n\n"; print MAIL "$check_array[0]へのメッセージ"; close(MAIL); 1; #-----------------------------------

    • ベストアンサー
    • Perl
  • foreachで取り出したデータをメールの内容に掲載したい

    ショッピングカートを作成しているのですがforeach文で取り出した データをそれぞれメールの内容に掲載してあげたいのですが どうしてもうまくいきません。 ソースは以下のとおりです。 function kakunin_mail(){ foreach ($_SESSION['cart'] as $key => $value) { $orderdata = "■購入商品:".$value['name'].$value['size']." 数量:".$value['kazu']."\n"; } //日本語文字化け回避 mb_language('Japanese'); //送信元メールアドレス $sendfrom = test@test.com //送信メールタイトル $mailTitle = "ご注文確認メール"; //送信メール内容 $maildata = " $orderdata "; //メールデータ送信 mb_send_mail(test@test.com, "$mailTitle", "$maildata", "From:$sendfrom"); } 無事にメールは送信されるのですが内容を確認すると最後に購入した商品の分しか 表示されません。 どのようにすればいいのか、どなたかお知恵をお貸し頂けますでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • functionの中にfunction?

    functionの中にfunctionの関数を読み込みたいのですが そのようなことはphpで可能でしょうか? ソースは以下のようになっております。 // 実行 hoge1(); hoge2(); function hoge1() { if (!$_POST["submit"]) { foreach($_POST as $k => $v) { if(get_magic_quotes_gpc()) { $v=stripslashes($v); } $v=htmlspecialchars($v); $array[$k]=$v; } extract($array); } } function hoge2() { echo <<<EOM ~~表示させる文章など~~ EOM; foreach ($array as $key => $val){ echo "<input type=\"hidden\" name=\"$key\" value=\"$val\" />\n"; } } 具体的にはhoge1のextract($array);をhoge2の$arrayに入れて foreachで出力させたいのですがどのようにすればできますでしょうか?

    • 締切済み
    • PHP
  • PHPでメールを送信するには

    PHP超初心者です。 参考本をもとにPHPでメールを送信するということにチャレンジしているのですが、次のような文章が出ます。 Warning: mb_send_mail() [function.mb-send-mail]: "sendmail_from" not set in php.ini or custom "From:" header missing in C:\Program Files\Apache Group\Apache2\htdocs\php10\mail.php on line 11 エラー:送信に失敗しました 参考本に書いてあるとおり、 php.iniのSMTP=localhost を自分が使っているoooooo@ocn.ne.jpに書き換え、sendmailには自分の別アドレスを記述したのですが。 11行目のエラーも何を指しているのかわかりません。 ご回答よろしくお願いします。 【mail.php】 <html> <head><title>mail.php</title></head> <body> <?php $address=$_POST['address']; $subject=$_POST['subject']; $message=$_POST['message']; $header="Content-Type:text/plain;charset=iso-2022-jp"; mb_language("Japanese"); if(mb_send_mail($address, $subject, mb_convert_encoding($message,"JIS","EUC-JP"),$header)){ print("送信完了しました。"); }else{ print("エラー:送信に失敗しました"); } ?> </body> </html> 【mail_form.html】 <html> <head><title>メールの送信</title></head> <body> <h2>メールの送信</h2> <form action="mail.php" method="post"> 宛先:<input type="text" name="address"><br /> 件名:<input type="text" name="subject"><br /> 本文:<br /><textarea name="message" rows="5" cols="30"></textarea><br /> <input type="submit" value="送信"> </form> </body> </html>

    • ベストアンサー
    • PHP
  • foreachの使い方

    foreach (split(/<br>/i,$text)){ #処理 } 今までこのようにforeachでループさせていたのですがxhtml形式に順次対応させていこうと改変中です <br>も旧データの中に残った状態なので、<br>と<br />の両方でループするようにしたいのですが、どう書けばいいでしょうか foreach ((split(/<br>/i,$text)) || (split(/<br />/i,$text))){ #処理 } これじゃあまずいですよね? 本来ならトライ&エラーあるのみですが、ループの中が複雑な上にいろんなところに散らばっているデータの書き換えもしてしまうのでテスト用に改変することも大変で、トライ&エラーをやるにも難しい状況なのでここはどうしても一発目で成功させたいのです。

    • ベストアンサー
    • Perl
  • PHP foreachを使ってループしたい

    こんばんは。 PHPで複数の宛先でメールを送信したいと思っております。 そこでメールフォームでまず mail.php foreach ($arr as $value) { print'<input type="hidden" name="mail[]" value="'. $value .'">'; } f-mail.php $_POST['mail']で取得しそれを$valとして、print_r($val);で表示すると Array ( [0] => アドレスA [1] =>アドレスB ) と表示されます。 その複数のアドレスを //PEAR::MailCu require_once '/Mail.php'; //PEAR::Mail_mimeCu require_once '/mimeDecode.php'; //送信データを設定する $recipients= $val; $new_from = 'hoge@hoge.com'; $subject = mb_encode_mimeheader(mb_convert_encoding("$subject1", "JIS", "auto"), "JIS"); $body =$body1; //メールを送信する $headers = array(); $headers['From'] = $new_from; $headers['To'] = $recipients; $headers['Subject'] = $subject; $headers['Sender'] = $new_from; $mail = Mail::factory('sendmail'); $result = $mail->send($recipients, $headers, $body); ・LoopでToを変更しながら繰り返し送信する事がしたいのですがforeachでどう設定していいかわかりません。マニュアルもみたのですが、混乱してしまったので ご指導、ご教授のほど宜しくお願い致します。

    • 締切済み
    • PHP
  • 二次元配列のforeachはどうすれば?

    <form action="form_check.php" method="POST"> <input type="checkbox" name="check[]" value="aaaa"> <input type="checkbox" name="check[]" value="bbbb"> <input type="checkbox" name="check[]" value="cccc"> <input type="submit" value="送信"> </form> フォームでこのように送りました このデータを受け取り、1つにまとめたいのですが foreach($_POST[check] as $val){ if($all){ $all .= ",".$val; }else{ $all = $val; } } このようにしてみたところ Warning: Invalid argument supplied for foreach() とエラーが出ました。 二次元配列でforeachのループをかけるときはどのように記述すればいいのでしょうか。

    • ベストアンサー
    • PHP
  • foreach内での$_の書き換え

    数年前にハッシュのデータをforeachで取り出す時、$_をいじると、$_はハッシュのデータと直接つながっているので、ハッシュのデータ(keyは変わらずvalueのほう)が書き換わってしまうと聞き、実際にやってみて書き換わってしまった覚えがあります。 %hash = ("red" => "aka", "green" => "midori", "blue" => "ao", "black" => "kuro"); foreach (%hash){ print "$_<br>\n"; $_ = "modify"; } print "<hr>\n"; foreach (values %hash ){ print "$_<br>\n"; } ↓↓↓↓↓↓html↓↓↓↓↓↓↓ blue ao green midori red aka black kuro ------------------------------------ modify modify modify modify ↑となったはず 先日それを試してみたら書き換わりませんでした。 以前は確かに書き換わった覚えがあります。 perlの仕様が変わったのでしょうか。それとも私が何か間違っているのでしょうか。 詳しい方にお教えいただければと質問しました。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • array_randで要素が数字の場合の処理方法

    PHPのarray_randについて教えて下さい。 下記のようなソースを作りましたが思った通りの結果になりません。 //(A) $test=array(3,5,8,11,14,24,26,28); print_r($test); foreach ($test as $val) { echo $val.'<br>'; } //(B) $keys = array_rand($test, 5);//決められた数を抽出 print_r($keys).'<br><br>'; foreach ($keys as $val) { echo $val.'<br>'; } Aの部分の結果は Array ( [0] => 3 [1] => 5 [2] => 8 [3] => 11 [4] => 14 [5] => 24 [6] => 26 [7] => 28 ) foreachの部分の出力↓ 3 5 8 11 14 24 26 28 となりこれは特に問題ありません。 Bの部分でAの配列から5つランダムで取り出したいのですが、結果は Array ( [0] => 0 [1] => 3 [2] => 5 [3] => 6 [4] => 7 ) 0 foreachの部分の出力↓ 0 3 5 6 7 となってしまい、Aの配列の添え字の中から5つの数字が選ばれるようになってしまいます。 Aの添え字ではなく「3,5,8,11,14,24,26,28」の数字から5つランダムで取り出すにはどのような書き方をすればよいのでしょうか? ご回答よろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう