resend.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package email
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gravitl/netmaker/servercfg"
  6. "github.com/resendlabs/resend-go"
  7. )
  8. // ResendEmailSender - implementation of EmailSender using Resend (https://resend.com)
  9. type ResendEmailSender struct {
  10. client ResendClient
  11. from string
  12. }
  13. // ResendClient - dependency interface for resend client
  14. type ResendClient interface {
  15. Send(*resend.SendEmailRequest) (resend.SendEmailResponse, error)
  16. }
  17. // NewResendEmailSender - constructs a ResendEmailSender
  18. func NewResendEmailSender(client ResendClient, from string) ResendEmailSender {
  19. return ResendEmailSender{client: client, from: from}
  20. }
  21. // NewResendEmailSender - constructs a ResendEmailSender from config
  22. // TODO let main.go handle this and use dependency injection instead of calling this function
  23. func NewResendEmailSenderFromConfig() ResendEmailSender {
  24. key, from := servercfg.GetEmaiSenderAuth(), servercfg.GetSenderEmail()
  25. resender := resend.NewClient(key)
  26. return NewResendEmailSender(resender.Emails, from)
  27. }
  28. // SendEmail - sends an email using resend-go (https://github.com/resendlabs/resend-go)
  29. func (es ResendEmailSender) SendEmail(ctx context.Context, notification Notification, email Mail) error {
  30. var (
  31. from = es.from
  32. to = notification.RecipientMail
  33. subject = email.GetSubject(notification)
  34. body = email.GetBody(notification)
  35. )
  36. params := resend.SendEmailRequest{
  37. From: from,
  38. To: []string{to},
  39. Subject: subject,
  40. Html: body,
  41. }
  42. _, err := es.client.Send(&params)
  43. if err != nil {
  44. return fmt.Errorf("failed sending mail via resend: %w", err)
  45. }
  46. return nil
  47. }