如何通过Gmail Go SDK发送电子邮件? [英] How to send email through Gmail Go SDK?

查看:127
本文介绍了如何通过Gmail Go SDK发送电子邮件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正尝试通过 gmail 软件包。然而,消息类型是由发送 a>方法记录不完善。大部分字段似乎用于实际解析/阅读电子邮件。发送方法唯一有意义的字段(某种程度上)是 MessagePart ,但我无法弄清楚如何生成MessagePartBody,因为它似乎是一种MIME类型。以下是我目前使用的代码。

  func(em * Email)SendMessage(cl * Client)error {
config.ClientId = cl.Username
config.ClientSecret = cl.Password
$ b $:& 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 {
名称:From,
值:em.FromEmail,
})
p.Headers = append(p.Headers,& gmail.MessagePartHeader {
名称:To,
Value:em。 Ť oEmail,
})
p.Headers = append(p.Headers,& gmail.MessagePartHeader {
名称:主题,
值: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 param(WTF上传)和一个 raw 字段,我猜是原始消息,需要由messages.get提供的格式。为什么你会从收件箱中发送一条消息,该消息字面上就像收件人列表上的重新发送一样?我是唯一一个认为这个API(或者至少是文档)只是废话的人吗? 解决方案

这有点棘手但这里是您如何通过GMAIL API发送电子邮件

 导入(
code.google.com/p / goauth2 / oauth
code.google.com/p/google-api-go-client/gmail/v1
github.com/golang/glog

encoding / base64
encoding / json
net / mail
strings



类型电子邮件struct {
FromName,FromEmail,ToName,ToEmail,主题字符串
消息字符串
}

func(em * Email)SendMessage(cl * Client)error {
config.ClientId = cl.Username // oauth clientID
config.ClientSecret = cl.Password // oauth客户端密钥

t:=& oauth.Transport {
Config:config,
Transport:http.DefaultTransport,
}
var tk oa uth.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 ))
如果err!= nil {
log.Error(err)
return err
}

from:= mail.Address {em。 FromName,em.FromEmail}
to:= mail.Address {em.ToName,em.ToEmail}
$ b header:= make(map [string] string)
header [ From] = from.String()
header [To] = to.String()
header [Subject] = encodeRFC2047(em.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: =范围标题{
msg + = fmt.Sprintf(%s:%s\r\\\
,k,v)
}
msg + =\r\\ \\ n+ em.Message

gmsg:= gmail.Message {
Raw:encodeWeb64String([] byte(msg)),
}

_,err = gmailService.Users.Messages.Send(me,& gmsg).Do()
if err!= nil {
log.Errorf(em%v,err% v,gmsg,err)
return err
}
return err
}



func encodeRFC2047(s string )string {
//使用邮件的rfc2047来编码任何字符串
addr:= mail.Address {s,}
返回strings.Trim(addr.String(),< >)
}

func encodeWeb64String(b [] byte)string {

s:= base64.URLEncoding.EncodeToString(b)

var i = len(s) - 1
for s [i] =='='{
i--
}

return s [0:i + 1]
}


I'm trying to send a new email through the gmail package . However the Message type which is required by the send method is poorly documented. Most of the fields seem used to actually parse/read emails. The only field which makes sense (at some degree) for the send method is Payload of type MessagePart though I can't figure it out how to generate the MessagePartBody as it seems to be a kind of mime type. Below is the code I have so far.

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
}

The "REST" API is even more confusing. It requires an uploadType param (WTF to upload) and a raw field which I guess is the raw message which requires a format provided by messages.get. Why would you send a message from your inbox which literally would be a 'resend' as your are on the receipt list ? Am I the only one who thinks this API(or at least the documentation) is just crap ?

解决方案

It was a bit tricky but here is how you can send emails through the GMAIL API

import(
    "code.google.com/p/goauth2/oauth"
    "code.google.com/p/google-api-go-client/gmail/v1"
    log "github.com/golang/glog"

    "encoding/base64"
    "encoding/json"
    "net/mail"
    "strings"
    )


type Email struct {
    FromName, FromEmail, ToName, ToEmail, Subject string
    Message                                       string
}

func (em *Email) SendMessage(cl *Client) error {
    config.ClientId = cl.Username //oauth clientID
    config.ClientSecret = cl.Password  //oauth client secret 

    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
    }

    from := mail.Address{em.FromName, em.FromEmail}
    to := mail.Address{em.ToName, em.ToEmail}

    header := make(map[string]string)
    header["From"] = from.String()
    header["To"] = to.String()
    header["Subject"] = encodeRFC2047(em.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" + em.Message

    gmsg := gmail.Message{
        Raw: encodeWeb64String([]byte(msg)),
    }

    _, err = gmailService.Users.Messages.Send("me", &gmsg).Do()
    if err != nil {
        log.Errorf("em %v, err %v", gmsg, err)
        return err
    }
    return err
}



func encodeRFC2047(s string) string {
    // use mail's rfc2047 to encode any string
    addr := mail.Address{s, ""}
    return strings.Trim(addr.String(), " <>")
}

func encodeWeb64String(b []byte) string {

    s := base64.URLEncoding.EncodeToString(b)

    var i = len(s) - 1
    for s[i] == '=' {
        i--
    }

    return s[0 : i+1]
}

这篇关于如何通过Gmail Go SDK发送电子邮件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆