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関連記事 ...
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も置いておきます。
コメント