Ggmail API Golang:前提条件检查失败

问题描述 投票:0回答:1

我正在尝试访问我的 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
。据我了解,其余信息应该相同,因为我使用的服务帐户是相同的。

如果有任何有关如何最好地调试此问题的见解,我将不胜感激。该错误并不真正指向特定问题。

如果您需要更多信息,请告诉我

go gmail gmail-api service-accounts google-api-go-client
1个回答
0
投票

如果您使用的是服务帐户,那么您需要指示域中您希望其模拟的用户,这是通过设置主题来完成的

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]"
© www.soinside.com 2019 - 2024. All rights reserved.