Простое письмо в Go
Отправка начинается с адреса SMTP-сервера и списка получателей в виде среза строк. Отдельно указывают адрес отправителя для протокола и готовое сообщение: заголовки, пустая строка и тело в одном срезе байтов.
На локальном приемнике авторизацию часто
не передают: вместо нее можно передать
nil. На настоящем сервере нужны
логин и пароль через smtp.PlainAuth,
иначе письмо не примут.
Соберем короткое письмо и отправим на
"127.0.0.1:1025":
package main
import (
"fmt"
"log"
"net/smtp"
)
func main() {
addr := "127.0.0.1:1025"
from := "sender@example.com"
to := []string{"receiver@example.com"}
msg := []byte(
"From: sender@example.com\r\n" +
"To: receiver@example.com\r\n" +
"Subject: hello\r\n" +
"\r\n" +
"plain text body",
)
err := smtp.SendMail(addr, nil, from, to, msg)
if err != nil {
log.Fatal(err)
}
fmt.Println("sent")
}
На экране "sent", если приемник
слушает порт. Заголовок To в тексте
сообщения должен совпадать с адресом в срезе
получателей для одного адресата.
Тот же прием с телом из нескольких строк через склеивание фрагментов:
package main
import (
"fmt"
"log"
"net/smtp"
)
func main() {
addr := "127.0.0.1:1025"
from := "notice@example.com"
to := []string{"user@example.com"}
body := "line one\r\nline two"
msg := []byte(
"From: notice@example.com\r\n" +
"To: user@example.com\r\n" +
"Subject: report\r\n" +
"\r\n" +
body,
)
err := smtp.SendMail(addr, nil, from, to, msg)
if err != nil {
log.Fatal(err)
}
fmt.Println("sent")
}
Даны адреса:
from := "bot@example.com"
to := []string{"client@example.com"}
addr := "127.0.0.1:1025"
Соберите сообщение с темой "ping"
и телом "ok", отправьте на
addr без авторизации и выведите
"done" при успехе.
Дан текст тела:
text := "reminder"
Допишите заголовки From,
To и Subject с адресами
"app@example.com" и
"staff@example.com", темой
"note", пустой строкой и
text, затем отправьте на локальный
порт 1025.
Скажите, зачем между блоком заголовков
и телом письма в срезе байтов нужна
отдельная строка "\r\n" без
текста заголовка.