Отправка данных MySQL по электронной почте в виде файла CSV - PullRequest
0 голосов
/ 01 октября 2018

У меня есть следующий фрагмент кода, который отлично работает, за исключением одной ошибки, которую я не могу устранить.

Здесь происходит две вещи, одна из которых преобразует данные mySQL в CSV и отправляет электронное письмо конкретному пользователю (работает нормально) и при успехе / неудаче повторяет сообщение.(где ошибка).

Когда я запускаю это, создается электронное письмо с нужной информацией, но я также вижу, что эхо-сообщения каждый раз загружаются в файл CSV.

Подскажите, пожалуйста, как я могу убедиться, что эхо-сообщения не загружаются в виде файлов CSV?

Вот код:

if(isset($_POST['sendmail'])) {
    $emailtosend = $_POST['emailadd'];
    $conn = mysqli_connect('localhost','root','','sample');
    header ('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename=data.csv');
    $filename = 'data.csv';
    $output = fopen($filename, 'w');
    fputcsv($output, array('ID','Product name','Product code', 'Unit price', 'Inventory')); // 
    $query = "SELECT * from products";
    $result = mysqli_query($conn, $query);
    while($row = mysqli_fetch_assoc($result)) {
        fputcsv($output, $row);
    }

    require 'PHPMailerAutoload.php';

    $mail = new PHPMailer;

    $mail->isSMTP();                                      
    $mail->Host = 'smtp.gmail.com';  
    $mail->SMTPAuth = true;
    $mail->Username = 'someone@gmail.com';                 
    $mail->Password = 'password';                           
    $mail->SMTPSecure = 'tls';                            
    $mail->Port = 587;                                    

    $mail->setFrom('one_other@gmail.com', 'Mailer');
    $mail->addAddress($emailtosend, 'Joe User');    
    $mail->addReplyTo('info@example.com', 'Information');
    $mail->addAttachment($filename);
    $mail->isHTML(true);                                
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    if(!$mail->send()) {
        echo 'Message could not be sent.  Mailer Error: ' . $mail->ErrorInfo;
    } else {
        echo 'Message has been sent';
    }
    fclose($output);
}

Первый раз, когда вы попробуете этои цените ваши мысли!

РЕДАКТИРОВАТЬ

Изменение $filename = 'data.csv'; на $filename = tempnam('/tmp', 'data_').'.csv';, как выделено @ johannes

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Добавьте строку, которая отправляет заголовок для уточнения содержания:

header("Content-Type: text/html; charset=utf-8");
0 голосов
/ 01 октября 2018

Вы должны использовать fclose () после цикла while данных csv.

...