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

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

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

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

Q&A

解決済

3回答

2857閲覧

PHPでメールマガジンの送信を考えております。

manamana620

総合スコア14

PHP

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

0グッド

0クリップ

投稿2016/04/16 01:33

PHP

1<?php 2 3 try 4 { 5 6 7 require_once('./function.php'); 8 require_once('./config.php'); 9 10 $title=$_POST['title']; 11 $naiyou=$_POST['naiyou']; 12 13 $dbh=new PDO(DSN,DB_USER,DB_PASSWORD); 14 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 15 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 16 17 $sql='select mail from hon_table'; 18 19 20 print 'メールマガジンの送信登録しました。<br><br>'; 21 22 23 24 print'タイトル'; 25 print'<br>'; 26 27 print $title; 28 print'<br>'; 29 print '~内容~<br><br>'; 30 print nl2br(h($naiyou)); 31 32 $count = 0; 33 34 foreach ($dbh->query($sql) as $row) { 35 $honbun = "$naiyou\n\n\n"; 36 37 $title=$title; 38 $header = 'From:info@hogehoge.com'; 39 //メールヘッダーインジェクション対策 40 $header = str_replace(array("\r\n", "\r", "\n"), "", $header); 41 $honbun = html_entity_decode($honbun, ENT_QUOTES, 'UTF-8'); 42 mb_language('japanese'); 43 mb_internal_encoding('UTF-8'); 44 mb_send_mail($row['mail'], $title, $honbun, $header); 45 46 $count++; 47 if ($count > 50 && $count % 50 == 1) { // 51, 101, 151, ... の場合30秒停止 48 sleep(30); 49 } 50 51 $dbh = null; 52 } 53 } 54 catch (Exception $e) 55 { 56 print '取得に失敗しました。ただいま障害により大変ご迷惑をお掛けしております。'; 57 exit(); 58 } 59 ?> 60

$count = 0;置き場所で悩んでいます。

foreachの手前に書いてますが、

繰り返し処理の中でないので、カウント0が機能するのでしょうか?

うまくsleepが機能するのでしょうか?

仮想開発環境なので実際メールを大量に送る実験をしてません。

この書き方でよいのか不安です。

アドバイス願います。

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

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

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

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

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

guest

回答3

0

メールの大量配信は自己開発するには難易度高めです。
大量メール配信の仕組みに関して、まず勉強されることをおすすめします。

難易度低めの壁:メール配信の流量コントロール、登録個人情報の保護手順の確立等
難易度高めの壁:携帯アドレスの処理、ブラックリスト登録の解除等

投稿2016/04/16 02:14

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

はじめまして。こんにちは。

他の方が仰っているように基本から学習された方が良いと思います。
DBやメール送信の箇所はひとまずコメントしておいて、
実際にどのような挙動をするのか、デバッグ(echo/print/var_dump等)で
ひとつひとつ確認するのがいいですね。

またメルマガ送信等、時間のかかるプログラムは
大抵コマンドラインからのバッチ実行だと思いますので、
サーバー(linux等)の知識も必要になってくるでしょう。

先は長いかもしれませんが、プログラムは楽しいものです。
ゆっくりしっかり進めてみて下さい。

投稿2016/04/16 02:47

LILI.IRON.FIST

総合スコア151

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

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

0

ベストアンサー

まず、合っているかどうかを教えることは、非常に簡単ですが、
あえて、厳しい意見となってしまいますが、うるさい年寄りだと思わず、お聞きください。

ということで、意地悪ですが、
メール送信、云々、の前に、基本的な、PHP(というより、そもそものプログラミングの基本)の、forなどの、ループの動作について、学習・確認されたほうがよいかと思います(PHPの言語学習はされていない?どこかから持ってきたソース?でしょうか?)。

理解できていれば、うまく動くかどうかは、すぐに、わかるはずです。

あと、ついでに、苦言となってしまいますが、
プログラムの、インデントをきちんと、守ってください。
インデントのくずれているプログラムは、たとえ動作したとしても、信頼できません。
プログラムを書く人間同士での、最低限のルールです。


以下追記です。
まずは、元のソースを整形しました。

<?php try { // require_once('./function.php'); require_once('./config.php'); // $title = $_POST['title']; $naiyou = $_POST['naiyou']; // $dbh = new PDO(DSN,DB_USER,DB_PASSWORD); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); // $sql = 'select mail from hon_table'; // print 'メールマガジンの送信登録しました。<br><br>'; // print'タイトル'; print'<br>'; // print $title; print'<br>'; print '~内容~<br><br>'; print nl2br(h($naiyou)); // $count = 0; foreach ($dbh->query($sql) as $row) { // $honbun = "$naiyou\n\n\n"; // $title=$title; $header = 'From:info@hogehoge.com'; //メールヘッダーインジェクション対策 $header = str_replace(array("\r\n", "\r", "\n"), "", $header); $honbun = html_entity_decode($honbun, ENT_QUOTES, 'UTF-8'); // mb_language('japanese'); mb_internal_encoding('UTF-8'); mb_send_mail($row['mail'], $title, $honbun, $header); $count++; if ($count > 50 && $count % 50 == 1) { // 51, 101, 151, ... の場合30秒停止 sleep(30); } $dbh = null; } } catch (Exception $e) { print '取得に失敗しました。ただいま障害により大変ご迷惑をお掛けしております。'; exit(); } ?>

そして、このソースへのコメントです。

  1. まずそもそもの質問の、「$count」の場所ですが、特に問題ないと思います。

もし、foreachのループ内においてしまったら、ループの度に、$count==0になってしまいますので、いつになって、Sleepは実行されません。
0. foreachかwhileかという話ですが、どちらでも結構です。好きな方で。もちろん、明確に使い分けをする必要があるループを構成することもありますが、この処理ではどちらでもかまわないかと思います。


なお、このソースの指摘で動作しないんだけど?と言われても困りますので(というか、申し訳ないですがたぶん動きません。)、以下に、このソースが動かない可能性を指摘します。

  1. require_onceで、2つのファイルを取り込んでいますが、内容がわからないため、影響などがわかりません。
  2. $title,$naiyouについて、POST以外でアクセスされた場合、$_POSTがnullになりエラーとなる可能性があります。
  3. PDOの操作をしておりますが、ターゲットのDBの種類や、そもそもスキーマがわかりませんので、動作するかどうかわかりません。
  4. printで、いろいろ出力されていますが、HTMLヘッダとかが存在しないのか、他で定義されているのか?わかりません。
  5. $title=$title;の行、この行の操作の意味がわかりません。
  6. mb_関連関数を利用されていますが、mb_stringがPHPに導入されているかどうかわかりません(大半の国内レンサバなら大丈夫ですが、自前環境などだと入っていないことも)。
  7. mb_sendmailを使っていますが、SMTP関連の設定状況がわかりませんので、無事に送信されるかどうかわかりません。
  8. sleep(30)となっているようで、30秒の待ちが50メール送信毎に発生するようですが、メールの数が多い場合には、クライアント側でタイムアウトしてしまう可能性があります。
  9. $dbh = null;としてしまっていますので、ループの2回目で、$dbhが無くなってしまい、エラーになりそうです。

以上、がんばってください。

投稿2016/04/16 01:46

編集2016/04/16 03:45
ItoTomonori

総合スコア1283

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

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

manamana620

2016/04/16 02:10

ご回答ありがとうございます、 稚拙なプログラムで誠にすみません。 私は、プログラムは超初心者です。 PHPがプログラム勉強の最初の言語です。 田舎のため、近くにプログラムを教えてくれる学校はないです。 googleで検索のみの状態です。 ソースの元は、 http://www.phppro.jp/qa/1371 となります。 データーベースで取得のみをしたい時によく foreach ($dbh->query($sql) as $row) こちらのコードをみかけるので、 (ドットインストールhttp://dotinstall.com/などで) foreachにした次第です。 whileの方がよいのでしょうか? foreachでは使い方がちがうのでしょうか? プロの方の意見をお聞かせください。
ItoTomonori

2016/04/16 02:37

超初心者の方が、ネットの情報でプログラムを覚えるというのは、無理ではないですが、やめておくのが吉です。かなりの高い確率でネットの情報は、曖昧な情報、間違えた情報、動かないサンプルなどなど、役立たないばかりか、曖昧なまた間違った情報を飲み込んでしまいます。スレ主様はそこにハマってしまい、ここで質問されているのだとは思いますが)。 そして、本人が学習意欲があるなら、学校などで、教わる必要はないでしょう。 現在は、Amazonなどでも、優良な書籍などが手に入ります。 ぜひ、どのような本でもよいので、書籍を読んで、まずは基礎知識をつけるべきと思います。 そうすれば、$countが合っているのか、foreachなのか、whileなのか?分かるはずです。 なお、もし、答えだけを求めるのであれば、言ってください。 解答を書くことは、先にもかきましたが、特段難しいことではありませんので。
manamana620

2016/04/16 02:56

ご回答ありがとうございます、 書籍等検索してみますが、下記サイトをみてから不安だらけになりました。 http://blog.tokumaru.org/2013/12/php12sql.html よい書籍がありましたら、お教えください。 答えは、今後のためにも知りたいです。教えてください。
manamana620

2016/04/16 04:08

ご丁寧にありがとうございます、基礎をがんばってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問