1

尝试发送带有 pdf 附件的电子邮件,尝试使用 swiftmailer,但没有成功,此代码适用于 zip,但不适用于 PDF :(

$attachment = chunk_split(base64_encode(file_get_contents($filename)));
ob_start(); //Turn on output buffering 
?> 
--PHP-mixed-<?php echo $random_hash; ?>  
Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>" 

--PHP-alt-<?php echo $random_hash; ?>  
Content-Type: text/html; charset="iso-8859-1" 
Content-Transfer-Encoding: 7bit

<?php echo $message."<br /><br />";
?>

--PHP-alt-<?php echo $random_hash; ?>-- 

--PHP-mixed-<?php echo $random_hash; ?> 


Content-Type: application/octet-stream; name="<?php echo $filename?>"  
Content-Transfer-Encoding: base64  
Content-Disposition: attachment; filename="<?php echo $filename?>" 

<?php echo $attachment; ?> 
--PHP-mixed-<?php echo $random_hash; ?>-- 

<?php 
//copy current buffer contents into $message variable and delete current output buffer 
$message = ob_get_clean(); 
//send the email 
$mail_sent = @mail( $to, $subject, $message, $headers ); 

邮件发送正常,我收到邮件:但附件不存在,并且在邮件中包含电子邮件中的所有 base64 编码,例如:

内容类型:应用程序/八位字节流;name="media.pdf" 内容传输编码:base64 内容处置:附件;文件名="媒体.pdf"

4

1 回答 1

0

根据部分消息(ontent-Type: ...),我猜测输出缓冲区已填满并被自动刷新,只留下刷新的输出分配$message

和之间还有两个额外的空行--PHP-mixed-<?php echo $random_hash; ?>Content-Type: application/octet-stream; ...这可能会导致麻烦。

依靠输出缓冲来构造字符串既容易出错,也完全没有必要。改用 PHP 的HEREDOC 语法好得多

  $message = <<<MSG
--PHP-mixed-$random_hash
Content-Type: multipart/alternative; boundary="PHP-alt-$random_hash"

--PHP-alt-$random_hash
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

$message<br /><br />


--PHP-alt-$random_hash--

--PHP-mixed-$random_hash
Content-Type: application/octet-stream; name="$filename"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="$filename"

$attachment;
--PHP-mixed-$random_hash--

MSG;

$mail_sent = @mail( $to, $subject, $message, $headers );

请注意,邮件中的行尾必须是 CRLF(例如 \r\n)。如果上述方法不起作用,您可能必须构造一个带有显式行尾的字符串:

$message = "--PHP-mixed-$random_hash\r\n"
         . "Content-Type: multipart/alternative; boundary=\"PHP-alt-$random_hash\"\r\n"
         . "\r\n"
         /* ... */
         . $attachment
         . "\r\n--PHP-mixed-$random_hash--"
         . "\r\n";

有关更多详细信息,请参阅 PHP 的mail() 手册页

于 2014-08-16T15:23:55.283 回答