[英]PHP email sending with pdf attachment
Trying to send an email with pdf attachment, tried using swiftmailer and that did not work, this code worked with a zip but not PDF :( 尝试发送带有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 );
Mails gets sent fine and I get the mail: but the attachment is not there and in the meial has all the base64 encoded in the email like: 邮件发送得很好,我也收到了邮件:但是附件不存在,并且在邮件中,所有的base64都编码在电子邮件中,例如:
ontent-Type: application/octet-stream; ontent-Type:应用程序/八位字节流; name="media.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment;
name =“ media.pdf” Content-Transfer-Encoding:base64 Content-Disposition:附件; filename="media.pdf" JVBERi0xLjMKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZwovT3V0bGluZXMgMiAwIFIKL1BhZ2Vz IDMgMCBSID4+CmVuZG9iagoyIDAgb2JqCjw8IC9UeXBlIC9PdXRsaW5lcyAvQ291bnQgMCA+Pgpl bmRvYmoKMyAwIG9iago8PCAvVHlwZSAvUGFnZXMKL0tpZHMgWzYgMCBSCjE2IDAgUgpdCi9Db3Vu dCAyCi9SZXNvdXJjZXMgPDwKL1Byb2NTZXQgNCAwIFIKL0ZvbnQgPDwgCi9GMSA4IDAgUgovRjIg OSAwIFIKPj4KL1hPYmplY3QgPDwgCi9JMSAxMiAwIFIKL0kyIDE1IDAgUgovSTMgMjAgMCBSCi9J NCAyMyAwIFIKPj4KPj4KL01lZGlhQm94IFswLjAwMCAwLjAwMCA2MTIuMDAwIDc5Mi4wMDBdCiA+ PgplbmRvYmoKNCAwIG9iagpbL1BERiAvVGV4dCAvSW1hZ2VDIF0KZW5kb2JqCjUgMCBvYmoKPDwK L0NyZWF0b3IgKERPTVBERikKL0NyZWF0aW9uRGF0ZSAoRDoyMDEzMDgyMzAyMDA0NCswMCcwMCcp Ci9Nb2REYXRlIChEOjIwMTMwODIzMDIwMDQ0KzAwJzAwJykKPj4KZW5kb2JqCjYgMCBvYmoKPDwg L1R5cGUgL1BhZ2UKL1BhcmVudCAzIDAgUgovQW5ub3RzIFsgMTAgMCBSIDEzIDAgUiBdCi9Db250 ZW50cyA3IDAgUgo+PgplbmRvYmoKNyAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZQovTGVu Z3RoIDI3OCA+PgpzdHJlYW0KeJyFkb1Ow0AQhHs/xZRQsNm9/2tRAnJEA1wXpUBJSIOFIAWvz9ox FwMKyNLJmtuZb3evYWJmTM/3fXNdYJIljhbRGnIxoWwxuzEQT4zyDKw
文件名= “media.pdf” JVBERi0xLjMKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZwovT3V0bGluZXMgMiAwIFIKL1BhZ2Vz IDMgMCBSID4 + CmVuZG9iagoyIDAgb2JqCjw8IC9UeXBlIC9PdXRsaW5lcyAvQ291bnQgMCA + PGPL bmRvYmoKMyAwIG9iago8PCAvVHlwZSAvUGFnZXMKL0tpZHMgWzYgMCBSCjE2IDAgUgpdCi9Db3Vu dCAyCi9SZXNvdXJjZXMgPDwKL1Byb2NTZXQgNCAwIFIKL0ZvbnQgPDwgCi9GMSA4IDAgUgovRjIg OSAwIFIKPj4KL1hPYmplY3QgPDwgCi9JMSAxMiAwIFIKL0kyIDE1IDAgUgovSTMgMjAgMCBSCi9J NCAyMyAwIFIKPj4KPj4KL01lZGlhQm94IFswLjAwMCAwLjAwMCA2MTIuMDAwIDc5Mi4wMDBdCiA + PgplbmRvYmoKNCAwIG9iagpbL1BERiAvVGV4dCAvSW1hZ2VDIF0KZW5kb2JqCjUgMCBvYmoKPDwK L0NyZWF0b3IgKERPTVBERikKL0NyZWF0aW9uRGF0ZSAoRDoyMDEzMDgyMzAyMDA0NCswMCcwMCcp Ci9Nb2REYXRlIChEOjIwMTMwODIzMDIwMDQ0KzAwJzAwJykKPj4KZW5kb2JqCjYgMCBvYmoKPDwg L1R5cGUgL1BhZ2UKL1BhcmVudCAzIDAgUgovQW5ub3RzIFsgMTAgMCBSIDEzIDAgUiBdCi9Db250 ZW50cyA3IDAgUgo + PgplbmRvYmoKNyAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZQovTGVu Z3RoIDI3OCA + PgpzdHJlYW0KeJyFkb1Ow0AQhHs / xZRQsNm9 / 2tRAnJEA1wXpUBJSIOFIAWvz9ox FwMKyNLJmtuZb3evYWJmTM / 3fXNdYJIljhbRGnIxoWwxuzEQT4zyDKw uSlvuFpdrlCUWpfmd83Cr YvT4AGOJFbDWn21Tg00mYYsO1iTKJlXlBY/fnYaMH90uE0tAZNVSVrMPhnJyVfnL3NcGzkNtCG50
uSlvuFpdrlCUWpfmd83Cr YvT4AGOJFbDWn21Tg00mYYsO1iTKJlXlBY / fnYaMH90uE0tAZNVSVrMPhnJyVfnL3NcGzkNtCG50
Based on the partial message ( ontent-Type: ...
), I'm guessing that the output buffer filled up and was automatically flushed, leaving only the output after the flush to be assigned to $message
. 基于部分消息(
ontent-Type: ...
),我猜测输出缓冲区已满并被自动刷新,仅在刷新后将输出分配给$message
。
There are also two extra blank lines between --PHP-mixed-<?php echo $random_hash; ?>
--PHP-mixed-<?php echo $random_hash; ?>
之间还有两个额外的空行--PHP-mixed-<?php echo $random_hash; ?>
--PHP-mixed-<?php echo $random_hash; ?>
and Content-Type: application/octet-stream; ...
--PHP-mixed-<?php echo $random_hash; ?>
和Content-Type: application/octet-stream; ...
Content-Type: application/octet-stream; ...
which could cause trouble. Content-Type: application/octet-stream; ...
可能会造成麻烦。
Relying on output buffering to construct a string is both error prone and completely unnecessary. 依靠输出缓冲来构造字符串既容易出错,也完全没有必要。 It is much better to use PHP's HEREDOC syntax instead:
这是更好的使用PHP的定界符来代替:
$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 );
Note that the line endings in a mail must be CRLF (eg. \\r\\n). 请注意,邮件中的行结尾必须为CRLF(例如\\ r \\ n)。 If the above doesn't work, you may have to construct a string with explicit line endings:
如果上述方法不起作用,则可能必须构造一个带有显式行尾的字符串:
$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";
See PHP's mail() manual page for some further details. 有关更多详细信息,请参见PHP的mail()手册页 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.