メール送信の準備
まずcomposerでPDFを導入する
composer require tecnickcom/tcpdf
mail.phpを作成
mail.php
$smtpConfig = [
'host' => 'mailtrapなどの受信ホスト名',
'username' => 'ユーザー名',
'password' => 'パスワード',
];
//sendMail関数 メール送信
function sendmail($email, $subject, $message,$pdf_output=null) {
global $mail,$smtpConfig;
require_once '../vendor/autoload.php';
$mail = new PHPMailer\PHPMailer\PHPMailer();
$mail->setFrom('from@example.com', 'Mailer');
//$mail->clearAddresses();
$mail->addAddress($email);
$mail->isHTML(true);
$mail->Subject = $subject;
$mail->Body = $message;
$mail->isSMTP();
$mail->Host = $smtpConfig['host'];
$mail->SMTPAuth = true;
$mail->Username = $smtpConfig['username'];
$mail->Password = $smtpConfig['password'];
$mail->SMTPSecure = 'tls';
//25 or 465 or 587 or 2525
$mail->Port = 587;
//文字化け対策
$mail->CharSet = 'UTF-8';
// PDFを添付
if ($pdf_output) {
$mail->addStringAttachment($pdf_output, '商品情報.pdf', 'base64', 'application/pdf');
}
// メール送信とエラーハンドリング
if (!$mail->send()) {
// 送信に失敗した場合のエラーメッセージ
error_log("Mailer Error: " . $mail->ErrorInfo);
return false;
}
return true;
}
メール送信部分を作成
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$order_nums = isset($_POST['order_num']) ? $_POST['order_num'] : null;
$order_codes = isset($_POST['order_code']) ? $_POST['order_code'] : null;
$order_items = isset($_POST['order_item']) ? $_POST['order_item'] : null;
$order_makers = isset($_POST['order_maker']) ? $_POST['order_maker'] : null;
$order_shops = isset($_POST['order_shop']) ? $_POST['order_shop'] : null;
$_SESSION['nums'] = $order_nums;
$_SESSION['items'] = $order_items;
$_SESSION['codes'] = $order_codes;
$_SESSION['makers'] = $order_makers;
$_SESSION['shops'] = $order_shops;
}
//バリデーション
$errors = [];
//確認画面日付
date_default_timezone_set('Asia/Tokyo');
$date = date("Y-m-d H:i");
if(empty($_POST['order_num'])){
$errors[] = "数量を入力してください";
}
//発注承認確定 メール送信
if(isset($_POST['submit'])){
//注文表示
$orderIndex = $_POST['order_index'] ?? null; // Undefined index エラーを防ぐ
$orderInfo = json_decode($_POST['order_info'] ?? '', true); // Undefined index エラーを防ぐ
$order_nums = $_POST['order_nums'] ?? null; // Undefined index エラーを防ぐ
//メール送信 PDF
//ここから
$numArray = isset($_POST['o_num'])?$_POST['o_num']:null;
$itemArray = isset($_POST['o_item'])?$_POST['o_item']:null;
$makerArray = isset($_POST['o_maker'])?$_POST['o_maker']:null;
$codeArray = isset($_POST['o_code'])?$_POST['o_code']:[];
$products = [];
if($numArray !== null && $codeArray !== null && !empty($codeArray)){
try{
$dbh->beginTransaction();
$mail_id = uniqid(rand(), true);
for($i = 0; $i < count($numArray); $i++){
$num = $numArray[$i];
$item = $itemArray[$i];
$maker = $makerArray[$i];
$code = $codeArray[$i];
$code_sql = "SELECT code FROM stock_input WHERE item = :item";
$code_stmt = $dbh->prepare($code_sql);
$code_stmt->execute([':item' => $item]);
$code_result = $code_stmt->fetch(PDO::FETCH_ASSOC);
$code = $code_result?$code_result['code']:null;
if($code === null){
echo '商品コードが見つかりませんでした:'.$item;
continue;
}
//商品情報を配列に追加
$products[] = [
'code' => $code,
'maker' => $maker,
'item' => $item,
'num' => $num,
'mail_id' => $mail_id,
];
}
//発注番号生成
function generateOrderNumber() {
$datePart = date('Ymd');
$randomPart = str_pad(rand(0, 9999), 4, '0', STR_PAD_LEFT);
return $datePart . '-' . $randomPart;
}
//発注完了のメールを管理者に商品情報をまとめて送信
if(!empty($products)){
ob_start(); // 出力バッファリングを開始
//日本時間に設定
date_default_timezone_set('Asia/Tokyo');
$date = date("Y-m-d H:i");
//発注番号の生成をインスタンス化
$orderNumber = generateOrderNumber();
//shop_idから検索して表示に変える
$shop = $shop_name;
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->AddPage();
$pdf->SetFont('cid0jp', '', 12);
$message = "添付された発注書PDFをご確認ください。";
// タイトル
$pdf->SetFont('cid0jp', '', 16);
$pdf->Cell(0, 10, '発注書', 1, 1, 'C', 0);
// 相手社名、日付、店舗名を横並びに表示
$pdf->SetFont('cid0jp', '', 12);
$pdf->Cell(90, 13, $maker.' 御中', 0, 0, 'L');
$pdf->Ln(); // 新しい行に移動
// 発注番号の追加
$pdf->Cell(90, 13, '発注番号: ' . $orderNumber, 0, 0, 'L');
//右揃え縦並び
// '株式会社'
$pdf->SetX(-60); // ページの右端から60ユニットの位置にXをセット
$pdf->Cell(50, 8, '株式会社', 0, 1, 'R'); // 'R'は右寄せを意味します
// '日付: '.$date
$pdf->SetX(-60); // ページの右端から60ユニットの位置にXをセット
$pdf->Cell(50, 8, '日付: '.$date, 0, 1, 'R');
// '店舗名: '.$shop
$pdf->SetX(-60); // ページの右端から60ユニットの位置にXをセット
$pdf->Cell(50, 8, '店舗名: '.$shop, 0, 1, 'R');
// ヘッダー行
$pdf->SetFillColor(192, 192, 192);
$pdf->SetTextColor(0, 0, 0);
$pdf->Cell(40, 16, '商品コード', 1, 0, 'C', 1); // 商品コードのセル幅を調整
$pdf->Cell(40, 16, 'メーカー', 1, 0, 'C', 1); // メーカーのセル幅を調整
$pdf->Cell(70, 16, '商品名', 1, 0, 'C', 1); // 商品名のセル幅を調整
$pdf->Cell(40, 16, 'ロット数量', 1, 1, 'C', 1);
$pdf->SetTextColor(0, 0, 0);
$pdf->SetFont('cid0jp', '', 10); // 商品名のフォントサイズを小さく
// 商品データ
foreach ($products as $product) {
$pdf->Cell(40, 16, $product['code'], 1, 0, 'C'); // 商品コードのセル幅を調整
$pdf->Cell(40, 16, $product['maker'], 1, 0, 'C'); // メーカーのセル幅を調整
// MultiCellで自動改行
$x = $pdf->GetX();
$y = $pdf->GetY();
$pdf->MultiCell(70, 16, $product['item'], 1); // 商品名のセル幅を調整
$pdf->SetXY($x + 70, $y); // SetXYのX座標を調整
$pdf->Cell(40, 16, $product['num'], 1, 1, 'C');
}
// PDFを出力
$pdf_output = $pdf->Output('商品.pdf', 'S');
//PDFを文字列として取得
//$pdf_output = $pdf->Output('', 'S');
$subject = "発注書通知";
//送信元メールの表示 追加
//$user_id = ;
//$e_sql = "SELECT mail FROM users WHERE user_id = :user_id";
//$stmt->prepare($e_sql);
//$stmt->execute([':user_id' => $user_id]);
//$e_result = $stmt->fetch(PDO::FETCH_ASSOC);
//$adminEmail = $e_result['email'];
$adminEmail = "test@example.com";
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";
if(sendmail($adminEmail,$subject,$message,$pdf_output,$headers)){
echo "メールが送信されました。";
}else{
echo "メール送信中にエラーが発生しました。";
}
}
$dbh->commit();
header('Location:comple.php');
exit;
} catch(PDOException $e){
echo 'クエリの実行に失敗。エラー内容: ', $e->getMessage();
$dbh->rollBack();
}catch(Exception $e){
echo '一般的なエラーが発生しました。エラー内容: ', $e->getMessage();
}
}
}