
phpで一括でメールが送れるsendgridを使って、DB上のメールテンプレートから本文を取得し、DB上のユーザーアドレス宛に一括でメールを送るfunction
もくじ
php関連記事

PHPのmb_send_mailでメール送信時に、はしご高「髙」やたつさき「﨑」など旧漢字や丸数字の日本語文字化け対策をする

MySQL/MariaDBのデータをPHP側で暗号化・復号する

phpで10進数と16進数、2進数、8進数の変換と0埋め表記

WordPressの条件分岐タグでページを判別する

PHPでpreg_splitの文字化けを回避しながらテキストを改行ごとに区切ってHTMLメールをつくる

WordPressテーマアップロード時に「辿ったリンクは期限が切れています。 もう一度お試しください。」と表示される

PHPで画像アップロード時に比率を保ったまま縮小する

phpで郵便番号を正規表現で3桁・ハイフン・4桁で出力するfunction

phpで電話番号のハイフンを正規表現で出力するfunction
管理画面のメールテンプレートからデータ取得
php
$MailTempSql = "テンプレート取得SQL"; $mail_id = 25; $params = [':mail_id' => $mail_id]; $mail_tem = $obj->select_para_sin($MailTempSql, $params); $subject = $mail_tem['subject']; $mail_contents = $mail_tem['body'] . $mail_tem['footer'];
メールテンプレートから件名・本文を取得します。
本文をHTMLメール形式に変換するfunction
php
function html_paragraph($str, $xhtml=true){
$arr = preg_split("/\R\R+/u", $str, -1, PREG_SPLIT_NO_EMPTY);
$result = "";
foreach($arr as $value){
$value = htmlspecialchars($value, ENT_QUOTES);
$result .= '<p>' . nl2br($value, $xhtml) . "</p>\n";
}
$pattern = '(https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)';
$replacement = '<a href="\1">\1</a>';
$result = mb_ereg_replace($pattern, $replacement, $result);
$result .= '<style type="text/css">
body {
font-family: "メイリオ","BatangChe","DotumChe","GungsuhChe","MingLiU","Courier","Consolas";
font-size: 15px;
}
</style>';
return $result;
}
取得した本文をHTMLメール形式に変換します。
preg_splitの文字化けについては、下記で解説しています。

PHPでpreg_splitの文字化けを回避しながらテキストを改行ごとに区切ってHTMLメールをつくる
PHPでPOSTデータのテキストを改行ごとに区切ってpタグでマークアップし、HTMLメールをつくります。途中ではまった、preg_splitの文字化けを回避する方法も。php関連記事テキストを改行ごとに区切って、pタグで囲むfunction...
sendgridの送信結果を確認するfunction
php
function user_sendgrid_send($rtn){
$rslt = "";
if($rtn == "202" || $rtn = "200"){
$rslt = "ok";
}elseif($rtn == "400"){
$rslt = "送信データが正しくありません。code:".$rtn;
}elseif($rtn == "401"){
$rslt = "アプリを利用する権限がありません。code:".$rtn;
}elseif($rtn == "413"){
$rslt = "送信データが大きすぎます。code:".$rtn;
}elseif($rtn == "429"){
$rslt = "月間送信数をオーバーしました。code:".$rtn;
}elseif($rtn == "403" || $rtn == "404" || $rtn == "405"){
$rslt = "ファイルに異常があります。code:".$rtn;
}elseif($rtn == "500"){
$rslt = "アプリ側でエラーが発生しました。code:".$rtn;
}elseif($rtn == "429"){
$rslt = "アプリ側の問題で利用ができません。code:".$rtn;
}
return $rslt;
}
sendgridでメールを送信した際の結果を判別するためのfunctionです。
sendgridでメール送信するfunction
php
$strSql = "該当ユーザー取得SQL";
$params = [':talk_flag' => $talk_flag];
$all_cnt = $obj->select_para($strSql, $params);
foreach ($all_cnt as $value) {
$tos[$value['mail']] = $value['name1'];
}
$replacement = [
'{{domein}}' => SITE_DOMEIN,
'{{sitename}}' => SITE_NAME,
'{{contact}}' => SITEMAP_CONTACT,
'{{mmt-name}}' => SITE_MANAGEMENT_NAME
];
$mail_contents = str_replace(array_keys($replacement), array_values($replacement), $mail_contents);
$contents = html_paragraph($mail_contents);
require './lib/sendgrid-php/sendgrid-php.php';
$email = new \SendGrid\Mail\Mail();
$email->setFrom("送信元メール", SITE_MANAGEMENT_NAME);
$email->addTo("送信先メール");
$email->addBccs($tos);
$email->setSubject($subject);
$email->addContent("text/html", $contents);
$email->addContent("text/plain", $mail_contents);
$sendgrid = new \SendGrid(SG_API_KEY);
try {
$response = $sendgrid->send($email);
$rtn = $response->statusCode();
$rslt = user_sendgrid_send($rtn);
} catch (Exception $e) {
$rslt = 'Caught exception: '. $e->getMessage(). "\n";
}
$tosにユーザーのメールアドレスを格納、
本文の可変部分の置換、
sendgridを呼び出し送信、
結果を確認し、完了の流れです。
phpで通常のメールを送信するfunction
php
function send_mail($mailTo, $subject, $mail_contents){
$send_name = "差出人";
$send_mail = 'no-reply@';
$returnMail = 'no-reply@';
mb_language('ja');
mb_internal_encoding('UTF-8');
//Fromヘッダーを作成
$header = 'From: ' . mb_encode_mimeheader($send_name). ' <' . $send_mail. '>';
return mb_send_mail($mailTo, $subject, $mail_contents, $header, '-f'. $returnMail);
}
通常のメールを送信するfunctionも置いておきます。


コメント