PHP Mail xlsx-файл, созданный с PHPExcel в качестве вложения - PullRequest
1 голос
/ 06 февраля 2012

Поэтому я пытаюсь сгенерировать и сохранить Excel-файл на сервере. Это работает безупречно с PHPExcel. Следующий шаг - прочитать файл, отправить его по электронной почте как вложение и затем удалить его.

По какой-то причине PHP не распознает xlsx как правильный файл:

/* excel is generated before here */
$filename = "/results/excel/export-" . $today . ".xlsx";
$writer = new PHPExcel_Writer_Excel2007($exc);
$writer->save($filename);
/* so far so good; the file is created and exists on the server */

$to = "someone@domain.com";
$sendermail = "no-reply@domain.com";
$from = "Sender <" . $sendermail . ">";
$subject = "Email with attachment";
$message = "Here you go";
$file = $filename;

$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

$headers = "From: $from";
$headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"        {$mime_boundary}\""; 

$message = "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n";

if(is_file($file)) {
    $message .= "--{$mime_boundary}\n";
    $fp = @fopen($file, "rb");
    $data = @fread($fp, filesize($file));
    @fclose($fp);
    $data = chunk_split(base64_encode($data));
    $message .= "Content-Type: application/octet-stream; name=\"" . basename($file). ";\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";

    $message .= "--{$mime_boundary}--";
    $returnpath = "-f" . $sendermail;

    mail($to, $subject, $message, $headers, $returnpath);
} else {
    echo("This is not a file: " . $file);
}

Что всегда дает мне «Это не файл ...». Как мне прочитать XLSX-файл?

Ответы [ 3 ]

1 голос
/ 27 февраля 2013

Вот подсказка для запроса Excel и отправки файла в виде вложения без сохранения файла на сервере:

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

$data = ob_get_contents();

$sendmail=new ExcelMail($data); //this is your mail class; if you use zend mail use addattachement($data); and Zend_Mime
0 голосов
/ 27 апреля 2012

Хорошо, я узнал, что это было.$ filename на самом деле была прямой (http: // ...) ссылкой на файл, а не относительной ссылкой.Изменил это, чтобы быть относительным, и это работало:).

0 голосов
/ 06 февраля 2012

Выводимое сообщение означает, что is_file() не удалось. Это может произойти по ряду причин, но, насколько я знаю, не потому, что формат файла. Поэтому я бы порекомендовал изучить следующие вещи:

  1. Файл действительно есть? Вы говорите, что файл сохранен, но вы должны убедиться, что он действительно есть.

  2. Правильный ли путь к файлу xslx?

  3. Является ли путь к файлу xslx к самому файлу xml, а не к символической ссылке на него?

  4. Установлены ли права доступа к файлу xslx, чтобы разрешить доступ к ним сценарию php?

Я полагаю, что это одна из тех проблем ...

...