generated from VLADIMIR/template
95 lines
1.7 KiB
Go
95 lines
1.7 KiB
Go
package email_sender
|
|
|
|
import (
|
|
"context"
|
|
"crypto/tls"
|
|
"fmt"
|
|
"net/smtp"
|
|
)
|
|
|
|
type sender struct {
|
|
smtpHost string
|
|
smtpPort string
|
|
smtpUser string
|
|
smtpPassword string
|
|
}
|
|
|
|
func NewSender(
|
|
smtpHost string,
|
|
smtpPort string,
|
|
smtpUser string,
|
|
smtpPassword string,
|
|
) IEmailSender {
|
|
return &sender{
|
|
smtpHost: smtpHost,
|
|
smtpPort: smtpPort,
|
|
smtpUser: smtpUser,
|
|
smtpPassword: smtpPassword,
|
|
}
|
|
}
|
|
|
|
func (s *sender) Send(_ context.Context, message Message) error {
|
|
emailMessage := []byte(fmt.Sprintf(
|
|
"To: %s\r\n"+
|
|
"Subject: %s\r\n"+
|
|
"MIME-Version: 1.0\r\n"+
|
|
"Content-Type: text/plain; charset=utf-8\r\n"+
|
|
"\r\n"+
|
|
"%s\r\n",
|
|
message.To,
|
|
message.Subject,
|
|
message.Body,
|
|
))
|
|
|
|
// Настраиваем TLS
|
|
tlsConfig := &tls.Config{
|
|
ServerName: s.smtpHost,
|
|
}
|
|
|
|
// Подключаемся к серверу
|
|
conn, err := tls.Dial("tcp", s.smtpHost+":"+s.smtpPort, tlsConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer conn.Close()
|
|
|
|
// Создаем SMTP клиент
|
|
client, err := smtp.NewClient(conn, s.smtpHost)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer client.Quit()
|
|
|
|
// Аутентификация
|
|
auth := smtp.PlainAuth("", s.smtpUser, s.smtpPassword, s.smtpHost)
|
|
if err = client.Auth(auth); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Указываем отправителя
|
|
if err = client.Mail(s.smtpUser); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Указываем получателя
|
|
if err = client.Rcpt(message.To); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Отправляем данные письма
|
|
w, err := client.Data()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = w.Write(emailMessage)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = w.Close()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|