Введение
В программе часто возникает необходимость отправлять электронные письма. Если возникает нештатная ситуация, администратор и ответственное лицо должны быть уведомлены.Пользователю может потребоваться сообщить информацию о заказе после размещения заказа.Платформы электронной коммерции, 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😄
Ссылаться на
- электронная почта GitHub:GitHub.com/Jordan-Однажды в сказке…
- Перейти на ежедневный репозиторий GitHub:GitHub.com/Darenjun/go-of…
я
Добро пожаловать, чтобы обратить внимание на мою общедоступную учетную запись WeChat [GoUpUp], учитесь вместе и добивайтесь прогресса вместе ~
Эта статья опубликована в блогеOpenWriteвыпуск!