我在尝试弄清楚我的应用中究竟出现了什么问题时遇到了一些问题。
我尝试做的是通过表单<input type="file">
字段上传文件。然后该文件被base64编码并附加到邮件。
症状:
附件文件显示在邮件中,但尝试打开它会导致&#34;文件不是.pdf或已损坏&#34;错误并且不可读。
其他信息:
邮件中显示的附件(使用pdf作为示例,它也正确显示png和其他文件的文件类型):
--_=_swift_v4_1422542740_8140c03155128cd497227873a9a9d98c_=_
Content-Type: application/pdf; name=sample.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=sample.pdf
// chunk of base64
--_=_swift_v4_1422542740_8140c03155128cd497227873a9a9d98c_=_--
编码方法:
public function encode_attachments($files) // $files = $_FILES
{
$attachments = array();
$legal_files = array('input', 'ids');
$msg = array(
1 => "The uploaded file exceeds the upload_max_filesize directive in php.ini",
2 => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form",
3 => "The uploaded file was only partially uploaded",
4 => "No file was uploaded",
6 => "Missing a temporary folder"
);
foreach ($legal_files as $file) {
if (isset($files[$file]) && !empty($files[$file]['tmp_name'])) {
// get file details we need
$file_tmp_name = $files[$file]['tmp_name'];
$file_name = $files[$file]['name'];
$file_size = $files[$file]['size'];
$file_error = $files[$file]['error'];
if ($file_error > 0) {
throw new Exception($msg[$file_error]);
} else {
// read from the uploaded file & base64_encode content for the mail
$handle = fopen($file_tmp_name, 'r');
$content = fread($handle, $file_size);
fclose($handle);
$encoded_content = chunk_split(base64_encode($content));
// now we know we have the file contents for attachment
$attachments[$file_name] = $encoded_content;
}
}
}
return $attachments;
}
如何在邮件中构建附件(初始部分):
if (isset($this->attachments) && is_array($this->attachments) && !empty($this->attachments)) {
foreach ($this->attachments as $file_name => $file_content) {
$mime_type = File::mime_by_ext(pathinfo($file_name, PATHINFO_EXTENSION));
$attachment = Swift_Attachment::newInstance($file_content, $file_name, $mime_type ? $mime_type : "text/html");
// Attach it to the message
$message->attach($attachment);
}
}
我尝试过的一些事情:
最令人困惑的是,编码文件内容的md5哈希值与发送的内容和收到的内容之间存在差异。
我似乎无法找到文件内容可能格式错误或损坏的地方。可能是因为我试图通过SSL发送它们吗?浏览SwiftMailer代码并不会显示任何特定内容,如果它是Swift_OutputByteStream
的实例(但它是一个字符串),它只会对文件内容执行某些操作。
常规文本文件打开没问题但是它们的内容是base64encoded(这使我怀疑文件被编码两次的某个地方,但我无法在任何地方找到它)。图像和pdf文件根本没有打开。
如果有人指出我正确的方向(我猜它是完全平庸的东西,我总是浪费在平庸的事情上),真的会感激不尽。我会根据需要提供任何其他信息。
修改
解决方案相当简单(正如Marc B指出的那样)。我所要做的就是停止使用以前的维护者在项目中放置SwiftMailer的多余包装器,然后直接调用它们的类。
答案 0 :(得分:3)
是。你做错了。有 NO 需要做自己的base64编码和诸如此类的东西。根本就是你所需要的(为了易读性而分成多行):
$swift
->attach(Swift_Attachment::fromPath($_FILES['foo']['tmp_name'])
->setFilename('Name you want to appear in the email.pdf');
这是Swiftmailer和PHPMailer的重点 - 他们做了所有繁重的工作,你只是像老板一样行事:&#34;去那里,做到这一点,让我拿走所有的功劳&#34;。