如果存在,text/plain 和 text/html 只能提供一次

If present, text/plain and text/html may only be provided once

我在尝试发送 SendGrid 电子邮件时一直收到此错误:

If present, text/plain and text/html may only be provided once.

这是我的 php 代码:

function SendGridEmail($emailTo, $subject, $body){
    global $sendGridEmail, $mailSender, $mailSenderDisplay, $sendGridAPIKey;
    
    $sendGridEmail->setFrom($mailSender, $mailSenderDisplay);
    $sendGridEmail->setSubject($subject);
    $sendGridEmail->addTo($emailTo, $emailTo);
    $sendGridEmail->addContent("text/html", $body);
    
    $sendgrid = new \SendGrid($sendGridAPIKey);
    
    try {
        $response = $sendgrid->send($sendGridEmail);
        return $response;
    } catch (Exception $e) {
        return 'SendGrid error: '. $e->getMessage();
    }
}

我正在将这些循环发送到多个电子邮件。发送的第一封电子邮件总是工作正常。所有 2-x 电子邮件均失败并显示消息。我做错了什么?

从表面上看,每次引用 global $sendGridEmail 时,您都在引用和更改同一对象。因此,当多次尝试 运行 此功能时,您 运行 宁 addContent 在您之前已经添加内容的消息上。

出现此问题是因为您不能在一封邮件中包含相同 MIME 类型的两个内容,这是您在这里无意中尝试的。我可以推断,无论您从哪里获得此示例,都不会指望在脚本本身设计为每次执行发送多于一封电子邮件的情况下使用它。

有几种方法可以解决这个问题;最简单的可能只是将脚本稍微更改为 un-global 并在每次执行函数时重新初始化 $sendGridEmail

function SendGridEmail($emailTo, $subject, $body){
    global $mailSender, $mailSenderDisplay, $sendGridAPIKey;
    $sendGridEmail = new \SendGrid\Mail\Mail();
    
    $sendGridEmail->setFrom($mailSender, $mailSenderDisplay);
    $sendGridEmail->setSubject($subject);
    $sendGridEmail->addTo($emailTo, $emailTo);
    $sendGridEmail->addContent("text/html", $body);
    
    $sendgrid = new \SendGrid($sendGridAPIKey);
    
    try {
        $response = $sendgrid->send($sendGridEmail);
        return $response;
    } catch (Exception $e) {
        return 'SendGrid error: '. $e->getMessage();
    }
}

在没有看到脚本的其余部分的情况下,可能需要进行比我上面建议的更改更多的更改,但它至少应该让您迈出正确的一步。