| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | package gomailimport (	"errors"	"fmt"	"io"	"net/mail")// Sender is the interface that wraps the Send method.//// Send sends an email to the given addresses.type Sender interface {	Send(from string, to []string, msg io.WriterTo) error}// SendCloser is the interface that groups the Send and Close methods.type SendCloser interface {	Sender	Close() error}// A SendFunc is a function that sends emails to the given addresses.//// The SendFunc type is an adapter to allow the use of ordinary functions as// email senders. If f is a function with the appropriate signature, SendFunc(f)// is a Sender object that calls f.type SendFunc func(from string, to []string, msg io.WriterTo) error// Send calls f(from, to, msg).func (f SendFunc) Send(from string, to []string, msg io.WriterTo) error {	return f(from, to, msg)}// Send sends emails using the given Sender.func Send(s Sender, msg ...*Message) error {	for i, m := range msg {		if err := send(s, m); err != nil {			return fmt.Errorf("gomail: could not send email %d: %v", i+1, err)		}	}	return nil}func send(s Sender, m *Message) error {	from, err := m.getFrom()	if err != nil {		return err	}	to, err := m.getRecipients()	if err != nil {		return err	}	if err := s.Send(from, to, m); err != nil {		return err	}	return nil}func (m *Message) getFrom() (string, error) {	from := m.header["Sender"]	if len(from) == 0 {		from = m.header["From"]		if len(from) == 0 {			return "", errors.New(`gomail: invalid message, "From" field is absent`)		}	}	return parseAddress(from[0])}func (m *Message) getRecipients() ([]string, error) {	n := 0	for _, field := range []string{"To", "Cc", "Bcc"} {		if addresses, ok := m.header[field]; ok {			n += len(addresses)		}	}	list := make([]string, 0, n)	for _, field := range []string{"To", "Cc", "Bcc"} {		if addresses, ok := m.header[field]; ok {			for _, a := range addresses {				addr, err := parseAddress(a)				if err != nil {					return nil, err				}				list = addAddress(list, addr)			}		}	}	return list, nil}func addAddress(list []string, addr string) []string {	for _, a := range list {		if addr == a {			return list		}	}	return append(list, addr)}func parseAddress(field string) (string, error) {	addr, err := mail.ParseAddress(field)	if err != nil {		return "", fmt.Errorf("gomail: invalid address %q: %v", field, err)	}	return addr.Address, nil}
 |