// File Path: monorepo/cloud/maplefile-backend/pkg/emailer/mailgun/mailgun.go package mailgun import ( "context" "time" "github.com/mailgun/mailgun-go/v4" ) type mailgunEmailer struct { config MailgunConfigurationProvider Mailgun *mailgun.MailgunImpl } func NewEmailer(config MailgunConfigurationProvider) Emailer { // Defensive code: Make sure we have access to the file before proceeding any further with the code. mg := mailgun.NewMailgun(config.GetDomainName(), config.GetAPIKey()) mg.SetAPIBase(config.GetAPIBase()) // Override to support our custom email requirements. return &mailgunEmailer{ config: config, Mailgun: mg, } } func (me *mailgunEmailer) Send(ctx context.Context, sender, subject, recipient, body string) error { message := me.Mailgun.NewMessage(sender, subject, "", recipient) message.SetHtml(body) ctx, cancel := context.WithTimeout(ctx, time.Second*10) defer cancel() // Send the message with a 10 second timeout _, _, err := me.Mailgun.Send(ctx, message) if err != nil { return err } return nil } func (me *mailgunEmailer) GetDomainName() string { return me.config.GetDomainName() } func (me *mailgunEmailer) GetSenderEmail() string { return me.config.GetSenderEmail() } func (me *mailgunEmailer) GetBackendDomainName() string { return me.config.GetBackendDomainName() } func (me *mailgunEmailer) GetFrontendDomainName() string { return me.config.GetFrontendDomainName() } func (me *mailgunEmailer) GetMaintenanceEmail() string { return me.config.GetMaintenanceEmail() }