Вам часто может понадобиться отправить электронные письма многим учетным записям, используя программы для аутентификации и многих других целей.

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

Go предоставляет функциональные возможности для действий, связанных с электронной почтой, определенных RFC в пакете net/smtp, который также содержит расширения 8BITMIME, AUTH и STARTTLS.

Код, используемый в этом проекте, доступен в Репозиторий GitHub и вы можете использовать его бесплатно по лицензии MIT.

Как отправлять электронные письма в Go с помощью пакета Net/SMTP

Пакет net/smtp является частью стандартной библиотеки Go, поэтому вам не нужно устанавливать какой-либо внешний пакет. Вам нужно только импортировать пакет перед его использованием.

импорт (
"сеть/SMTP"
"журнал"
"крипто/TLS"
"ФМТ"
)

Вам также потребуется импортировать журнал package для регистрации ошибок в консоли и крипто/TLS пакет для настройки безопасного соединения.

После того, как вы импортировали пакет net/smtp, вы должны написать Отправить почту() для отправки почты, а затем вызвать функцию в основной функции.

функцияглавный() {
ФМТ Печать (Отправить почту())
}
функцияОтправить почту()нить {
// Добавляем сюда код
}

В Отправить почту() функция будет содержать код, который отправляет почту получателям.

Как работает отправка электронных писем

Протокол SMTP определяет параметры, которые должны быть у каждой почты. Этими параметрами являются почтовые адреса отправителя и получателя, порт, на который отправляется почта, хост-сервер и сообщение.

Указанные выше параметры важны для отправки писем.

В этом уроке вы научитесь отправлять электронные письма Yahoo. Однако этот процесс одинаков для любого поставщика почтовых серверов (MSP), который вы используете.

Поскольку вы используете Yahoo Mail, войдите в Почта Яху счет, перейти к Информация об аккаунте, и нажмите на Безопасность учетной записи вкладка Затем сгенерируйте пароль приложения. Вам нужно будет назвать приложение, а затем Yahoo Mail создаст пароль для приложения, и вы сможете использовать пароль в своем коде вместе со своим почтовым адресом.

в Отправить почту() function вы объявите три переменные; переменная, содержащая строку вашего адреса электронной почты, переменную, содержащую ваш пароль электронной почты, и строку, содержащую адрес электронной почты, на который вы отправляете сообщения.

от := "[email protected]"
пароль := "aSecurePasswordHere"
на := "[email protected]"

Вы можете использовать срез и цикл по элементам если вы собираетесь отправить их нескольким получателям.

Получение и настройка хоста и порта электронной почты

Протокол SMTP использует номера хоста и порта для идентификации источника электронной почты. Вот тут-то и пригодится ваш MSP. Вам необходимо знать номер хоста и порта, который позволяет использовать ваш MSP.

Проверьте этот ресурс для получения списка хостов MSP и номера портов если вы используете общедоступные электронные письма, такие как Gmail, Yahoo или Outlook. Google отключил «менее безопасные приложения» для Gmail; вы можете захотеть защитить свое приложение, если вы используете Gmail.

Получив номер порта и адрес хоста, назначьте их переменным следующим образом:

хост := "smtp.mail.yahoo.com"
порт := "465"

Приведенные выше номера хоста и порта взяты из Yahoo Mail для использования в обычных учетных записях. Сервер размещен по адресу smtp.mail.yahoo.com, и вам разрешено использовать порт 465 для отправки электронных писем.

Объявление содержимого электронной почты

Следующий шаг — объявить содержимое почты как переменные. Тема и тело составляют сообщение.

subject := "Эй, я просто проверяю тебя."
body := "Надеюсь, у тебя все хорошо! Как у тебя сегодня дела. "

В предмет переменная — тема письма; в тело переменная — это тело письма, которое вы отправляете.

Настройка заголовков электронной почты

Вам нужно будет составить карту строк для обозначения заголовков электронной почты.

заголовки := делать(карта[нить]нить)
заголовки["От"] = от
заголовки["Кому"] = кому
заголовки["Тема"] = тема
сообщение := ""
за к, в := диапазон заголовки {
сообщение += fmt. Sprintf("%s: %s\r", k, v)
}
сообщение += "\r" + тело

Сначала вы создаете карту строковых ключей и значений и устанавливаете заголовки вашего адреса, адреса получателя и темы, как показано выше. Использование диапазона for-loop на заголовки карта, а сообщение объявлена ​​переменная, содержащая заголовки и сообщение с использованием строкового форматирования.

Аутентификация электронной почты

Электронная почта требует аутентификации для проверки источника. Пакет smtp предоставляет функциональные возможности для проверки подлинности электронной почты с использованием PlainAuth. В PlainAuth Метод принимает идентификатор, адрес электронной почты отправителя, пароль и хост в качестве параметров и возвращает Авторизация объект, который вы будете использовать для отправки электронной почты.

аутентифицировать := smtp. PlainAuth("", от, пароль, хост)

Личность — это ваше имя пользователя, которое можно оставить пустым, как в данном случае.

Создание подключения для электронной почты

Некоторые поставщики почтовых услуг требуют, чтобы вы отправляли электронную почту через соединение. В этой статье мы будем делать TCP-соединение на сервер с конфигурациями TLS.

tlsConfig := &tls. Конфигурация{
Небезопасно пропустить проверку: истинный,
Имя сервера: хост,
}

В приведенном выше коде вы создали конфигурацию TLS, сославшись на Конфигурация структура где InsecureSkipVerify был установлен на истинный, а имя сервера было присвоено хозяин переменная.

Вы должны создать TCP-соединение, используя Набирать номер метод tls упаковка. В набирать номер метод принимает тип соединения (TCP), в данном случае адрес сервера и конфигурацию соединения TLS.


соединение, ошибка := tls. Dial("tcp", serverAddress, tlsConfig) ошибка != ноль {
журнал. Паника (ошибка)
}

В приведенном выше коде вы установили TCP-соединение и обработали ошибки; вы создадите новый пакет smtp, используя НовыйКлиент метод сеть/SMTP упаковка. В НовыйКлиент Метод принимает соединение и хост соответственно.

smtpClient, ошибка := smtp. NewClient (подключение, хост)
если ошибся != ноль {
журнал. Паника (ошибка)
}

Теперь, когда вы создали смтп клиентский экземпляр, вы должны установить параметры smtpClient и обрабатывать ошибки.

если ошибка = smtpClient. Auth (аутентифицировать); ошибся != ноль {
журнал. Паника (ошибка)
}
если ошибка = smtpClient. Почта (от); ошибся != ноль {
журнал. Паника (ошибка)
}
если ошибка = smtpClient. Rcpt (заголовки["Кому"]); ошибся != ноль {
журнал. Паника (ошибка)
}

В приведенном выше примере вы передали параметры аутентификации, адреса отправителя и адреса получателя соответствующим методам и обработали ошибки.

Наконец, вам нужно записать в экземпляр подключения, и вы можете сделать это, создав модуль записи с помощью Данные метод вашего smtp-клиент пример.

писатель, ошибка := smtpClient. Данные()
если ошибся != ноль {
журнал. Паника (ошибка)
}
_, ошибка = писатель. Напишите([]байт(сообщение))
если ошибся != ноль {
журнал. Паника (ошибка)
}

После создания модуля записи вы записываете байтовый фрагмент сообщения, используя Напишите метод, как в примере выше.

ошибся = писатель. Закрывать()
если ошибся != ноль {
журнал. Паника (ошибка)
}
ошибка = smtpClient. Покидать()
если ошибся != ноль {
возвращаться
}
возвращаться "Успешно, письмо отправлено!"

Закройте средство записи и выйдите из экземпляра подключения клиента smtp, используя приведенный выше код. В Отправить почту() Функция возвращает сообщение об успехе, как показано выше.

При вызове Отправить почту() функция в главный функция, вы должны получить сообщение об успешном выполнении, зарегистрированное на вашей консоли, и электронное письмо, отправленное вашему получателю.

В сетевом пакете есть еще

Пакет net содержит множество пакетов для сетевых функций, и пакет smtp — лишь один из них. Вы также можете использовать пакеты TCP и HTTP для разработки, связанной с сетью.

Пакет net/smtp может показаться вам слишком сложным, если вы не являетесь бэкэнд-разработчиком. Есть много других альтернатив для быстрой отправки электронных писем с меньшим количеством строк кода. Вы можете проверить компании по маркетингу электронной почты, такие как SendGrid, Twilio и MailChimp, и службы рассылки новостей, такие как Substack и Revue, которые позволяют без стресса отправлять электронные письма многим пользователям.