Создание файла excel, а затем отправка в виде вложения с помощью phpmailer

Я просмотрел несколько документов по этому вопросу и применил эти шаги, но пока напрасно. Я написал код для файла excel, но хочу получить его содержимое в том же файле и использовать его как вложение файла excel с помощью функции PHPMailer.

Ниже приведен код, который я использую после создания файла Excel:

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 
$objWriter->save('php://output');

$data = ob_get_contents();

$email->SetFrom('[email protected]', 'Talal Haider'); //Name is optional
$email->Subject   = 'Test Mail';
$email->Body      = 'Simple Test Email';
$email->AddAddress( '[email protected]' );
//$email->AddAddress( '[email protected]' );

$email->AddAttachment($data, 'Inspection_Report.xls' );

if($email->Send()){
    echo "Mail Sent";
} else{
    echo "Mail Failed";
}

Пожалуйста, направьте меня в правильном направлении. Большое спасибо


person Dev    schedule 05.09.2018    source источник
comment
Я объяснил это с помощью файла xlsx и SwiftMailer в ответе   -  person tCot    schedule 07.05.2020


Ответы (1)


Это проблема буферизации вывода, а не проблема электронной почты. Вы делаете это:

$objWriter->save('php://output');
$data = ob_get_contents();

Это говорит: «вывести сгенерированный файл Excel непосредственно в браузер», а затем «получить содержимое выходного буфера». Но к тому времени, когда произойдет второй шаг, будет уже слишком поздно, так как файл уже отправлен в браузер, и поэтому вы его видите.

Если вы собираетесь использовать буферизацию вывода, вам нужно указать PHP начать захват вывода до вывода чего-либо. Это описано в документации по PHP для этой функции — это должно быть первое место, где вы должны искать подобные вопросы. Измените свой код на это:

ob_start();
$objWriter->save('php://output');
$data = ob_get_contents();
ob_end_clean();

Теперь, когда у вас есть данные Excel в виде строки, вы можете передать их в PHPMailer. В вашем коде вы использовали неправильную функцию для этого. addAttachment ожидает, что первым параметром будет путь к файлу, как в документации сказано, но вы передаете ему содержимое файла, что не сработает. Вам нужен метод addStringAttachment(), который очень похож, но ожидает двоичные данные в качестве первого параметра, например:

$email->addStringAttachment($data, 'Inspection_Report.xls');

Я также хотел бы отметить, что вы используете phpExcel, который устарел и больше не поддерживается; он был заменен на phpSpreadsheet.

Урок, который следует усвоить, заключается в том, что чтение документации намного быстрее, чем написание подобного вопроса и ожидание ответа на него.

person Synchro    schedule 05.09.2018
comment
Большое спасибо за ваши рекомендации и советы. Я обязательно буду действовать в соответствии с этим с этого момента. Я использовал ob_start(), но мой метод AddAttachment оказался неправильным. - person Dev; 05.09.2018
comment
вы должны добавить ob_end_clean(), чтобы получить чистый вывод php-скрипта, а не получить xls - person Blaztix; 16.04.2019