71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package email
|
|
|
|
import (
|
|
"fmt"
|
|
"history-api/assets"
|
|
"history-api/pkg/config"
|
|
"history-api/pkg/constants"
|
|
"strings"
|
|
|
|
"github.com/wneessen/go-mail"
|
|
)
|
|
|
|
func SendMailOTP(toEmail, otpCode string, tokenType constants.TokenType) error {
|
|
userSmtp, err := config.GetConfig("SMTP_USER")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
passSmtp, err := config.GetConfig("SMTP_PASS")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var subject string
|
|
var templatePath string
|
|
|
|
switch tokenType {
|
|
case constants.TokenPasswordReset:
|
|
subject = "Your Password Reset Code"
|
|
templatePath = "resources/password_reset.html"
|
|
case constants.TokenEmailVerify:
|
|
subject = "Verify your email address"
|
|
templatePath = "resources/email_verify.html"
|
|
default:
|
|
return fmt.Errorf("invalid token type: %v", tokenType)
|
|
}
|
|
htmlTemplate, err := assets.GetFileContent(templatePath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to read email template: %s", err)
|
|
}
|
|
|
|
message := mail.NewMsg()
|
|
if err := message.From(userSmtp); err != nil {
|
|
return fmt.Errorf("failed to set From email address: %s", err)
|
|
}
|
|
if err := message.To(toEmail); err != nil {
|
|
return fmt.Errorf("failed to set To email address: %s", err)
|
|
}
|
|
|
|
finalHTML := strings.ReplaceAll(htmlTemplate, "{{OTP_CODE}}", otpCode)
|
|
|
|
message.Subject(subject)
|
|
message.SetBodyString(mail.TypeTextHTML, finalHTML)
|
|
client, err := mail.NewClient(
|
|
"smtp.gmail.com",
|
|
mail.WithSMTPAuth(mail.SMTPAuthAutoDiscover),
|
|
mail.WithTLSPortPolicy(mail.TLSMandatory),
|
|
mail.WithUsername(userSmtp),
|
|
mail.WithPassword(passSmtp),
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create mail client: %s", err)
|
|
}
|
|
|
|
err = client.DialAndSend(message)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to send mail: %s", err)
|
|
}
|
|
return nil
|
|
}
|