使用 Mail_Mime 将附件发送到 GMail,接收“无名”附件
Posted
技术标签:
【中文标题】使用 Mail_Mime 将附件发送到 GMail,接收“无名”附件【英文标题】:Using Mail_Mime to send attachment to GMail, receiving "noname" attachment 【发布时间】:2011-10-03 04:42:39 【问题描述】:我有一个可以带附件的非常简单的网站表单。它使用 gmail 的 smtp 发送到 gmail 地址。除了文件以“noname”形式到达 - 没有文件名或扩展名之外,一切都运行良好。如果您下载附件并将其重命名为正确的文件名,则文件可以正常打开。
我尝试向 addAttachment() 添加更多参数,例如文件类型和文件名,但它们没有显示在电子邮件中。当我在 gmail 中点击“显示原文”时,我在附件部分看到的就是这些(无论我使用什么参数,它们都不会改变):
Content-Transfer-Encoding: base64
Content-Type: application/octet-stream
Content-Disposition: attachment
这是我的代码的相关部分:
require_once 'Mail.php';
require_once 'mime.php';
$ToEmail = '***@***.com';
$EmailSubject = '*** contact form';
$Filename = basename($_FILES['uploaded_file']['name']);
$host = "ssl://smtp.gmail.com";
$port = "465";
$username = "***@***.com";
$password = "***";
$MESSAGE_BODY = "Blah blah blah";
$Uploads_folder = "../uploads/";
$Filepath = $Uploads_folder.$Filename;
$tmp_path = $_FILES["uploaded_file"]["tmp_name"];
if(is_uploaded_file($tmp_path))
if(!copy($tmp_path, $Filepath))
echo 'Sorry, there was an error in uploading the file. Please go back and try again.';
exit();
$headers = array ('From' => $username,
'To' => $ToEmail,
'Subject' => $EmailSubject);
$mime = new Mail_mime();
$mime->sethtmlBody($MESSAGE_BODY);
$mime->addAttachment($Filepath);
$body = $mime->get();
$headers = $mime->headers($headers);
$smtp = Mail::factory('smtp',
array ('host' => $host,
'port' => $port,
'auth' => true,
'username' => $username,
'password' => $password));
$mail = $smtp->send($ToEmail, $headers, $body);
非常感谢任何帮助!
【问题讨论】:
【参考方案1】:最近,我不得不实现一项服务,通过我的 apache 服务器从 android 应用程序发送电子邮件。
此服务器运行 sendmail 服务。
我测试了 3 个域。
-
@naver.com
@gmail.com
@does.kr
我测试了几个代码并意识到 'boundary' 标头非常重要。
我的第一个界限是什么。
Content-Type: multipart/mixed; boundary=;
我发送了带有 2 个附件和该标题的电子邮件。
dos.kr 和 naver.com 中的电子邮件看起来不错。
但 gmail.com 中没有。我看到了 'noname' 文件,据我所知,这是一个自 2007 年以来尚未解决的问题。
我的第二个边界是“----=part56d7fa8d7a369”,由 php 的 unique() 组成。
Content-Type: multipart/mixed; boundary=----=part56d7fa8d7a369;
我发送的电子邮件除了标题之外的文件相同。
does.kr 和 gmail.com 中的电子邮件看起来不错。
但在 naver.com 中没有。我在 naver.com 中只看到标题。
唯一的区别是“边界”,结果完全不同。
因此,我必须根据电子邮件地址对代码进行分叉以创建不同的“边界”。
而且效果很好。
【讨论】:
【参考方案2】:您是否尝试将Content-Type
变量添加到您的addAttachment()
参数列表中?例如,如果您知道用户正在上传 .pdf 文档,您将执行以下操作:
$Filepath = $Uploads_folder.$Filename;
$content_type = "Application/pdf";
$mime->addAttachment($Filepath, $content_type);
【讨论】:
以上是关于使用 Mail_Mime 将附件发送到 GMail,接收“无名”附件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Gmail API 发送的邮件中缺少附件,但仅适用于收件人