add email sender and send email with password

This commit is contained in:
2026-06-29 23:34:09 +07:00
parent 7806061313
commit 4d9b73cb34
4 changed files with 129 additions and 1 deletions
+94
View File
@@ -0,0 +1,94 @@
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
}