通过Sendgrid API发送电子邮件时出现错误。

3

在我的生产服务器上,我遇到了以下错误:

"init()收到了一个意外的参数 'apikey'"

相同代码在开发服务器上是可以工作的。

我的生产服务器正在运行gunicorn,我已经向gunicorn.service文件添加了环境变量SENDGRID_API_KEY。 我已经重新启动了gunicorn和nginx。 我可以看到环境变量已被加载。

我调用发送电子邮件的方法如下:

def sendtestemail(to):
    sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY'))
    from_email = Email("<myemail>@<mydomain>.com")
    to_email = Email(to)
    subject = "Sending with SendGrid is Fun"
    content = Content("text/plain", "and easy to do anywhere, even with Python")
    mail = Mail(from_email, subject, to_email, content)
    response = sg.client.mail.send.post(request_body=mail.get())
    return [response.status_code, response.body, response.headers]

你的 SENDGRID_API_KEY 存放在哪里?我基本上已经知道答案,但在回答之前想确认一下。 - CyberHavenProgramming
嗨,它在gunicorn.service文件中,我已经设置了“-e SENDGRID_API_KEY = <API密钥>”。我知道这可能不是理想的解决方案,但我只是想让它能够正常工作,因为如果我尝试引用一个文件,它就无法正常工作。 - OptimusPrime
嗯,我对那个设置不确定,但我的做法是将SENDGRID_API_KEY添加到我的设置文件中,from projectroot.settings import SENDGRID_API_KEY,然后将该变量添加到您的 sg 对象中。我猜测您的 os.environ 设置方式可能无法获取您的变量。在我这里,这个字典键肯定不在设置中。 - CyberHavenProgramming
谢谢回复,我刚刚也尝试了那种方式,但不幸的是,我仍然得到了相同的错误。 - OptimusPrime
1
我发现开发服务器版本为5.6.0,生产服务器版本为6.0.4,我认为这可能与问题有关。如果我将参数名称“apikey”更改为“api_key”,则会出现不同的错误。然后我得到的错误是“类型为'Email'的对象无法JSON序列化”,这表明它接受了第一行代码。可能是这个函数已经过时了,但是我已经检查过https://sendgrid.com/docs/for-developers/sending-email/v3-python-code-example/文档,并且就像我写的一样。我已经联系SendGrid支持寻求帮助。 - OptimusPrime
1个回答

5

这个问题源于sendgrid 6.0引入的一项重大变更。关键字参数apikey已被移除并替换成了一个位置参数。

要解决这个问题,在你的示例中,从参数中删除apikey=,只将api_key作为位置参数传递即可。

    sg = sendgrid.SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))

当回顾所有之前的示例以及GitHub文档时,这可能会有些令人困惑,但是官方文档上的这个示例确实是正确的。


注意:我看到你提问时确实按照我上面给出的文档正确操作。曾经有一些问题被提了出来,文档错误持续了相当长时间,但在5月份已经得到解决。


1
谢谢,这是一个老问题,但我相信我意识到API在那个版本中已经改变,而文档没有更新。我会将其标记为答案。 - OptimusPrime

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