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

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

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

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

1回答

2991閲覧

QdmailとPDOの組み合わせに関して

tok

総合スコア24

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

0クリップ

投稿2015/07/08 04:46

phpでDBで取り出したアドレスにメールを自動で送るシステムを作りたいです。

https://teratail.com/questions/7632
http://qiita.com/mpyw/items/b00b72c5c95aac573b71
上の二つを参考に組み合わせたソースが以下になります。

lang

1 2<?php 3 4 require_once('qdmail.php'); 5 require_once('qdsmtp.php'); 6 7function h($str) { 8 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 9} 10try { 11 $pdo = new PDO( 12 'mysql:dbname=test;host=127.0.0.1;charset=utf8', 13 'root', 14 '', 15 array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) 16 ); 17 $rows = $pdo->query('SELECT name,Email FROM sample')->fetchAll(PDO::FETCH_ASSOC); 18 19 $mail = & new Qdmail(); 20 21$mail -> smtp(true); 22 23$param = array( 24'host'=>'ssl://smtp.gmail.com', 25'port'=> 465 , 26'from'=>'****@gmail.com', 27'protocol'=>'SMTP_AUTH', 28'user'=>'****@gmail.com', 29'pass' => '********', 30); 31$mail -> smtpServer($param); 32 33$message="本文テスト"; 34 35$mail ->to('Email','宛先テスト');//送り先 36$mail ->subject('タイトルテスト'); 37$mail ->from('****@gmail.com'); 38$mail ->text($message); 39$return_flag = $mail ->send(); 40 41} catch (PDOException $e) { 42 $error = $e->getMessage(); 43} 44header('Content-Type: text/html; charset=utf-8'); 45?>

これで実行したところ
Qdmail error: Illegal Mail AddressSystemValidete Address Method lineとエラーを吐かれました。
試しにEmailの部分を自分のアドレスに変えたらエラーはなくなりましたが、どうすればEmailを認識させれるのかが分かりません。
ご教授よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

PDOからfetchAllで取得した結果は配列になってます。
一件目のメールアドレスは$rows[0]['Email']で取得できます。

DBから一度に何件も取り出して送信する場合は、
$message="本文テスト";

$mail ->subject('タイトルテスト');
$mail ->from('****@gmail.com');

foreach($rows as $key => $val) {
$mail ->to($val['Email'],$val['name']);//送り先
$return_flag = $mail ->send();
}
のように、ループを使って送らないといけません。

ただ、これで大量にメールを送るときはいろいろなところに問題が生じて、うまくいかない可能性があります。送信サーバや中間のsmtpサーバの問題、受け手のサーバの問題などなど。
練習用にはいいかもしれませんが、実際にはいろいろ配慮が必要です。

投稿2015/07/08 06:19

編集2015/07/08 06:23
hintrarou

総合スコア162

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

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

tok

2015/07/08 08:47

コメントありがとうございます。 実際に運用する際には一度に取り出せるアドレスは一つとなるように設定したいのですが、その場合だとfetchAllを使わない方がよいのでしょうか?
hintrarou

2015/07/08 09:46 編集

fetchAll()を使う場合はSQLにlimit 1をつけて、帰ってくる行に制限をかけるか、PDOの1行だけとってくるメソッドfetch()を使う方法が考えられます。 fetchの場合は$row['Email']で取り出せたと思うんですが、ご自分でvar_dump($row)を使って、どんな値が帰ってきてるのか確認しながら仕事を進めてください。
tok

2015/07/09 02:14

お返事ありがとうございます。 教えていただいた通り、fetch()関数と条件文whereで特定の行のみ取得することが出来ました。 そのままではメールが送れなかったので、 $mail ->to('Email','宛先テスト');を$mail ->to($row['Email'],'宛先テスト');に変更したところ無事メールが届きました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問