Это проблема буферизации вывода, а не проблема электронной почты. Вы делаете это:
$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 .
Урок, который необходимо усвоить, заключается в том, что чтение документов намного быстрее, чем написание такого вопроса, и ожидание, когда кто-то ответит на него.