- ベストアンサー
メンバー会員へ一斉送信するメールの作成方法
- PHPを使用して、メンバー会員(MySQL)のメールアドレス宛てにメールを一斉送信するコードを作成します。
- 送信先のメールアドレスをデータベースから抽出し、送信処理を行います。
- 送信処理にはmb_send_mail関数を使用し、送信結果を確認します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
全体的に手直し箇所が多すぎるので、なかなか回答がつかないのかも知れません。 >所々変えて試しておりますが中々うまく行きません。 あてずっぽで動くものではありません。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冊でも通して勉強されることをお勧めします。
その他の回答 (1)
- JaneDue
- ベストアンサー率75% (263/350)
htmlspecialchars() や nl2br()は、例えば過去メールを閲覧できるようHTML化する場合等にタグを無効化・改行変換しているものです。メール時には不要です。(もし質問者さまだけでなく、会員も送信可能だったり、過去ログ等HTML化する場合には使用。) 今は勉強中との旨ですので基本的には教科書に従えばよいと思いますが、もしこのスクリプトが誰でもアクセス可能な場所にある場合、 <form action='http://このスクリプトのURL' ~ とされるとどうなるでしょう? 実際には、不正な所からpostされていないか、アクセス元を調べる等の処理が必要になります。 ほかPHP セキュリティについて一読しておくことをお勧めします。 http://thinkit.co.jp/free/tech/7/2/1.html
お礼
JaneDueさん、 URLが表示されるとファイルが流出させられる可能性があるという理解で良いでしょうか? メール文書が改行出来ずに送信される事については暫く、グーグルで検索して有効な情報を探してみたいと思います。 (教科書にこの所は詳しく出ていないので) 返信ありがとうございました。
お礼
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/>ううううう という風に送信されてしまいました。 差し支えなければこちらも良い方法を教えていただけないでしょうか? またこの書き込みをご覧の方々からもアドバイスなどありましたら大変助かります。 よろしくお願いいたします。