收件人地址需要代码”:400 在 Laravel PHP 中使用 Gmail API 发送电子邮件

Posted

技术标签:

【中文标题】收件人地址需要代码”:400 在 Laravel PHP 中使用 Gmail API 发送电子邮件【英文标题】:Recipient address required code": 400 in sending an email using Gmail API in Laravel PHP 【发布时间】:2020-07-07 02:10:16 【问题描述】:

我正在尝试通过 Gmail API 集成通过我的系统发送电子邮件,但我收到一个错误,即

Google_Service_Exception “错误”:“错误”:[“域”:“全局”,“原因”:“invalidArgument”,“消息”:“需要收件人地址”],“代码”:400,“消息”: “需要收件人地址”

这是 Laravel 中的代码:

$obj = new \Google_Service_Gmail_Message ();
$raw = "MIME-Version: 1.0\n\r
From: Muhammad Bilal <muhammad.bilal@dynamologic.com>\n\r
To: Umer Sheikh <umer.sheikh@dynamologic.com>\n\r
Subject: SIMPLE TEXT EMAIL\n\r
Date: Thu, 5 Mar 2020 18:45:33 +0500\n\r
Message-ID: <1234@local.machine.example>\n\r
Content-Type: text/plain; charset=\"UTF-8\"\n\r
\n\r
NO BODY";
$raw = rtrim(strtr(base64_encode($raw), '+/', '-_'), '=');
$obj->setRaw($raw);
$obj->setId('1234');
$obj->setInternalDate(null);
$obj->setLabelIds(null);

$payload = new \Google_Service_Gmail_MessagePart ();
$body = new \Google_Service_Gmail_MessagePartBody ();
$body->setData('test');
$body->setSize('1');

    $payload->setBody($body);
    $obj->setPayload($payload);
    $results = $service->users_messages->send($user, $obj);

【问题讨论】:

【参考方案1】:

问题已解决,找到有效的示例代码

    $user = 'me';
    $strSubject = 'Test mail using GMail API' . date('M d, Y h:i:s A');
    $strRawMessage = "From: Muhammad Bilal <muhammad.bilal@dynamologic.com>\r\n";
    $strRawMessage .= "To: Muhammad Bilal <mb3451@yahoo.com>\r\n";
    $strRawMessage .= 'Subject: =?utf-8?B?' . base64_encode($strSubject) . "?=\r\n";
    $strRawMessage .= "MIME-Version: 1.0\r\n";
    $strRawMessage .= "Content-Type: text/html; charset=utf-8\r\n";
    $strRawMessage .= 'Content-Transfer-Encoding: quoted-printable' . "\r\n\r\n";
    $strRawMessage .= "this <b>is a test message!\r\n";
    $mime = rtrim(strtr(base64_encode($strRawMessage), '+/', '-_'), '=');
    $msg = new \Google_Service_Gmail_Message();
    $msg->setRaw($mime);
    $service->users_messages->send("me", $msg);

【讨论】:

【参考方案2】:

您收到的错误消息是由于Content-Type 的类型应该是message/rfc822不是 text/plain

Users.messages: send documentation中提到的:

此方法支持 /upload URI 并接受具有以下特征的上传媒体:

最大文件大小: 35MB

接受的媒体 MIME 类型: message/rfc822

因此,整个电子邮件消息应采用 RFC 2822 格式的 base64url 编码字符串

参考

Gmail API Send Messages

【讨论】:

已更新,但仍然出现相同的错误 $raw = "MIME-Version: 1.0\n\r From: Muhammad Bilal \n\r To: Umer Sheikh \n\r 主题:简单文本电子邮件\n\r 日期:2020 年 3 月 5 日星期四 18:45:33 +0500\n\r 消息 ID:\n\r Content-Type: message/rfc822; charset=\"UTF-8\"\n\r \n\r NO BODY"; 您好@MuhammadBilal,删除charset=\"UTF-8\" 怎么样,您仍然收到同样的错误吗?干杯! 是的,即使删除 charset=\"UTF-8\",我仍然遇到同样的错误

以上是关于收件人地址需要代码”:400 在 Laravel PHP 中使用 Gmail API 发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

400 错误。需要收件人地址。 JavaScript

发送消息/参数错误需要 SMTP 收件人地址

Google 电子邮件 API 引发 400 错误。需要收件人地址 (c#)

通过 php 代码访问我的 gmail 收件箱

Amazon SES 是不是需要存在我的发件人地址

Dynamics 365-如何指定邮件收件人的地址