phpで一括メールが送れるsendgridを使ってテンプレートからメールを作るfunction

プロモーションが含まれています

phpで一括メールが送れるsendgridを使ってテンプレートからメールを作るfunction

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

php関連記事

関連記事をもっとみる

管理画面のメールテンプレートからデータ取得

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). ' &lt;' . $send_mail. '&gt;';

  return mb_send_mail($mailTo, $subject, $mail_contents, $header, '-f'. $returnMail);
}

通常のメールを送信するfunctionも置いておきます。

コメント

タイトルとURLをコピーしました