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

问题描述 投票:2回答:2

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

这是我的代码:

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

   $recips = array("[email protected]");
   $categories = array("test");



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

   $email = new SendGrid\Email();
   $email
   ->setSmtpapiTos($recips)
   ->setFrom('[email protected]')
   ->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”与包含上述代码的文件位于同一目录中。

有人可以提供任何建议吗?

php email email-attachments sendgrid
2个回答
8
投票

试试这个

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

0
投票

这并不属于这里,但截至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("[email protected]", "Example User");
    $email->setSubject("Sending with SendGrid is Fun");
    $email->addTo("[email protected]", "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";
    }`

在PHP 5.6上升级到v3发送GRID PHP客户端而不使用composer

如果你像我一样讨厌作曲家(甚至不让我开始)好消息是你可以让SendGrid工作 - 所以你知道..几乎所有“他们”(SendGrid)指导你到网上去努力帮助你

在2019年4月17日之后,SendGrid表示你需要使用v3,你需要PHP 5.6。 (正确或错误地,PHP 5.4是写入时redhat / centos的上限)并且您不能再使用postfix(尽管他们从未明确说过这个,也没有标注他们的后缀示例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)

另外 - >(重要)你被困在客户端或卷曲在v3(他们不是简单地说这个)没有后缀。算了吧。还有:卷曲机制(虽然它确实与5.4一起工作)带有a)没有使用附件的文档和b)利用非法的json_encoding PHP无法输出(PHP不能给“{[{}]}”它总是“{”0“ :[{}]}“)

但不管你不仅要使用5.6 PHP的SendGrid PHP客户端(再次没有,服务器后缀选项)你仍然需要知道你需要两个项目:“php-http-client-master”和“sendgrid-php-master”(两个回购),这是没有记录的:那么你需要执行以下操作:“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';
          ?>

理论上添加作曲家意味着你可以避免这一切但是对于某些服务器而言这是不可能的(在我的PHP项目的不同分支上实现作曲家需要3周时间 - 我不再重复这一点)因为作曲家引入了一个突破性的变化PHP处理包括和类自动加载的方式

PS:我已经向SendGrid提醒了所有这些,你可能会发现这很快就被清除了

© www.soinside.com 2019 - 2024. All rights reserved.