【发布时间】:2026-02-22 11:50:02
【问题描述】:
我正在尝试通过 gmail 包发送新电子邮件。但是,send 方法所需的 Message 类型的文档记录很少。大多数字段似乎用于实际解析/阅读电子邮件。 send 方法唯一有意义的字段(在某种程度上)是MessagePart 类型的 Payload,尽管我无法弄清楚如何生成 MessagePartBody,因为它似乎是一种 mime 类型。以下是我到目前为止的代码。
func (em *Email) SendMessage(cl *Client) error {
config.ClientId = cl.Username
config.ClientSecret = cl.Password
t := &oauth.Transport{
Config: config,
Transport: http.DefaultTransport,
}
var tk oauth.Token
err := json.Unmarshal([]byte(cl.Meta), &tk)
t.Token = &tk
if err != nil {
log.Errorf("meta %v, err %v", cl.Meta, err)
return err
}
gmailService, err := gmail.New(t.Client())
if err != nil {
log.Error(err)
return err
}
p := gmail.MessagePart{}
p.Headers = append(p.Headers, &gmail.MessagePartHeader{
Name: "From",
Value: em.FromEmail,
})
p.Headers = append(p.Headers, &gmail.MessagePartHeader{
Name: "To",
Value: em.ToEmail,
})
p.Headers = append(p.Headers, &gmail.MessagePartHeader{
Name: "Subject",
Value: em.Subject,
})
emsg := base64.StdEncoding.EncodeToString(em.Message)
log.Info(emsg)
msg := gmail.Message{
Payload: &p,
Raw: "",
}
_, err = gmailService.Users.Messages.Send("me", &msg).Do()
if err != nil {
log.Error(err)
return err
}
return err
}
“REST”API 更加令人困惑。它需要一个uploadType 参数(上传WTF)和一个raw 字段,我猜这是需要messages.get 提供的格式的原始消息。您为什么要从收件箱中发送一条消息,就像您在收件箱中一样,它实际上是“重新发送”?我是唯一一个认为这个 API(或者至少是文档)只是垃圾的人吗?
【问题讨论】:
-
MessagePartBody是一个简单的结构体,包含Data string和Size int64。当您尝试构建一个完整的消息并发送它时,究竟是什么问题? -
如果您为数据分配一个简单的字符串且长度为
[]byte(Data),则发送方法会发生混乱。 -
什么是恐慌信息? (并且您不需要将字符串复制到 []byte 即可获得长度)
-
错误是
invalid memory address or nil pointer dereference。我假设data不是一个简单的字符串,实际上是在某个地方解析的,因此是恐慌的原因 -
不,这意味着您正在取消引用一个 nil 指针;堆栈跟踪会告诉你在哪里。