SMTP - это механизм отправки почты с одного конца на другой. Он работает на прикладном уровне модели TCP / IP. Иногда TLS или SSL используются для создания безопасного соединения между конечными системами.

Когда у клиента SMTP есть сообщение для передачи, он устанавливает двусторонний канал передачи на сервер SMTP. После установления соединения клиент инициирует почтовую транзакцию. Транзакция состоит из серии команд на сервер. Сервер отвечает на каждое сообщение ответом. В ответе указывается, была ли команда принята, требуются ли дополнительные данные или указана какая-либо ошибка.

Вот как осуществляется простое взаимодействие SMTP (исходная википедия).

SMTP транспортирует почтовый объект, а почтовый объект содержит конверт и почтовое содержимое. Конверт SMTP содержит

  1. создание сеанса и инициирование клиента: сервер отправляет приветственное сообщение, а клиент отправляет идентификационные данные. (EHLO)
  2. Почтовые транзакции: они состоят из команды MAIL FROM, команды RCPT TO и команды DATA.

Команда DATA указывает, что конверт закончился, и клиент отправит содержимое почты.

Пакет net / smtp предоставляет функции для всех команд ESMTP.

Для поля CC в сообщении SMTP рекомендует добавлять данные получателя CC в содержимое письма и отправлять одну и ту же копию всем получателям. Для BCC детали не добавляются в контент, но отправляется почта.

Пакет net / smtp Golang предоставляет функции для каждой из этих команд.

func Dial(addr string) (*Client, error) 
func NewClient(conn net.Conn, host string) (*Client, error) 
func (c *Client) Hello(localName string) error

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

func (c *Client) Mail(from string) error

Почтовый метод отправляет команду MAIL FROM.

func (c *Client) Rcpt(to string) error

Метод Rcpt отправляет команду RCPT TO.

func (c *Client) Data() (io.WriteCloser, error)

Метод Data () отправляет на сервер команду DATA. Он возвращает объект записи io. В этом объекте должно быть записано содержимое Почты для отправки.

func (c *Client) Close() error

Наконец, методы закрытия отправляют команду QUIT.

Вот примерный пример.

Не пытайся это сделать. Это не работает для Gmail. Gmail требует пароль для входа и SSL / TLS для сквозной безопасности.

Исходная реализация SMTP не обеспечивала защиты. Но со временем была добавлена ​​некоторая функция безопасности. Все SMTP-серверы поддерживают базу данных идентификаторов отправителей и сопоставление адресов FROM MAIL. Итак, когда пользователь отправляет письмо, идентификатор почты, указанный в команде FROM MAIL, должен быть сопоставлен с идентификатором пользователя. Всем SMTP-серверам также нужны клиенты для обеспечения некоторой сквозной безопасности.

Первая часть безопасности - использовать TLS вместо TCP. Метод NewClient () принимает объект net.conn и повторно использует это соединение для создания объекта клиента SMTP.

Когда клиент отправляет команду EHLO, сервер отвечает со списком поддерживаемых им расширений службы. Это расширение службы содержит список поддерживаемых им механизмов аутентификации. Это типичный ответ SMTP-сервера.

EHLO localhost
250-smtp.gmail.com at your service, [87.157.201.18]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8

Клиенту необходимо отправить данные AUTH после команды EHLO и перед командой MAIL FROM.

В нашем примере мы будем использовать ОБЫЧНУЮ аутентификацию.

В PLAIN auth клиент отправляет на сервер кортеж имени пользователя и пароля.

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

Полный пример кода можно найти здесь,

Для CC и BCC одна и та же почта должна быть отправлена ​​отдельным получателям. Содержание писем будет одинаковым для всех отправленных писем. Детали BCC не предоставляются в почтовом содержании.

Вот пример кода для CC и BCC.

Спасибо за прочтение !!