Электронная почта Go Daily Library

Go

Введение

В программе часто возникает необходимость отправлять электронные письма. Если возникает нештатная ситуация, администратор и ответственное лицо должны быть уведомлены.Пользователю может потребоваться сообщить информацию о заказе после размещения заказа.Платформы электронной коммерции, China Mobile и China Unicom имеют ежемесячные счета, которые могут быть отправлено по электронной почте. И большая часть спама, который мы обычно получаем, тоже рассылается таким образом😭. Итак, как отправить почту на языке Go? В этой статье мы знакомимemailпользование библиотекой.

быстрый в использовании

Использование этой библиотеки не быстрое, почему?

Сначала установите библиотеку, это само собой разумеется:

$ go get github.com/jordan-wright/email

Нам нужна дополнительная работа. Мы знаем, что почтовые ящики используютSMTP/POP3/IMAPи другие протоколы для получения почты с почтового сервера. Электронная почта не отправляется непосредственно в почтовый ящик, а запрашивается почтовым ящиком. Итак, нам нужно настроитьSMTP/POP3/IMAPсервер. Можно собрать с нуля, есть готовые библиотеки с открытым исходным кодом, но это более хлопотно. Теперь общие поставщики услуг почтовых ящиков открытыSMTP/POP3/IMAPсервер. Здесь я беру для примера 126 почтовых ящиков, используюSMTPсервер. Конечно, вы также можете использовать почтовый ящик QQ.

  • Сначала войдите в почтовый ящик;
  • Нажмите «Настройки» вверху и выберитеPOP3/SMTP/IMAP;
  • Нажмите, чтобы открытьIMAP/SMTPСервис, следуйте инструкциям для открытия, там есть установка пароля, запомните этот пароль, он пригодится позже.

Затем вы можете закодировать:

package main

import (
  "log"
  "net/smtp"

  "github.com/jordan-wright/email"
)

func main() {
  e := email.NewEmail()
  e.From = "dj <xxx@126.com>"
  e.To = []string{"935653229@qq.com"}
  e.Subject = "Awesome web"
  e.Text = []byte("Text Body is, of course, supported!")
  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"))
  if err != nil {
    log.Fatal(err)
  }
}

Для сохранности моей информации, я спрятал настоящую информацию здесь. в кодеxxxЗамените своей учетной записью электронной почты,yyyЗамените паролем, установленным выше.

Шаги кода относительно просты и понятны:

  • сначала позвониNewEmailсоздать электронное письмо;
  • настраиватьFromотправитель,Toполучатель,Subjectтема письма (заголовок),Textнастроить содержимое электронной почты;
  • тогда позвониSendОтправить, параметр 1 — это адрес SMTP-сервера, а параметр 2 — информация для аутентификации.

Запуск программы отправит электронное письмо на мой почтовый ящик QQ:

Некоторые почтовые ящики помещают такие письма в корзину, например QQ😭. Если вы не можете найти его в папке «Входящие», не забудьте заглянуть в корзину.

копия

Обычно, когда мы отправляем электронные письма, мы можем копировать некоторых людей, а некоторые люди хотятскрытая копия😄, а именно CC (копия) и BCC (слепая копия).emailМы также можем установить эти два параметра:

package main

import (
  "log"
  "net/smtp"

  "github.com/jordan-wright/email"
)

func main() {
  e := email.NewEmail()
  e.From = "dj <xxx@126.com>"
  e.To = []string{"935653229@qq.com"}
  e.Cc = []string{"test1@126.com", "test2@126.com"}
  e.Bcc = []string{"secret@126.com"}
  e.Subject = "Awesome web"
  e.Text = []byte("Text Body is, of course, supported!")
  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"))
  if err != nil {
    log.Fatal(err)
  }
}

Все так же, замените копию электронной почты самостоятельноtest1/test2/secretИспользуй свой собственный.

Запуск программы отправит электронное письмо на мой адрес электронной почты QQ и скопирует его в другой мой почтовый ящик 126:

HTML-формат

Отправляйте обычный текст, электронные письма не очень красивы.emailПоддерживает отправку содержимого в формате HTML. Подобно отправке обычного текста, напрямую задайтеHTMLПоле:

package main

import (
  "log"
  "net/smtp"

  "github.com/jordan-wright/email"
)

func main() {
  e := email.NewEmail()
  e.From = "dj <xxx@126.com>"
  e.To = []string{"935653229@qq.com"}
  e.Cc = []string{"xxx@126.com"}
  e.Subject = "Go 每日一库"
  e.HTML = []byte(`
  <ul>
<li><a "https://darjun.github.io/2020/01/10/godailylib/flag/">Go 每日一库之 flag</a></li>
<li><a "https://darjun.github.io/2020/01/10/godailylib/go-flags/">Go 每日一库之 go-flags</a></li>
<li><a "https://darjun.github.io/2020/01/14/godailylib/go-homedir/">Go 每日一库之 go-homedir</a></li>
<li><a "https://darjun.github.io/2020/01/15/godailylib/go-ini/">Go 每日一库之 go-ini</a></li>
<li><a "https://darjun.github.io/2020/01/17/godailylib/cobra/">Go 每日一库之 cobra</a></li>
<li><a "https://darjun.github.io/2020/01/18/godailylib/viper/">Go 每日一库之 viper</a></li>
<li><a "https://darjun.github.io/2020/01/19/godailylib/fsnotify/">Go 每日一库之 fsnotify</a></li>
<li><a "https://darjun.github.io/2020/01/20/godailylib/cast/">Go 每日一库之 cast</a></li>
</ul>
  `)
  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"))
  if err != nil {
    log.Fatal("failed to send email:", err)
  }
}

Отправить результат:

Обратите внимание, что обнаружение SMTP-сервером 126 является относительно строгим.После добавления HTML его легко определить как спам и запретить отправку.В настоящее время сам CC в порядке.

Приложение

Также легко добавить вложения, просто позвонитеAttachFileТолько что:

package main

import (
  "log"
  "net/smtp"

  "github.com/jordan-wright/email"
)

func main() {
  e := email.NewEmail()
  e.From = "dj <xxx@126.com>"
  e.To = []string{"935653229@qq.com"}
  e.Subject = "Go 每日一库"
  e.Text = []byte("请看附件")
  e.AttachFile("test.txt")
  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"))
  if err != nil {
    log.Fatal("failed to send email:", err)
  }
}

входящие сообщения на почте:

пул соединений

Фактически каждый звонокSendКаждый раз, когда устанавливается соединение с SMTP-сервером, могут возникнуть проблемы с производительностью, если часто отправляется много писем.emailПул подключений предоставляется для повторного использования сетевых подключений:

package main

import (
  "fmt"
  "log"
  "net/smtp"
  "os"
  "sync"
  "time"

  "github.com/jordan-wright/email"
)

func main() {
  ch := make(chan *email.Email, 10)
  p, err := email.NewPool(
    "smtp.126.com:25",
    4,
    smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"),
  )

  if err != nil {
    log.Fatal("failed to create pool:", err)
  }

  var wg sync.WaitGroup
  wg.Add(4)
  for i := 0; i < 4; i++ {
    go func() {
      defer wg.Done()
      for e := range ch {
        err := p.Send(e, 10*time.Second)
        if err != nil {
          fmt.Fprintf(os.Stderr, "email:%v sent error:%v\n", e, err)
        }
      }
    }()
  }

  for i := 0; i < 10; i++ {
    e := email.NewEmail()
    e.From = "dj <xxx@126.com>"
    e.To = []string{"935653229@qq.com"}
    e.Subject = "Awesome web"
    e.Text = []byte(fmt.Sprintf("Awesome Web %d", i+1))
    ch <- e
  }

  close(ch)
  wg.Wait()
}

В приведенной выше программе мы создаем 4 горутины для совместного использования пула соединений для отправки электронных писем, и программа завершает работу после отправки 10 электронных писем. Чтобы дождаться отправки почты или сбоя перед выходом из программы, мы используемsync.WaitGroup.

Почтовый ящик был взорван:

Из-за использования горутин доставка по почте не гарантируется.

Суммировать

В этой статье описано как использовать программу Go для отправки почты, код программы выложен на GitHubGitHub.com/Darenjun/go-of…. Все коды прошли тест, пожалуйста, будьте уверены, чтобы съесть ~

Если вы найдете забавную и простую в использовании языковую библиотеку Go, добро пожаловать, чтобы отправить вопрос на Go Daily Library GitHub😄

Ссылаться на

  1. электронная почта GitHub:GitHub.com/Jordan-Однажды в сказке…
  2. Перейти на ежедневный репозиторий GitHub:GitHub.com/Darenjun/go-of…

я

мой блог

Добро пожаловать, чтобы обратить внимание на мою общедоступную учетную запись WeChat [GoUpUp], учитесь вместе и добивайтесь прогресса вместе ~

Эта статья опубликована в блогеOpenWriteвыпуск!