メール送信の準備

まず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();
                }


                
                

            }
  
}