NodeJS:Sendgrid邮件403“Forbidden”错误。

30
我在我的Node.js项目中使用Sendgrid发送一封非常直接的电子邮件,但是我收到了一个403禁止错误。API密钥已获得完全访问权限。代码也正确集成,因为我使用另一个帐户的API密钥它完美地工作。
错误日志:

输入图像描述
有什么建议吗?

面对相同的问题 - 我看到 x-no-cors-reason 头部有一个链接指向他们的文档,https://sendgrid.com/docs/for-developers/sending-email/cors/,但它只是说你不能从浏览器中使用 sg api(当然)。 - Alfred Young
1
@AlfredYoung 在您的 Sendgrid 帐户上执行单个发送者身份验证即可解决此问题。 - iqra
8个回答

49
该错误是由于在消息中的“from”字段中使用的电子邮件地址(在您的nodejs代码中,使用sendgrid发送)未经sendgrid验证而引起的。只将已经被sendgrid明确验证的电子邮件地址放入“from”字段中。
要验证您的发件人电子邮件地址以能够发送电子邮件,请参考以下链接:-

https://sendgrid.com/docs/ui/sending-email/sender-verification

希望这有所帮助。
(关于域名可能还会出现其他问题,请仔细阅读链接,他们对使用gmail.com地址发出了警告,您可以忽略此警告。)

6
这应该是被接受的答案,谢谢! - Ahmad Alfy
当SendGrid想要向一个不存在的地址发送验证邮件时,您如何验证“donotreply”电子邮件地址? - Oliver Nilsen
我不确定我是否可以将这个特定字段用于此目的,如果不是,请原谅我,但非常感谢!我在想这可能与类传递的字段中使用的编码方法有关... - user3050478
这解决了我的问题。不幸的是,API响应没有提供任何细节信息。 - elier

8

将完整的错误信息粘贴在此处

ResponseError: Forbidden
    at node_modules/@sendgrid/client/src/classes/client.js:133:29
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  code: 403,
  response: {
    headers: {
      server: 'nginx',
      date: 'Sat, 10 Oct 2020 17:22:02 GMT',
      'content-type': 'application/json',
      'content-length': '281',
      connection: 'close',
      'access-control-allow-origin': 'https://sendgrid.api-docs.io',
      'access-control-allow-methods': 'POST',
      'access-control-allow-headers': 'Authorization, Content-Type, On-behalf-of, x-sg-elas-acl',
      'access-control-max-age': '600',
      'x-no-cors-reason': 'https://sendgrid.com/docs/Classroom/Basics/API/cors.html'
    },

以下是对@Aman上面的回答进一步扩展的解决方案。

  • 您必须验证您正在发送电子邮件的电子邮件地址。

这里的意思是,from:地址

const msg = {
    to: 'recepient@email.com',
    from: 'sender@email.com', //this is the address that needs to be verified by sendgrid
    subject: 'Sending from Sendgrid',
    text: 'here is the test from node',
    html: `<strong> Here is the order #${orderNumber} user: ${user} </strong>`,
}

以下是如何验证发送方身份的步骤: https://sendgrid.com/docs/ui/sending-email/sender-verification/,请参考以下截图:

enter image description here


5

在验证发件地址时,请检查是否使用了from电子邮件地址。


3

我曾遇到同样的问题。
我发现我的应用程序的邮件from和SendGrid API的发件人验证需要相同。

const sendMailHtml = async (subject, html) => {
    try {
        const msg = {
            to: 'to@email.com',
            from: {
                email: "sample@hotmail.com"
            },
            subject: subject,
            html: html,
        }
        await sendgrid.send(msg)
    } catch (e) {
        return e
    }
}

SendGrid API邮件字段

在此输入图片描述


2
这解决了我的问题 - 谢谢!尽管在SendGrid上有验证的发件人,但仍然收到403错误。不知道为什么示例显示:“from:'string'”,而不是您建议的内容。 - Perelan

2
要解决此错误,您需要执行您发件人电子邮件的SendGrid发送者身份验证
为此,您需要登录您的SendGrid仪表板,并访问设置下拉菜单下的发送者身份验证有2种发送者身份验证类型
  1. 域身份验证// 推荐
  2. 单个发件人验证
1 域身份验证 如果您允许SendGrid验证您的域,例如webapp.com 那么,如果电子邮件from键与已验证的域from:*@webapp.com匹配,则您将能够成功使用您的SendGrid API KEY发送电子邮件 2 单个发件人验证 这是另一种选项,您可以验证一个单独的电子邮件地址,例如person@email.com. 然后,您将能够通过您的SendGrid API KEY发送电子邮件from: person@email.com

1
“from: *@webapp.com” 这部分是让我明白的关键。 - Julien Ambos

0
在最新的 sendgrid 发布中,他们已经强制要求验证“单发件人”即您作为单一发件人。因此,在使用 Sendgrid 发送电子邮件 API 时,From 字段应与您验证为“单发件人”的电子邮件地址匹配以使其正常工作。

0

验证您的单发件人帐户,其中发送者身份验证/单发件人验证/操作列(三点)(发送验证电子邮件-编辑-删除菜单)


-3
[Tulio Faria] 通过对他的Sendgrid帐户执行“单发件人身份验证”来解决了这个问题。
我不久前也遇到了类似的问题。帮助我解决这个问题的方法是进入设置> API密钥,然后更改我正在使用的密钥的设置为完全访问。 enter image description here

我也遇到了同样的问题。将API密钥更改为完全访问也无法解决它。 - Tulio Faria
1
Tulio Faria通过在他的Sendgrid账户上执行“单发件人认证”来解决了这个问题。然而,我有另一个账户,我没有验证任何域名或发件人电子邮件,但我仍然能够从该账户发送电子邮件。这让我感到困惑,因为我可以指定任何电子邮件地址作为发件人,并且电子邮件会成功地被送达。不确定真正的问题是什么。 - iqra
@Sean C 和 "aledap" 我尝试使用相同的方式更改访问权限,但仍然面临相同的问题,它会给我返回 403 错误。 - Codebrekers
2
@sean - 这个解决方案对于实际发生的情况来说有些过度了,错误是因为你的msg对象中的from: 'emailAddress@email.com'还没有被Sendgrid确认/验证。 - Jonathan Sanchez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接