impressive17
@impressive17

Как отправить письмо с помощью golang?

Пытаюсь отправить письмо с помощью пакета net/smtp
взял пример кода из оф документации https://pkg.go.dev/net/smtp#SendMail
привожу тут пример из доки, у себя поменял from, to, host( на smtp.gmail.com:587)
import (
	"log"
	"net/smtp"
)

func main() {
	// Set up authentication information.
	auth := smtp.PlainAuth("", "user@example.com", "password", "mail.example.com")

	// Connect to the server, authenticate, set the sender and recipient,
	// and send the email all in one step.
	to := []string{"recipient@example.net"}
	msg := []byte("To: recipient@example.net\r\n" +
		"Subject: discount Gophers!\r\n" +
		"\r\n" +
		"This is the email body.\r\n")
	err := smtp.SendMail("mail.example.com:25", auth, "sender@example.org", to, msg)
	if err != nil {
		log.Fatal(err)
	}
}


получаю ошибку
5.7.8 Username and Password not accepted. Learn more at
5.7.8  https://support.google.com/mail/?p=BadCredentials

Пароль верный, проверял

2FA выключена
Подскажите что не так?
  • Вопрос задан
  • 1539 просмотров
Пригласить эксперта
Ответы на вопрос 1
@fregate
Пишу, думаю
Если не принципиально использование smtp пакета, то я делал вот так:
import (
// ...
	gomail "gopkg.in/gomail.v2"
)

func makeMailer() (*gomail.Dialer, error) {
	smtp := "SMTP_MAIL_ADDRESS"
	port, err := strconv.Atoi("PORT_NUM")
	if err != nil {
		fmt.Println("error parsing smtp port.", err)
		return nil, err
	}
	name := "MAILER_AUTH_NAME"
	pwd := "MAILER_AUTH_PWD"
	if port == 0 || smtp == "" && name == "" {
		return nil, errors.New("invalid mailer parameters")
	}

	return gomail.NewDialer(smtp, port, name, pwd), nil
}

func send() (*..., error) {
	mailer, err := makeMailer()
	if err != nil {
		return nil, fmt.Errorf("can't create mailer. %v", err)
	}

	recipient := "MAILER_RECIPIENT"
	if recipient == "" {
		return nil, fmt.Errorf("empty recipient")
	}

	m := gomail.NewMessage()
	m.SetHeader("From", "MAILER_AUTH_NAME")
	m.SetHeader("To", "MAILER_RECIPIENT")
	m.SetHeader("Subject", "MAILER_SUBJECT")
	m.SetBody("text/plain", "MAIL_BODY_TEXT")

	err = mailer.DialAndSend(m)
	if err != nil {
		return nil, fmt.Errorf("can't send digest. %v", err)
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы