こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

メンバー会員へメールの一斉送信にて、

メンバー会員へメールの一斉送信にて、
メンバー会員(MySQL)のメールアドレス宛てにメールを一斉送信するPHPコードを作成しています。

---menber---
ID |name |email
1 |田中 |aaa@bbb.jp
2 |山田 |bbb@ccc.jp
3 |山中 |ccc@ddd.jp

---meilform.html---
<form action="send.php" method="post">
<font size="2">メールタイトル</font><input type="text" name="title" /><br />
<font size="2">メール文書</font><textarea name="honbun" cols="60" rows="7"></textarea><br />
<input type="submit" value="メール送信" />
</form>

---send.php---
<?php
mb_language("japanese");
mb_internal_encoding("UTF8");
//送信先アドレス抽出
$recordSet = mysql_query('SELECT * FROM menber ORDER BY email DESC');
while ($email = mysql_fetch_assoc($recordSet)) {
$mailto = $_POST['email'];
$title = $_POST['title'];
$honbun = $_POST['honbun'];
$mailfrom = "<zzz@yyy.jp>";
if (!mb_send_mail($title,$honbun,"From:".$mailfrom)) {
echo '<br />メール送信失敗。';
} else {
echo '<br />メール送信完了。';
}
}
?>

エラー表示では send.php の if (mb_send_mail($title,$honbun,"From:".$mailfrom)) のラインが表示されているのですが、送信先アドレスの抽出と while分の繰り返し処理のところも自信がありません。

所々変えて試しておりますが中々うまく行きません。

どなたかご指導お願いいたします。

投稿日時 - 2010-10-14 17:40:00

QNo.6249906

困ってます

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

全体的に手直し箇所が多すぎるので、なかなか回答がつかないのかも知れません。

>所々変えて試しておりますが中々うまく行きません。
あてずっぽで動くものではありません。PHP/MySQL の本で基礎からしっかり勉強しなおしてください。
ましてやメール配信など、万一の場合、多くの人に迷惑をかけてしまうようなスクリプトは、十分学習された後で作成すべきですよ。

一応気づいた箇所をざっと書きますね。

■mb_send_mail()の引数の順序が ぐたぐたです。確認してください。
エラーが出たなら「そこがおかしい」指摘されているのですから、調べるクセをつけましょう。
http://jp2.php.net/manual/ja/function.mb-send-mail.php


■sqlの接続は?
省略して記載しているのかも知れませんが、いきなりmysql_query()してもダメですよ。
まずMySQLに接続を確立してからです。
$link = mysql_connect(HOST名, ユーザ名, パスワード);


■'SELECT * FROM menber ORDER BY email DESC';
"ORDER BY email DESC" はemailをアルファベット逆順に並び替えるということですが、その必要性はないのでは?
(数万通をいくつにも分割・送信するならソートも必要ですが、それならIDで分割する方が自然です。わざわざメールアドレスを逆並べする必要はないかと。)
また、他の値を使用しないなら"SELECT email ~でよいのでは? 不必要なデータは取得しないことです。


■while部分もきびしいです。
??? データベースから取得した値が使用されていませんよ?
$_POST['email'] も不明です。送信先はデータベースから取得するのではありませんか?
また、戻り値は連想配列なので、
while($raw = mysql_fetch_assoc($recordSet)) {
$email = $raw['email'];
のような形になります。

$titleや $honbun は同じなので while内で何度も代入する必要はないでしょう。
//whileの前に一度だけ代入。
$title = $_POST['title'];
$honbun = $_POST['honbun'];
$mailfrom = "FROM: zzz@yyy.jp\n";
while($raw = mysql_fetch_assoc($recordSet)) {
if (!mb_send_mail ( $raw['email'] , $title , $honbun , $mailfrom)){

}
}

また$_POST['title']や$_POST['honbun']をそのまま使用は危険です。
とにかく、入門書を1冊でも通して勉強されることをお勧めします。

投稿日時 - 2010-10-16 13:13:51

お礼

JaneDueさん、返信ありがとうございました。

■sqlの接続は?
※require_once('dbcon.php');で処理しています。

■'SELECT * FROM menber ORDER BY email DESC'
※たしかに不要ですね。
SELECT email FROM menberに変更致しました。

■while部分もきびしいです。
※うっかりしていました。
$rowでメルアドを取得する処理をしていませんでした。
ご指摘の部分を直してみたところ送信出来ました。

現在教科書を読み勉強しており教科書通りのコードだと上手くいくのですが、自分でゼロからコードを書けなければ意味がないと思い今回は自分で一から作成したものなのでかなり問題点が多いと思います。

■$_POST['title']や$_POST['honbun']をそのまま使用は危険です。
※教科書に htmlspecialchars で無害化出来ると書いてあるのですが正しいでしょうか?

後、['honbun'] でテキストが改行出来ず全て一列で送信されてしまいます。
ググってみたところ
$honbun = htmlspecialchars($honbun);
$honbun = nl2br($honbun);
$honbun = str_replace("\r", "", $honbun);
$honbun = str_replace("\n", "", $honbun);
の様な処理がありましたので加えてみましたが結果、

   あああああ<br/>いいいいい<br/>ううううう

という風に送信されてしまいました。

差し支えなければこちらも良い方法を教えていただけないでしょうか?

またこの書き込みをご覧の方々からもアドバイスなどありましたら大変助かります。

よろしくお願いいたします。

投稿日時 - 2010-10-17 00:06:34

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

htmlspecialchars() や nl2br()は、例えば過去メールを閲覧できるようHTML化する場合等にタグを無効化・改行変換しているものです。メール時には不要です。(もし質問者さまだけでなく、会員も送信可能だったり、過去ログ等HTML化する場合には使用。)

今は勉強中との旨ですので基本的には教科書に従えばよいと思いますが、もしこのスクリプトが誰でもアクセス可能な場所にある場合、
<form action='http://このスクリプトのURL' ~
とされるとどうなるでしょう?
実際には、不正な所からpostされていないか、アクセス元を調べる等の処理が必要になります。

ほかPHP セキュリティについて一読しておくことをお勧めします。
http://thinkit.co.jp/free/tech/7/2/1.html

投稿日時 - 2010-10-18 08:55:07

お礼

JaneDueさん、

URLが表示されるとファイルが流出させられる可能性があるという理解で良いでしょうか?

メール文書が改行出来ずに送信される事については暫く、グーグルで検索して有効な情報を探してみたいと思います。
(教科書にこの所は詳しく出ていないので)

返信ありがとうございました。

投稿日時 - 2010-10-19 16:04:50

あなたにオススメの質問