我需要能够将存储在Amazon S3服务器上的一个或多个文件作为使用SendGrid创建的电子邮件中的附件发送。
我遇到的问题是我不是网络开发专家,我能找到的稀疏PHP示例对我没什么帮助。
我是否需要将文件从S3服务器下载到本地/ tmp目录并将其作为附件添加,或者我可以从FileController传递文件正文并将其作为附件插入吗? / p>
我不确定从哪里开始,但这是我到目前为止所做的:
$attachments = array();
// Process the attachment_ids
foreach($attachment_ids as $attachment_id) {
// Get the file if it is attached to the Activity
if (in_array($attachment_id, $activity_file_ids)) {
$file = File::find($attachment_id);
$fileController = new FileController($this->_app);
$fileObject = $fileController->getFile($attachment_id);
error_log(print_r($fileObject, true));
$attachment = array();
$attachment['content'] = $fileObject;
$attachment['type'] = $fileController->mime_content_type($file->file_ext);
$attachment['name'] = explode(".", $file->filename, 2)[0];
$attachment['filename'] = $file->filename;
$attachment['disposition'] = "inline";
$attachment['content_id'] = '';
}
}
我的下一步是将$ attachment数组推送到$ attachments数组。一旦$附件完成,迭代它并将每个$附件添加到SendGrid电子邮件对象(电子邮件工作正常,没有附件,顺便说一句。)
问题是,我不确定我是否会沿着正确的道路前进,或者是否有更短更整洁的工作方式?
FileController-> getFile()基本上是这样做的:
$file = $this->_s3->getObject(array(
'Bucket' => $bucket,
'Key' => $filename,
));
return $file['Body'];
非常感谢任何帮助(特别是代码示例)!
答案 0 :(得分:1)
好的,我现在已经有了解决方案 - 这里是代码:
// Process the attachment_ids
foreach($attachment_ids as $attachment_id) {
// Get the file if it is attached to the Activity
if (in_array($attachment_id, $activity_file_ids)) {
// Get the file record
$file = File::find($attachment_id);
// Get an instance of FileController
$fileController = new FileController($this->_app);
// Set up the Attachment object
$attachment = new \SendGrid\Attachment();
$attachment->setContent(base64_encode($fileController->getFile($attachment_id)));
$attachment->setType($fileController->mime_content_type($file->file_ext));
$attachment->setFilename($file->filename);
$attachment->setDisposition("attachment");
$attachment->setContentId($file->file_desc);
// Add the attachment to the mail
$mail->addAttachment($attachment);
}
}
不知道它是否会对其他人有所帮助,但确实如此。解决方案是从S3服务器获取文件并将base64_encode($ file [' Body'])传递给实例化的Attachment对象的setContent函数,同时为它设置一些其他字段。 / p>