无法通过SendGrid V3 API发送邮件(401错误):问题排查求助
问题场景
我尝试用SendGrid的Java SDK发送邮件,已经在官网创建了API密钥,代码如下:
Email fromEmail = new Email("test@example.com"); subject = "Sending with SendGrid is Fun"; Email toEmail = new Email("test@example.com"); Content content = new Content("text/plain", "and easy to do anywhere, even with Java"); Mail mail = new Mail(fromEmail, subject, toEmail, content); SendGrid sg = new SendGrid("9Vh5Wz9CQryyXVhWMFFQSw"); Request request = new Request(); try { request.setMethod(Method.POST); request.setEndpoint("mail/send"); request.setBody(mail.build()); Response response = sg.api(request); System.out.println(response.getStatusCode()); System.out.println(response.getBody()); System.out.println(response.getHeaders()); } catch (IOException ex) { throw ex; }
但运行时遇到了401授权错误:
java.io.IOException: Request returned status Code 401 Body:{"errors":[{"message":"The provided authorization grant is invalid, expired, or revoked","field":null,"help":null}]} at com.sendgrid.Client.executeApiCall(Client.java:287) at com.sendgrid.Client.post(Client.java:192) at com.sendgrid.Client.api(Client.java:310) at com.sendgrid.SendGrid.makeCall(SendGrid.java:151) at com.sendgrid.SendGrid.api(SendGrid.java:173) at pack.shared.email.EmailMessage$EmailService.sendEmail(EmailMessage.java:387)
可能的原因及解决步骤
API密钥输入错误或权限不足
先核对代码里的API密钥和SendGrid控制台生成的是否完全一致——复制粘贴时很容易出现多空格、漏字符的情况,哪怕一个字符不对都会触发401。另外,生成密钥时必须勾选Mail Send权限,没有这个权限的密钥无法执行邮件发送操作。如果不确定,直接重新生成一个新的、带Mail Send权限的密钥替换代码里的旧值。API密钥已过期或被撤销
登录SendGrid后台,进入API密钥管理页面,检查你使用的这个密钥是不是已经被删除,或者设置了过期时间且已经到期。如果是这种情况,重新生成一个有效的密钥即可。SendGrid账户状态异常
确认你的SendGrid账户是正常激活状态,没有欠费、违规被限制的情况。如果账户被暂停,哪怕密钥正确也会返回授权错误,可以去账户设置里查看状态,或者联系SendGrid支持确认。代码中密钥的硬编码问题(可选)
虽然你现在是硬编码密钥,但如果后续改用环境变量存储,要确保代码正确读取了环境变量的值,避免出现加载旧密钥的情况。不过当前场景下先聚焦前三点排查。
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

