我正在使用 fputcsv() 创建一个 .csv 文件,我想在 PHPMailer 中使用 AddAttachment() 来自动发送它

I'm creating a .csv file using fputcsv() and I would like to use AddAttachment() in PHPMailer to send it off automatically

我已经编辑了原文 post,希望这更切题。我想删除由 fputcsv() 创建的 .csv 文件并将其放入 AddAttachment 并发送。或者,如果您知道如何获取创建的 .csv 文件并将其发送到服务器上的目录,那也很好。我认为最直接的问题是如何获取 fputcsv() 的结果并将其放入 AddAttachments?我使用临时文件吗?

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="file.csv"');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');

        $csvoutput = fopen('php://output', 'w');
        $row = getRow($result3);
        $headers = array_keys($row);
        fputcsv($csvoutput, $headers);
            
               while ($row = getRow($result3)) {
    
                    fputcsv($csvoutput, $row);
    
                }

$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host       = "smtp.website.com";
$mail->Port       = 587;
$mail->SMTPAuth   = true;
$mail->SMTPSecure = "tls";
$mail->Username   = $email_user;
$mail->Password   = $email_pass;
$mail->SetFrom("example@example.com", "Ex");
$mail->AddAddress("example@example.com", "Ex");
$mail->isHTML(true);
$mail->WordWrap = 50;
$mail->Subject    = "Example";
$mail->Body       = "Example";
$result = $mail->Send();



fclose($csvoutput);
exit;

如果我不将其下载到页面,是否需要 headers()?

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="file.csv"');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');

此外,我知道这需要更改:

$csvoutput = fopen('php://output', 'w');

请尽可能详细,我不熟悉使用文件,我找不到专门的教程。

如果您想要合并所有三段代码并使用 PHP 邮件发送附件,您可以使用以下代码:

if ($db->connect_error) {
    $error = $db->connect_error;
} else {
    $sql = "SELECT pick_city, pick_state, delivery_city, delivery_state, trailer_type, pick_date, load_type, length, weight, offering, special_instructions, contact_name, contact_phone FROM exampleTable WHERE urgency <> 'Booked' AND urgency <> 'Quote' AND urgency <> 'Hold'";
    $result3 = $db->query($sql);
    if ($db->error) {
        $error = $db->error;
    }
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment;filename=filename.csv');
    header('Cache-Control: no-cache, no-store, must-revalidate');
    header('Pragma: no-cache');
    header('Expires: 0');
    $csvoutput = fopen('php://output', 'w');
    $row = getRow($result3);
    $headers = array_keys($row);
    fputcsv($csvoutput, $headers);
    fputcsv($csvoutput, $row);
    while ($row = getRow($result3)) {
        fputcsv($csvoutput, $row);
    }
    if (!empty($_POST['submit_email'])){
        $message = $_POST['email'];
        $active_unique = $_POST['active_unique'];
        $hid_id = $_POST['hid_id'];
        $hid_email = $_POST['hid_email'];

        $mail = new PHPMailer();
        $mail->IsSMTP();
        $mail->Host       = "smtp.website.com";
        $mail->Port       = 587;
        $mail->SMTPAuth   = true;
        $mail->SMTPSecure = "tls";
        $mail->Username   = $email_user;
        $mail->Password   = $email_pass;
        $mail->SetFrom($email_user, ucfirst($company) . " Quote System");
        $mail->AddReplyTo($userEmail, $userSesh);
        $mail->AddAddress("example@example.com", "Name");
        $mail->AddBCC("example@example.com", "Name");
        $mail->AddStringAttachment(file_get_contents('php://output'));
        $mail->isHTML(true);
        $mail->WordWrap = 50;
        $mail->Subject    = "Please Review the Following Load";
        $mail->Body       = $message;

        $result = $mail->Send();
    }
    function getRow($result3) {
        return $result3->fetch_assoc();
    }
}

如果您只需要添加附件,请更改:

$mail->AddAttachment( *I want to drop in the csv file* );

至:

$mail->AddStringAttachment(file_get_contents('php://output'));

您无法从 php://输出中读回。将 CSV 保存到临时文件:

$filename = tempnam(sys_get_temp_dir(), 'my_script_');
$csvoutput = fopen($filename, 'w');

然后在 AddAttachment() 调用中引用该文件的路径:

$mail->addAttachment($filename);
unlink($filename);

或者,如果您不想弄乱临时文件,可以使用输出缓冲来捕获标准输出。 (因为 fputcsv() 不能直接输出到字符串。)

ob_start();
$fp = fopen('php://output', 'w');
while (...) {
    fputcsv(...);
}
fclose($fp);
$csv_string = ob_get_contents();
ob_end_clean();

$mail->addStringAttachment($csv_string,"file_name.csv");

更新:

你可能正在做这样的事情:

$filename = tempnam(sys_get_temp_dir(), 'my_script.csv');

这给了你 /tmp/my_script.csvPFj1Lw

您想做这样的事情:

$filename = tempnam(sys_get_temp_dir(), 'my_script_') . '.csv';

这给了你 /tmp/my_script_H5GVJp.csv

你想要随机字符的原因是为了避免在你同时拥有多个脚本实例时发生冲突运行。