SendGrid API密钥无法正常工作。 "提供的授权许可无效,已过期或已撤销"

时间:2016-01-14 12:27:21

标签: node.js sendgrid

SendGrid似乎阻止我的节点js服务器发送电子邮件。

我在发送电子邮件的回复中收到此错误消息:

"提供的授权许可无效,已过期或已撤销"

我也有一个API密钥设置,并遵循文档。

8 个答案:

答案 0 :(得分:66)

您需要使用API​​ KEY GENERATED

enter image description here

请勿使用API​​密钥ID

enter image description here

Sendgrid仅在您创建密钥时显示生成的密钥。 enter image description here

如果您在创建密钥时未将其记录在某处,则需要创建新密钥,然后您可能希望删除旧密钥,因为如果您不知道它是什么就没用是

仅供参考:上面屏幕截图中的API密钥已被删除。我立刻删除了它,所以请不要担心我泄漏了那把钥匙。

答案 1 :(得分:2)

这是一个迟到的答案和JAVA导向..但我只是复制了文档,并没有注意到..

    M3dEntities m3d = new M3dEntities();
    private void EnrollMedSelectionFrm_Load(object sender, EventArgs e)
    {
        var items = from i in m3d.items
                    where i.ItemGroup == "Medicine"
                    select new
                    {
                        i.PK_Items,
                        i.ItemID,
                        i.ItemDesc,
                        i.GenericName
                    };

        if (items != null)
        {
            DataTable dt = new DataTable();
            foreach (DataGridViewColumn col in ItemSelectionDataGridView.Columns)
            {
                dt.Columns.Add(col.Name);
                col.DataPropertyName = col.Name;
            };
            foreach (var element in items)
            {
                var row = dt.NewRow();
                row["PK_Items"] = element.PK_Items;
                row["ItemID"] = element.ItemID;
                row["ItemDesc"] = element.ItemDesc;
                row["GenericName"] = element.GenericName;
                dt.Rows.Add(row);
            }
            ItemSelectionDataGridView.DataSource = dt;
        }
    }

    private void SelectBtn_Click(object sender, EventArgs e)
    {
        EnrollMedicationFrm enrollfrm = (EnrollMedicationFrm)Application.OpenForms["EnrollMedicationFrm"];
        DataTable dt = new DataTable();
        dt = (DataTable)ItemSelectionDataGridView.DataSource;
        DataRow[] result = dt.Select("SelectedChkBox = 1");

        if (result.Count() < 1)
        {
            enrollfrm.SelectedItems = null;
        }
        else
        {
            enrollfrm.SelectedItems = result.CopyToDataTable();
        }

        this.DialogResult = DialogResult.OK;
    }

我只是把钥匙放在那里,没有看到getEnv 。愚蠢当然..但是当试图让事情快速起作用时......

答案 2 :(得分:2)

在Sendgrid v3中,我在Node JS中使用env变量时遇到了类似的问题。如果我使用env变量,我会得到上述问题。但是,如果我将字符串放入require流程,它就可以工作。

不起作用

SENDGRID_API_KEY=SG.XXXXXXXXXXXXXXXXXXX
var sg = require('sendgrid')(process.env.SENDGRID_API_KEY);

<强>作品

var sg = require('sendgrid')('SG.XXXXXXXXXXXXXXXXXXX');

将SG.XXXXXXXXXXXXXXXXXXX替换为生成的API密钥(在密钥生成期间只能看到一次)。

修改

注意:请确保不要将其保存到公共存储库。如果您这样做,任何人都可以使用您的API密钥,并且您的帐户将暂时被Sendgrid团队暂停,直到您从存储库中删除它。

答案 3 :(得分:1)

对我来说,我只需要生成一个新的API密钥即可。由于某些奇怪的原因,以前的API密钥已失效,因此我还针对这种情况添加了警报

答案 4 :(得分:0)

如果您正在使用节点js,请确保在需要sendgrid / nodemailer模块的文件中包含 require('dotenv')。config()行。如果没有它,则sendgrid传输器将具有未定义的值,而不是api_key。

答案 5 :(得分:0)

就我而言,我尝试使用 telnet 调试连接并一直被拒绝。

事实证明这两个不等价,echo 将在编码字符串中包含 \n

echo 'apikey' | base64
printf 'apikey' | base64

是的,请确保 API 密钥中不包含换行符。

答案 6 :(得分:0)

这是我的解决方案:

  1. 安装 dotenv 包:npm i dotenv

  2. 转到应用程序的最早入口点(即 index.js)并将其放在顶部:

    const dotenv = require('dotenv').config();

  3. 创建一个 .env 文件并添加 SENDGRID_API_KEY=。没有引号 '' 或 ""。

  4. 在您使用 sendgrid 的文件中,将此添加到顶部:

    const sgMail = require('@sendgrid/mail');

    sgMail.setApiKey(process.env.SENDGRID_API_KEY);

完成。

答案 7 :(得分:-1)

我遇到了同样的问题,在我验证了我的电子邮件地址并启用了 2FA 后它就消失了。