@R-n-D
web-программист

Как правильно прикрепить excel документ к письму через phpmail?

Доброго времени суток! Помогите решить проблему: мне нужно посредством php отправлять письмо с вложенным xlsx документом. Письмо отправляется, успешно приходит, но файл не открывается - пишет, что поврежден или имеет неизвестный формат.

Документ xlsx генируруется перед отправкой письма и сохраняется на сервере, в ручную открывается нормально. т.е. непосредственно в момент отправки что-то с ним происходит. Помогите понять, в чем причина! Надеюсь на вашу помощь!

$file = "/pay/downloads/".$FULLNAME_STUDENT." - ".$today.".xlsx";
	$testexcel = $_SERVER["DOCUMENT_ROOT"] . $file;

		$to      = 'мойемэйл@mail.ru';
		$subject = 'тема письма';
		$html = 'Это письмо сгенерировано автоматически, отвечать на него не нужно.';

		$message = $html;

send_mail($to, $subject, $message,  $testexcel, $realname);

function send_mail($to, $subject, $message, $path, $realname)
  {
    $fp = fopen($path,"r");
    if (!$fp)
    {
      print "Файл $path не может быть прочитан";
      exit();
    }
    $file = fread($fp, filesize($path));
    fclose($fp);

    $boundary = "--".md5(uniqid(time())); // генерируем разделитель
    $headers2 = "MIME-Version: 1.0\n"; 
	$headers2 .='From: support@sait.ru' . "\r\n" .
    $headers2 .="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
    $multipart .= "--$boundary\n"; 
    $kod = 'utf-8'; 
    $multipart .= "Content-Type: text/html; charset=$kod\n"; 
    $multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
    $multipart .= "$message\n\n";
    //Блок файла 1
    $message_part .= "--$boundary\n";
    $message_part .= "Content-Type: application/xls; name=\"".$realname."\"\n\n";
	  // $message_part .= "Content-Transfer-Encoding: base64\n";
    $message_part .= "Content-Disposition: attachment; filename = \"".$realname."\"\n\n";
    $message_part .= chunk_split(base64_encode($file))."\n";

 
    //Итоги
    $multipart .= $message_part."--$boundary--\n";
 
    if(!mail($to, $subject, $multipart, $headers2)){
      echo "К сожалению, письмо не отправлено";
      exit();
    }
  }
  • Вопрос задан
  • 1119 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
$message_part .= "Content-Type: application/xls; name=\"".$realname."\"\n\n";

Здесь второй перевод строки не лишний?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
akubintsev
@akubintsev
Опытный backend разработчик
Хорошо, что вы разобрались сейчас, но рекомендую упростить себе жизнь в дальнейшем вместе с SwiftMailer swiftmailer.org/docs/messages.html
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы