PHP:来自S3服务器的SendGrid邮件附件

时间:2017-06-30 09:49:08

标签: php email amazon-s3 attachment sendgrid

我需要能够将存储在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'];

非常感谢任何帮助(特别是代码示例)!

1 个答案:

答案 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>