email - 如何从 Go 发送电子邮件

标签 email parsing go

我正在尝试用 Golang 发送电子邮件,但遇到了很多问题。我是 Go 的新手,所以也许这很简单,但我无法在文档中找到答案。

这是我想做的: 1. 从 STDIN 收到一封电子邮件 2. 解析邮件(getting from, to, subject, attachments等) 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 做了一些测试。 我想要做的就是再次从服务器向队列发送一封电子邮件(不做任何更改)。这些模块中的大多数都需要 Auth,但我只想简单地使用 sendmail 发送,就像我在 bash 中执行此操作一样:

# echo "test" | mail {address}

最佳答案

使用 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 服务器,否则遵循类似的东西可能会容易得多。

关于email - 如何从 Go 发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31272725/

相关文章:

php - 在 PHPmailer 中设置原始 IP

Java邮件: sending email via gmail with TLS

python - 如何使用 django/python 解析外部 XML 文件

c# - 使用未初始化的变量 - 编译器已损坏

go - 并发信号量顺序执行

go - 在 Golang 中初始化接口(interface)数组

jquery - jQuery 中的 2+(多封)电子邮件验证文本输入

wordpress - 联系表格 7 显示已发送消息但未收到电子邮件

java - 用 Java 创建自然 DSL 的最佳工具是什么?

在命令行和 Playground 上进行整数溢出设置