使用 SendGrid PHP(sendgrid-php 库)发送文件附件

Posted

技术标签:

【中文标题】使用 SendGrid PHP(sendgrid-php 库)发送文件附件【英文标题】:Send file attachment with SendGrid PHP (sendgrid-php library) 【发布时间】:2016-08-05 08:27:34 【问题描述】:

当我尝试使用 SendGrid php 库 (https://github.com/sendgrid/sendgrid-php) 发送附件时,该函数失败(白屏)。删除“setAttachment”行使其再次工作。

这是我的代码:

require "sendgrid-php/sendgrid-php.php";
function sendgrid() 

   $recips = array("me@mydomain.ca");
   $categories = array("test");



   $sendgrid = new SendGrid("API key removed");

   $email = new SendGrid\Email();
   $email
   ->setSmtpapiTos($recips)
   ->setFrom('mailroom@mydomain.ca')
   ->setSubject('Testing Sendgrid')
   ->setText('Hello World! Testing...')
   ->sethtml('<strong>Hello World!</strong>')
   ->setCategories($categories)
   ->setAttachment('test.txt')
   ;


   //$sendgrid->send($email);

   $res = $sendgrid->send($email);

   var_dump($res);


sendgrid();

据我所知,我正在关注文档,但我想知道我是否没有正确格式化文件的路径。 “Test.txt”与包含上述代码的文件在同一目录中。

谁能给点建议?

【问题讨论】:

【参考方案1】:

这并不真正属于这里,但截至 2019 年 4 月 17 日,SendGrid 打破了他们的 postfix 机制,并在没有“适当”文档的情况下强制执行 v3 PHP 客户端。我的意思是:没有任何文件被正确记录(因为当我输入 SendGrid 时这篇文章出现在谷歌的顶部 - 就这样)

所以如果你看到这个..不要惊慌这篇文章会帮助你

invalid authentication method - declined because you are using basic authentication with 2FA enabled. to fix, update to using an API key or disable 2FA and switch to using IP Access Management for security.

文档的一些问题

v3 上的 SendGrids 文档是(在我看来)

声明性而非信息性(功能性声明而非技术信息) 大错特错(循环链接的野鹅追逐) 已过时(没有任何提醒您) 缺少必要的组件(所以在没有提示的情况下无法开箱即用)......

例如:(只是一种味道)在这里我们看到“他们”(SendGrid)只是取出\SendGrid\Email()并用替换它\SendGrid\Mail\Mail() 在他们的代码库中,但没有更新他们的文档 - 所以他们发布的示例将不起作用。 - 这是一个非常小的变化 - 但正如所写的那样,调用者是不同的,他们从未更新过他们的示例。他们省略了其他所有内容,这使得一件容易的事情变得非常辛苦。

即此示例适用于 v3

    $sendgrid = new SendGrid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    $email = new \SendGrid\Mail\Mail();
    $email->setFrom("test@example.com", "Example User");
    $email->setSubject("Sending with SendGrid is Fun");
    $email->addTo("bigman@getme.com", "Example User");
    $email->addContent(
        "text/plain", "and easy to do anywhere, even with PHP"
    );
    $email->addContent(
        "text/html", "<strong>and easy to do anywhere, even with PHP</strong>"
    );

    //optional (seems to be bullet proof, pdf,  png, etc) to attach a file<START>
    $att1 = new \SendGrid\Mail\Attachment();
    $att1->setContent(file_get_contents("/path/to/some/test_attach.txt"));
    $att1->setType("application/octet-stream");
    $att1->setFilename(basename("/path/to/some/test_attach.txt"));
    $att1->setDisposition("attachment");
    $email->addAttachment($att1);
    //optional to attach a file</END>       

    try 
        $response = $sendgrid->send($email);
        print $response->statusCode() . "\n";
        print_r($response->headers());
        print $response->body() . "\n";
     
    catch (Exception $e) 
        echo 'Caught exception: ',  $e->getMessage(), "\n";
    `

升级到 v3 SEND GRID PHP CLIENT,无需 PHP 5.6 上的作曲家

如果你和我一样讨厌作曲家(甚至不要让我开始),好消息是你可以让 SendGrid 正常工作 - 就这样你知道 .. 几乎所有“他们”(SendGrid)将您引导至在线的内容都很难为您提供帮助

在 2019 年 4 月 17 日之后,SendGrid 说您需要使用 v3 您将需要 PHP 5.6。(在撰写本文时 PHP 5.4 是 redhat/centos 的上限,无论对错)和 您不能再使用后缀(尽管他们从未明确说过这一点,也没有标记他们的后缀示例 v2 max,即自 2019 年 4 月 17 日起禁用)

截至 2019 年 4 月 17 日

-> you have to use v3 
-> you have to use the PHP client... (no postfix)
-> you have to upgrade to 5.6 
-> you **DO NOT** have to use composer (but if you don't you need to pay attention, see below)

ALSO ->(重要)你被客户端或 v3 的 curl 卡住了(他们不只是这个)没有后缀。忘了它。还回复:Curl 机制(虽然它适用于 5.4)携带 a)没有关于使用附件的文档和 b)利用非法 json_encoding PHP 无法输出(PHP 不能给出“[]”它总是“”0” :[]")

但您不仅必须在 5.6 PHP 中使用 SendGrid PHP 客户端(同样不,服务器后缀选项)您仍然需要知道您需要两个项目:“php-http-client-master”和“@ 987654322@" (BOTH repos) 并且这是未记录的:那么您需要执行以下操作:并且“sendgrid-php-master”中的/lib/loader.php 需要在末尾添加这两行

               require_once '/your/path/to/php-http-client-master/lib/Client.php';
               require_once '/your/path/to/php-http-client-master/lib/Response.php';

您还需要添加此内容(遗憾的是,SendGrid 更加草率)

             require_once __DIR__ . '/mail/TypeException.php';

顺便说一句,我还编辑了sendgrid-php-master\sendgrid-php.php

          <? php
             require __DIR__ . '/lib/loader.php';
          ?>

理论上添加 composer 意味着您可能可以避免所有这些,但对于某些服务器来说这是不可能的(在我的 PHP 项目的不同分支上实现 composer 需要 3 周 - 我不会重复这一点),因为 composer 引入了一个中断改变 PHP 处理包含和类自动加载的方式

PS:我已经提醒 SendGrid 这一切你可能会发现这很快就解决了

【讨论】:

【参考方案2】:

试试这个

 ->setAttachment(realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'test.txt');

【讨论】:

难以置信,它成功了!谢谢!我想知道这是否应该在文档中,或者它只是我的环境特有的东西? 您需要使用绝对文件路径,我假设类文件最有可能查找相对于其路径的文件。由于找不到它,它失败了,但是通过提供绝对文件路径,它知道要查看的确切位置 如果您想打开 sendgrid-php.php 文件并尝试查找该方法并查看它的作用:) 这是您向前学习的最佳方式 你知道如何在批量发送邮件时使用 setSmtpapiTos 发送附件(每封邮件的唯一附件)

以上是关于使用 SendGrid PHP(sendgrid-php 库)发送文件附件的主要内容,如果未能解决你的问题,请参考以下文章

如果使用 SendGrid API,则禁用 PHP mail() 函数

从所有先前的消息和元数据中提取电子邮件消息本身(Sendgrid Parse API/PHP)?

有没有办法只使用 sendgrid API 来构建完整的 sendgrid 订阅表单?

Sendgrid - SMTP 还是 CURL?

如何将动态数据传递到sendgrid webapp上设计的电子邮件模板? : - | Sendgrid

Sendgrid 中的替换令牌列表