Email 如何从Go发送电子邮件

Email 如何从Go发送电子邮件,email,parsing,go,Email,Parsing,Go,我想在Golang发一封电子邮件,但我有很多问题。我是围棋新手,所以可能这很简单,但我在医生上找不到答案 这就是我想做的: 1.从STDIN收到一封电子邮件 2.解析电子邮件(获取发件人、收件人、主题、附件等) 3.发送此电子邮件(将其再次放入本地后缀中的队列) 我做了1和2,但第3个有问题 这就是我现在拥有的: package main import ( "fmt" "github.com/jhillyerd/go.enmime" //"github.com/sendgrid/

我想在Golang发一封电子邮件,但我有很多问题。我是围棋新手,所以可能这很简单,但我在医生上找不到答案

这就是我想做的: 1.从STDIN收到一封电子邮件 2.解析电子邮件(获取发件人、收件人、主题、附件等) 3.发送此电子邮件(将其再次放入本地后缀中的队列)

我做了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做了一些测试。 我所要做的就是再次从服务器向队列发送一封电子邮件(不做任何更改)。这些模块中的大多数都需要有Auth,但我只想简单地使用sendmail发送,就像我可以在bash中这样做一样:

# echo "test" | mail {address}

使用
net/smtp
您可以相当轻松地完成此操作。。。假设您有一个正在运行的smtp服务器,您可以在不进行身份验证的情况下连接到该服务器。我猜你想要实现的目标其实要简单得多,比如你的gmail()

无论如何,这里有两个代码示例来涵盖这两种情况

    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)
    }

或者,这里有一个使用简单auth的go操场示例;除非你已经有一个smtp服务器在你的开发设备上运行,否则下面类似的事情可能会容易得多。

旁注:不要全部读取,然后使用
bytes.NewBuffer
来“获取
io.Reader
”,而
os.Stdin
已经是
io.Reader
;不要在没有任何理由/反馈的情况下退出
err!=nil
,至少执行类似于
log.Fatal(err)
的操作。