在Go中使用smtp发送Gmail

时间:2016-06-07 14:54:18

标签: go smtp gmail

之前我能通过smtp发送带有gmail的电子邮件,但现在不行了。我仍然能够在我开发的Windows上的计算机上从localhost发送,但不能从生产服务器发送。我已启用"允许安全性较低的应用"用我的Gmail帐户。但这仍然是我得到的错误:

2016/06/07 10:27:03 534 5.7.14 <https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbtq
5.7.14 ZHRyO8gjNXDZjjls6t7JWkP7y1UM8Jc44oPvw0dXO96SljvNT3d2QDMlJAT3X7p4teLYY1
5.7.14 zj9NBwLOytlrdRXkjm7BZNWpPLLscyxEOUcyLL3EFHdnYiq_1P_PwQVcLvZlVGUdChm_
5.7.14 6BIdD9uJLkOOG_6b6oXyJ1YfZJneoM8IiUYlWaecNECJQYF8WLYY3hSCCnNDazjJuRvjbH
5.7.14 yqJu4xBfx-929yDQwvPmuVxL4bQv8> Please log in via your web browser and
5.7.14 then try again.
5.7.14  Learn more at
5.7.14  https://support.google.com/mail/answer/78754 89sm7243327qth.2 - gsmtp

enter image description here

它说它已检测到&#34;一个未知设备&#34;这是生产服务器,但我没有办法确认该设备是合法的。我该如何发送电子邮件?

这是我编写的用于发送电子邮件的代码,请注意,当我从Windows开发环境中的localhost发送时,它不起作用。

type Mail struct {
    Hostname   string
    Port       string
    User       string
    Password   string
    Header     map[string]string
    IsHTML     bool
    Subject    string
    Body       string
    Recipients []string
}

func New() *Mail {
    return &Mail{
        Hostname: cfg.MailHost,
        Port:     cfg.MailPort,
        User:     cfg.MailUser,
        Password: cfg.MailPass,
        Header:   map[string]string{},
        IsHTML:   true,
    }
}

func (m *Mail) AddHeader(key, value string) {
    m.Header[key] = value
}

func (m *Mail) AddRecipient(address string) {
    m.Recipients = append(m.Recipients, address)
    m.AddHeader("To", "<"+address+">")
}

func (m *Mail) HTML(isHTML bool) {
    m.IsHTML = isHTML
}

func (m *Mail) Send() error {

    if m.Subject == "" {
        m.Subject = "Some random subject..."
    }
    m.AddHeader("Subject", m.Subject)

    if _, ok := m.Header["From"]; !ok {
        m.AddHeader("From", cfg.MailName+" <"+cfg.MailUser+">")
    }

    if m.IsHTML {
        m.AddHeader("MIME-version", "1.0;")
        m.AddHeader("Content-Type", "text/html; charset=\"UTF-8\";")
    }

    body := ""
    for k, v := range m.Header {
        body += fmt.Sprintf("%s: %s\r\n", k, v)
    }
    body += "\r\n" + m.Body

    auth := smtp.PlainAuth("", m.User, m.Password, m.Hostname)

    err := smtp.SendMail(
        m.Hostname+":"+m.Port,
        auth,
        m.User,
        m.Recipients,
        []byte(body),
    )

    if err != nil {
        return err
    }
    return nil
}

我不知道现在该做什么。

config.go中的一些变量:

MailHost = "smtp.gmail.com"
MailPort = "587"

如果我将端口从587更改为465,如下所示: https://support.google.com/a/answer/176600?hl=en

我在尝试从生产服务器发送电子邮件时收到错误:"EOF"

它一直说我应该去gmail&#34;高级设置。将IP地址列入白名单。但是gmail中没有高级设置,只有设置。

enter image description here

0 个答案:

没有答案