smtp将无法在生产中使用,即使使用凭据也未经身份验证

时间:2013-07-17 22:59:34

标签: smtp go

我在这里度过了一段难忘的时光。我的代码使用此配置在本地实例(OSX)上工作:

mail.host = smtp.gmail.com
mail.port = 25
mail.from = mysite.com
mail.username = email@gmail.com

但是说它在生产中没有经过验证(Ubuntu 12.0.1):

这是我的代码(您可以在github.com/tanema/revel_mailer上找到所有代码)。在c.Mail(username)行抛出了身份验证错误。

func (m *Mailer) Send(mail_args map[string]interface{}) error {
  m.renderargs = mail_args
  pc, _, _, _ := runtime.Caller(1)
  names := strings.Split(runtime.FuncForPC(pc).Name(), ".")
  m.template =  names[len(names)-2] + "/" + names[len(names)-1]

  host, host_ok := revel.Config.String("mail.host")
  if !host_ok {
    revel.ERROR.Println("mail host not set")
  }
  port, port_ok := revel.Config.Int("mail.port")
  if !port_ok {
    revel.ERROR.Println("mail port not set")
  }

  c, err := smtp.Dial(fmt.Sprintf("%s:%d", host, port))
  if err != nil {
    return err
  }

  if ok, _ := c.Extension("STARTTLS"); ok {
    if err = c.StartTLS(nil); err != nil {
      return err
    }
  }

  from, from_ok := revel.Config.String("mail.from") 
  if !from_ok {
    revel.ERROR.Println("mail.from not set")
  }


  username, username_ok := revel.Config.String("mail.username") 
  if !username_ok {
    revel.ERROR.Println("mail.username not set")
  }

  if err = c.Auth(smtp.PlainAuth(from, username, getPassword(), host)); err != nil {
       return err
  }

  if err = c.Mail(username); err != nil {
    return err
  }

  if mail_args["to"] != nil {
    m.to = makeSAFI(mail_args["to"]) //makeSAFI == make string array from interface
  }
  if mail_args["cc"] != nil {
    m.cc = makeSAFI(mail_args["cc"])
  }
  if mail_args["bcc"] != nil {
    m.bcc = makeSAFI(mail_args["bcc"])
  }

  if len(m.to) + len(m.cc) + len(m.bcc) == 0 {
    return fmt.Errorf("Cannot send email without recipients")
  }

  recipients := append(m.to, append(m.cc, m.bcc...)...)
  for _, addr := range recipients {
    if err = c.Rcpt(addr); err != nil {
      return err
    }
  }
  w, err := c.Data()
  if err != nil {
    return err
  }

  mail, err := m.renderMail(w)
  if err != nil {
    return err
  }

  if revel.RunMode == "dev" {
    fmt.Println(string(mail))
  }

  _, err = w.Write(mail)
  if err != nil {
    return err
  }
  err = w.Close()
  if err != nil {
    return err
  }
  return c.Quit()
}

我无法弄清问题是什么;请帮忙。

编辑:

所以我咬了一口子并注册了谷歌应用程序,然后用域名和电子邮件进行设置。这让我相信它实际上是我没有改变的MX记录。所以我测试了MX记录设置后再次使用我的个人电子邮件发送。没运气。不知道我是否可以设置个人Gmail电子邮件的MX记录,所以我不必为谷歌应用付费?

1 个答案:

答案 0 :(得分:3)

我开发了一个Gmail前端,遇到了类似的问题。请尝试以下方法:

  1. 尝试使用ssl://smtp.gmail.com和端口465。

  2. 登录您的GMail帐户,查看是否显示“未经授权的第三方尝试访问此帐户”。如果您这样做,请授予您的应用程序登录权限。