使用utf-8文件名发送MIME编码的电子邮件附件

时间:2014-12-12 00:39:15

标签: php email pdf utf-8 mime

亲爱的,亲爱的,

我花了最近3天在网上搜索答案,但我找不到任何答案 我发现了很多“几乎”的案例,但没有一个是我正在寻找的。

我能够用希伯来语获取主题和正文信息,但我无法用希伯来语获得附件文件名。

顺便说一下,我对PHPMailer等第三方程序不感兴趣。

这就是我得到的:

  

W_W(W'W_W_.pdf

这就是我想要的:

  

שלום。PDF

这是我的代码,非常简单..

$boundary = uniqid("HTMLEMAIL");
$separator = md5(time());
$eol = PHP_EOL;

// attachment name
$fileName = "שלום.pdf";
var_dump($fileName);

$pdfdoc = $pdf->Output("", "S");
$attachment = chunk_split(base64_encode($pdfdoc));

// main header (multipart mandatory)
$headers = [];
$headers[] = "From: $from";
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-Type: multipart/mixed; boundary=\"".$separator."\"";
$headers[] = "This is a MIME encoded message.";

// message
$msg = "--".$separator.$eol;
$msg .= "Content-Type: text/html; charset=UTF-8".$eol;
$msg .= "Content-Transfer-Encoding: base64".$eol.$eol;
$msg .= chunk_split(base64_encode($message)).$eol.$eol; 

// attachment
$msg .= "--".$separator.$eol;
$msg .= "Content-Type: application/pdf; name=\"".$fileName."\"".$eol; 
$msg .= "Content-Transfer-Encoding: base64".$eol.$eol;
$msg .= "Content-Disposition: attachment".$eol;
$msg .= $attachment.$eol;
$msg .= "--".$separator."--";

mail($to,'=?UTF-8?B?'.base64_encode($subject).'?=', $msg, implode("\n\r", $headers));

1 个答案:

答案 0 :(得分:6)

根据RFC2047,您不能在Content-Type标头的参数中使用除ascii之外的编码。

根据RFC2231,您可以尝试定义扩展参数: Content-Type: application/pdf; name*=utf-8''%D7%A9%D7%9C%D7%95%D7%9D%2E%70%64%66

我不知道它的支持程度如何。

我无法为此提出oneliner,但您可以尝试调整此PHP convert string to hex and hex to string

根据评论更新:
虽然规范明确禁止,但大多数邮件客户端应该理解以下格式 'name="?UTF-8?B?' . base64_encode($filename) . '?='

我建议你将它用于理智。