如何在Go中发送电子邮件

3
我正在尝试在Golang中发送电子邮件,但遇到了很多问题。我是Go的新手,也许这很简单,但我在文档中找不到答案。
这是我想做的事情: 1.从STDIN获取电子邮件 2.解析电子邮件(获取发件人、收件人、主题、附件等) 3.发送此电子邮件(将其再次放入本地postfix队列)
我完成了1和2,但在第3步遇到了问题。
以下是我现在拥有的内容:
package main 

import (
  "fmt"
  "github.com/jhillyerd/go.enmime"
  //"github.com/sendgrid/sendgrid-go"
  "net/smtp"
  "github.com/jordan-wright/email"
  "os"
  "net/mail"
  "io/ioutil"
  "bytes"
  )

func main() {

  mail_stdin, err := ioutil.ReadAll(os.Stdin)
  if err != nil {
      return
  }

  // Convert type to io.Reader
  buf := bytes.NewBuffer(mail_stdin)

  msg, err := mail.ReadMessage(buf)
  if err != nil {
    return
  }

  mime, err := enmime.ParseMIMEBody(msg)
  if err != nil {
    return
  }

  # saving attachments
  for _, value := range mime.Attachments {
    fmt.Println(value.FileName())

    err := ioutil.WriteFile(value.FileName(), value.Content(), 0664)
    if err != nil {
      //panic(err)
      return
    }

  fmt.Printf("From: %v\n", msg.Header.Get("From"))
  fmt.Printf("Subject: %v\n", mime.GetHeader("Subject"))
  fmt.Printf("Text Body: %v chars\n", len(mime.Text))
  fmt.Printf("HTML Body: %v chars\n", len(mime.Html))
  fmt.Printf("Inlines: %v\n", len(mime.Inlines))
  fmt.Printf("Attachments: %v\n", len(mime.Attachments))
  fmt.Println(mime.Attachments)
  fmt.Println(mime.OtherParts)
  fmt.Printf("Attachments: %v\n", mime.Attachments)
}

我已经使用了net/smtp、sendgrid-go和jordan-wright/email进行了一些测试。

我想要做的就是将邮件(不更改任何内容)从服务器发送到队列中。大多数模块需要进行身份验证,但我只想简单地使用sendmail发送邮件,就像我可以从bash中执行的那样:

# echo "test" | mail {address}

2
附注:当os.Stdin已经是一个io.Reader时,不要读取所有内容然后使用bytes.NewBuffer来“获取一个io.Reader”;不要在err != nil的情况下无任何原因/反馈地退出,至少做一些像log.Fatal(err)这样的事情。 - Dave C
1个回答

2
使用net/smtp库,您可以相对容易地完成此操作……假设您有一个可以连接而无需身份验证的SMTP服务器。我猜为了实现你想要的功能,最好通过像Gmail这样的简单方法来实现(https://www.digitalocean.com/community/tutorials/how-to-use-google-s-smtp-server)。无论如何,这里有几个代码示例来覆盖任何一种情况;
    c, err := smtp.Dial("mail.example.com:25")
    if err != nil {
        log.Fatal(err)
    }
    defer c.Close()
    // Set the sender and recipient.
    c.Mail("sender@example.org")
    c.Rcpt("recipient@example.net")
    // Send the email body.
    wc, err := c.Data()
    if err != nil {
        log.Fatal(err)
    }
    defer wc.Close()
    buf := bytes.NewBufferString("This is the email body.")
    if _, err = buf.WriteTo(wc); err != nil {
        log.Fatal(err)
    }

或者,这里有一个使用简单身份验证的go playground示例;http://play.golang.org/p/ATDCgJGKZ3,除非您已经在开发机器上运行了类似的smtp服务器,否则按照这样做可能会更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接