Adr*_*ian 5 php email opencart
我正在尝试从 Opencart 发送带有附件的 HTML 电子邮件。有一个内置函数$mail->addAttachment。一切都很好,除了 Apple Mail 中附件的位置有一个白框。在 iOS 邮件应用程序中,附件根本不显示。在 GMail 上没问题:
该附件在 Apple Mail 中也可用,因为如果我双击白色区域,附件就会打开。
这是消息的来源,在 GMail 中打开(我删除了 X 标头):
X-Mailer: PHP/5.4.39-0+deb7u2
Content-Type: multipart/related; boundary="----=_NextPart_fefb9509ef8523a96a17066ecf8472c8"
------=_NextPart_fefb9509ef8523a96a17066ecf8472c8
Content-Type: multipart/alternative; boundary="----=_NextPart_fefb9509ef8523a96a17066ecf8472c8_alt"
------=_NextPart_fefb9509ef8523a96a17066ecf8472c8_alt
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 8bit
Some text (text/plain)
------=_NextPart_fefb9509ef8523a96a17066ecf8472c8_alt
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: 8bit
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test title</title>
</head>
<body>
<p>Some html text(text/html)</p>
</body>
</html>
------=_NextPart_fefb9509ef8523a96a17066ecf8472c8_alt--
------=_NextPart_fefb9509ef8523a96a17066ecf8472c8
Content-Type: application/pdf; name="form.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="form.pdf"
Content-ID <%2Fhome%2Fhtml%2Fdownload%2form.pdf>
X-Attachment-Id: %2Fhome%2Fhtml%2Fdownload%2form.pdf
JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmlsdGVyIC9G
bGF0ZURlY29kZSA+PgpzdHJlYW0KeAGdW0tzHLcRvs+vQGInGbqk0bwfuTl2qqKkbMkRk1Q58mFJ
jkJylzvS7pIu8Q/o5oMuLlfpmB+Un5SvHwDmtdylSyXNAgM0uhuN7q8bo3fmO/POxPhTNIWp89Rs
WvMvszbPvtom5nxrEv6zPccIenvjxq34V2xWPHsVXJo3TCtLoiYr49ykdZQVpsjqqKqqxlR1GWWW
+jtQpUUTk5WmKjNzfmP+dGr+fAoStHKAlel9bLCyH1ympspqHRxHcRwn5vTcJDkP1cfpjXl2ekp8
...
------=_NextPart_fefb9509ef8523a96a17066ecf8472c8--
Run Code Online (Sandbox Code Playgroud)
/system/library/mail.php 的相关部分:
foreach ($this->attachments as $attachment) {
if (file_exists($attachment)) {
$handle = fopen($attachment, 'r');
$content = fread($handle, filesize($attachment));
fclose($handle);
$message .= '--' . $boundary . $this->newline;
$message .= 'Content-Type: application/pdf; name="' . basename($attachment) . '"' . $this->newline;
$message .= 'Content-Transfer-Encoding: base64' . $this->newline;
$message .= 'Content-Disposition: attachment; filename="' . basename($attachment) . '"' . $this->newline;
$message .= 'Content-ID: <' . basename(urlencode($attachment)) . '>' . $this->newline;
$message .= 'X-Attachment-Id: ' . basename(urlencode($attachment)) . $this->newline . $this->newline;
$message .= chunk_split(base64_encode($content));
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我刚刚意识到 Content-ID 和 X-Attachment-Id 是问题所在:
basename(urlencode($attachment)
Run Code Online (Sandbox Code Playgroud)
应该:
urlencode(basename($attachment))
Run Code Online (Sandbox Code Playgroud)
现在在 Apple Mail 中工作正常,但在 iOS (iPhone/iPad) 上附件仍然丢失。任何想法?
标题必须是这样的:
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary=boundary42
Run Code Online (Sandbox Code Playgroud)
在大多数情况下发现缺少 mime 版本标签。您的边界有错误,让我首先给出多部分实体的规则主体的语法(仅重要部分):
Run Code Online (Sandbox Code Playgroud)multipart-body := [preamble CRLF] dash-boundary transport-padding CRLF body-part *encapsulation close-delimiter transport-padding [CRLF epilogue] dash-boundary := "--" boundary encapsulation := delimiter transport-padding CRLF body-part delimiter := CRLF dash-boundary close-delimiter := delimiter "--"
--对于消息中使用的每个边界,前面是强制性的,而对于结束边界( close-delimiter ),后面是--强制性的。boundary因此,具有三个主体部分作为边界的多部分主体可以如下所示:
--boundary42
Content-Type: text/plain; charset=us-ascii
...plain text version of message goes here....
--boundary42
Content-Type: text/richtext
.... richtext version of same message goes here ...
--boundary42
Content-Type: text/x-whatever
.... fanciest formatted version of same message goes here...
--boundary42--
Run Code Online (Sandbox Code Playgroud)
阅读 RFC 文档