第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

帶有 Go 和 gmail.NewService 的 Gmail API 無效內(nèi)存地址或 nil

帶有 Go 和 gmail.NewService 的 Gmail API 無效內(nèi)存地址或 nil

Go
BIG陽 2022-11-08 16:25:27
我對 gmail api 的新 NewService 功能有疑問。如果我使用已棄用的 gmail.New() 一切正常。使用 NewService() 我得到invalid memory address or nil pointer dereference我的實現(xiàn)如下type MailData struct {    To      string    Name    string    Subject string    Content template.HTML}    func doSend(msg *gmail.Message, srv *gmail.Service) error {    _, err := srv.Users.Messages.Send("me", msg).Do()    if err != nil {        return err    }    return nil}func ComposeMessage(m models.MailData) *gmail.Message {    var gmailMessage gmail.Message    from := mail.Address{Name: "Sender", Address: os.Getenv("MAIL_FROM")}    replyTo := os.Getenv("MAIL_REPLYTO")    to := mail.Address{Name: m.Name, Address: m.To}    header := make(map[string]string)    header["From"] = from.String()    header["Reply-To"] = replyTo    header["To"] = to.String()    header["Subject"] = m.Subject    header["MIME-Version"] = "1.0"    header["Content-Type"] = "text/html; charset=\"utf-8\""    header["Content-Transfer-Encoding"] = "base64"    var msg string    for k, v := range header {        msg += fmt.Sprintf("%s: %s\r\n", k, v)    }    msg += "\r\n" + string(m.Content)    gmailMessage.Raw = base64.RawURLEncoding.EncodeToString([]byte(msg))    return &gmailMessage}使用舊的 gmail.New() 有效,但它指出該功能已棄用,因此我需要將其更改為新的 gmail.NewService。雖然像下面這樣實現(xiàn)它是行不通的func sendGMail(m models.MailData) error {    credentials := "../gmail_credentials.json"    ctx := context.Background()    srv, err := gmail.NewService(        ctx,        option.WithCredentialsFile(credentials),        option.WithScopes("https://www.googleapis.com/auth/gmail.send"),    )    if err != nil {        return errors.New(fmt.Sprintf("unable to retrieve gmail client: %s", err))    }    // Create message    gMessage := ComposeMessage(m)    if err := doSend(gMessage, srv); err != nil {        return errors.New(fmt.Sprintf("could not send mail: %s", err))    }    fmt.Println("Email sent")    return nil}
查看完整描述

1 回答

?
守著星空守著你

TA貢獻1799條經(jīng)驗 獲得超8個贊

這個問題并不那么明顯,但很容易解決。在初始化時,gmail.NewService()我需要將配置參數(shù)作為選項傳遞,就像之前的實現(xiàn)gmail.New()是使用


所以之前是


client := getClient(config)

srv, err := gmail.New(client)

現(xiàn)在是


client := getClient(config)

ctx := context.Background()

srv, err := gmail.NewService(

    ctx,

    option.WithHTTPClient(client),

)

在 Go 的 Gmail API 實現(xiàn)的更多上下文中,您需要使用所有使用的函數(shù)


https://developers.google.com/gmail/api/quickstart/go或


https://github.com/googleworkspace/go-samples/blob/master/gmail/quickstart/quickstart.go


并將它們放入您的 go 文件中。這些將生成 AccessToken 和憑據(jù),如果您正確遵循指南,則需要將其保存為 json 文件并重復使用。credentials.json 用于更新您的 AccessToken。


現(xiàn)在代替使用gmail.New(),正確的方法是使用如上所示的函數(shù)。


整個sendGmail函數(shù)如下


func sendGMail(m models.MailData) error {

    credentials := "../gmail_credentials.json"

    b, err := ioutil.ReadFile(credentials)

    if err != nil {

        return errors.New(fmt.Sprint("unable to read credentials file:", err))

    }


    config, err := google.ConfigFromJSON(b, gmail.GmailSendScope)

    if err != nil {

        return errors.New(fmt.Sprint("unable to parse credentials file config:", err))

    }


    client := getClient(config)

    ctx := context.Background()

    srv, err := gmail.NewService(

        ctx,

        option.WithHTTPClient(client),

        option.WithScopes("https://www.googleapis.com/auth/gmail.send"),

    )

    if err != nil {

        return fmt.Errorf("unable to retrieve gmail client: %s", err)

    }


    // Create message

    gMessage := ComposeMessage(m)


    if err := doSend(gMessage, srv); err != nil {

        return fmt.Errorf("could not send mail: %s", err)

    }

    fmt.Println("Email sent")


    return nil

}


查看完整回答
反對 回復 2022-11-08
  • 1 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號