我正在尝试访问我的 gmail api,范围为:
https://www.googleapis.com/auth/gmail.modify
但我收到前提条件检查失败错误。
下面是我用来连接到我的 gmail 并用于发送消息的代码:
func ConnectToGmailAPI() *gmail.Service {
ctx := context.Background()
err := godotenv.Load()
if err != nil {
log.Fatalf("Error loading .env file: %v", err)
}
key := os.Getenv("PRIVATE_KEY")
newkey := strings.Replace(key, "\\n", "\n", -1)
pKey := []byte(newkey)
conf := &jwt.Config{
Email: os.Getenv("CLIENT_EMAIL"),
PrivateKeyID: os.Getenv("PRIVATE_KEY_ID"),
PrivateKey: pKey,
Scopes: []string{
"https://www.googleapis.com/auth/gmail.modify",
},
TokenURL: os.Getenv("TOKEN_URL"),
}
client := conf.Client(ctx)
srv, err := gmail.NewService(ctx, option.WithHTTPClient(client))
if err != nil {
log.Fatalf("Unable to connect to service %v", err)
}
return srv
}
func SendEmail(srv *gmail.Service, subj, msg, to string) (*gmail.Message, error) {
message, err := gmail.NewUsersMessagesService(srv).Send(
"me",
prepMessage(subj, msg, to),
).Do()
if err != nil {
return &gmail.Message{}, err
}
return message, nil
}
func prepMessage(subj, msg, to string) *gmail.Message {
header := make(map[string]string)
header["To"] = to
header["Subject"] = subj
header["Content-Type"] = "text/plain; charset=utf-8"
var headers []*gmail.MessagePartHeader
for k, v := range header {
headers = append(headers, &gmail.MessagePartHeader{Name: k, Value: v})
}
messagePart := &gmail.MessagePart{
Body: &gmail.MessagePartBody{
Data: base64.URLEncoding.EncodeToString([]byte(msg)),
},
Headers: headers,
}
message := gmail.Message{
Payload: messagePart,
}
return &message
}
以下是我正在运行的实际测试:
srv := ConnectToGmailAPI()
msg, err := SendEmail(srv, "Test", "This is a test sending", "[email protected]")
if err != nil {
t.Error(err)
}
通过研究,我发现需要域范围委派,我已确保配置了与我使用的范围相同的范围,如下面的域范围委派页面屏幕截图所示,显示了所创建的服务帐户的相同范围:
此外,我知道我的
ConnectToGmailAPI()
函数应该可以工作,因为我使用相同的服务帐户、相同的环境变量和相同的配置文件来设置仍然有效的 Sheets api 调用。在这两个暗示之间我唯一改变的是 jwt.Config{}
中的范围为 gmail.modify
。据我了解,其余信息应该相同,因为我使用的服务帐户是相同的。
如果有任何有关如何最好地调试此问题的见解,我将不胜感激。该错误并不真正指向特定问题。
如果您需要更多信息,请告诉我
如果您使用的是服务帐户,那么您需要指示域中您希望其模拟的用户,这是通过设置主题来完成的
ctx := context.Background()
serviceAccountJSON, err := ioutil.ReadFile(ServiceAccount)
if err != nil {
log.Fatalf("Warning: Unable to load service account key file %v", err)
}
config, err := google.JWTConfigFromJSON(serviceAccountJSON, SCOPE)
if err != nil {
log.Fatalf("Warning: Unable to create gmail Client %v", err)
}
config.Subject = "[email protected]"