Создание файла Excel, а затем отправка в виде вложения с помощью phpmailer - PullRequest
0 голосов
/ 05 сентября 2018

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

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

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

$data = ob_get_contents();

$email->SetFrom('sample@gmail.com', 'Talal Haider'); //Name is optional
$email->Subject   = 'Test Mail';
$email->Body      = 'Simple Test Email';
$email->AddAddress( 'sample@gmail.com' );
//$email->AddAddress( 'rimsha.cheema@gmail.com' );

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

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

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

1 Ответ

0 голосов
/ 05 сентября 2018

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

$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 .

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

...