Пакет mail
Обзор
Пакет mail реализует разбор почтовых сообщений.
В основном этот пакет следует синтаксису, определённому в RFC 5322 и расширенному в RFC 6532. Примечательные отличия:
- Устаревшие форматы адресов не разбираются, включая адреса со встроенной информацией о маршруте.
- Полный диапазон пробельных символов (синтаксический элемент CFWS) не поддерживается, например, перенос адресов на следующие строки.
- Нормализация Unicode не выполняется.
- Допускается начальная строка From, как в формате mbox (RFC 4155).
Указатель
Файлы пакета
message.go
Переменные
var ErrHeaderNotPresent = errors.New("mail: header not in message") func ParseDate 1.8
func ParseDate(date string) (time.Time, error)
ParseDate разбирает строку даты RFC 5322.
Пример
Код:
dateStr := "Wed, 09 Oct 2024 09:55:06 -0700"
t, err := mail.ParseDate(dateStr)
if err != nil {
log.Fatalf("Failed to parse date: %v", err)
}
fmt.Println(t.Format(time.RFC3339))
Результат:
2024-10-09T09:55:06-07:00
type Address
Address представляет один почтовый адрес. Адрес, например "Barry Gibbs <bg@example.com>", представляется как Address{Name: "Barry Gibbs", Address: "bg@example.com"}.
type Address struct {
Name string // Proper name; may be empty.
Address string // user@domain
}
func ParseAddress 1.1
func ParseAddress(address string) (*Address, error)
ParseAddress разбирает один адрес RFC 5322, например "Barry Gibbs <bg@example.com>"
Пример
Код:
e, err := mail.ParseAddress("Alice <alice@example.com>")
if err != nil {
log.Fatal(err)
}
fmt.Println(e.Name, e.Address)
Результат:
Alice alice@example.com
func ParseAddressList 1.1
func ParseAddressList(list string) ([]*Address, error)
ParseAddressList разбирает указанную строку как список адресов.
Пример
Код:
const list = "Alice <alice@example.com>, Bob <bob@example.com>, Eve <eve@example.com>"
emails, err := mail.ParseAddressList(list)
if err != nil {
log.Fatal(err)
}
for _, v := range emails {
fmt.Println(v.Name, v.Address)
}
Результат:
Alice alice@example.com Bob bob@example.com Eve eve@example.com
func (*Address) String
func (a *Address) String() string
String форматирует адрес в соответствии с RFC 5322. Если имя адреса содержит символы, отличные от ASCII, оно будет представлено согласно RFC 2047.
type AddressParser 1.5
AddressParser — это парсер адресов RFC 5322.
type AddressParser struct {
// WordDecoder optionally specifies a decoder for RFC 2047 encoded-words.
WordDecoder *mime.WordDecoder
}
func (*AddressParser) Parse 1.5
func (p *AddressParser) Parse(address string) (*Address, error)
Parse разбирает один адрес RFC 5322 вида "Gogh Fir <gf@example.com>" или "foo@example.com".
func (*AddressParser) ParseList 1.5
func (p *AddressParser) ParseList(list string) ([]*Address, error)
ParseList разбирает указанную строку как список адресов, разделённых запятыми, вида "Gogh Fir <gf@example.com>" или "foo@example.com".
type Header
Header представляет пары «ключ — значение» в заголовке почтового сообщения.
type Header map[string][]string
func (Header) AddressList
func (h Header) AddressList(key string) ([]*Address, error)
AddressList разбирает указанное поле заголовка как список адресов.
func (Header) Date
func (h Header) Date() (time.Time, error)
Date разбирает поле заголовка Date.
func (Header) Get
func (h Header) Get(key string) string
Get возвращает первое значение, связанное с указанным ключом. Регистр символов не учитывается; для приведения указанного ключа к каноническому виду используется CanonicalMIMEHeaderKey. Если с ключом не связано ни одного значения, Get возвращает "". Чтобы получить несколько значений ключа или использовать неканонические ключи, обратитесь напрямую к карте.
type Message
Message представляет разобранное почтовое сообщение.
type Message struct {
Header Header
Body io.Reader
}
func ReadMessage
func ReadMessage(r io.Reader) (msg *Message, err error)
ReadMessage читает сообщение из r. Заголовки разбираются, а тело сообщения становится доступно для чтения через msg.Body.
Пример
Код:
msg := `Date: Mon, 23 Jun 2015 11:40:36 -0400
From: Gopher <from@example.com>
To: Another Gopher <to@example.com>
Subject: Gophers at Gophercon
Message body
`
r := strings.NewReader(msg)
m, err := mail.ReadMessage(r)
if err != nil {
log.Fatal(err)
}
header := m.Header
fmt.Println("Date:", header.Get("Date"))
fmt.Println("From:", header.Get("From"))
fmt.Println("To:", header.Get("To"))
fmt.Println("Subject:", header.Get("Subject"))
body, err := io.ReadAll(m.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", body)
Результат:
Date: Mon, 23 Jun 2015 11:40:36 -0400 From: Gopher <from@example.com> To: Another Gopher <to@example.com> Subject: Gophers at Gophercon Message body
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/net/mail/