diff --git a/service/mailgun/mailgun.go b/service/mailgun/mailgun.go index 12063c7de..cb6020c31 100644 --- a/service/mailgun/mailgun.go +++ b/service/mailgun/mailgun.go @@ -7,12 +7,20 @@ import ( "github.com/mailgun/mailgun-go/v5" ) +type mailgunMode int + +const ( + mailgunModeText mailgunMode = iota + mailgunModeHTML +) + // Mailgun struct holds necessary data to communicate with the Mailgun API. type Mailgun struct { client *mailgun.Client domain string senderAddress string receiverAddresses []string + mode mailgunMode } // New returns a new instance of a Mailgun notification service. @@ -24,6 +32,7 @@ func New(domain, apiKey, senderAddress string, opts ...Option) *Mailgun { domain: domain, senderAddress: senderAddress, receiverAddresses: []string{}, + mode: mailgunModeText, } for _, opt := range opts { @@ -39,10 +48,19 @@ func (m *Mailgun) AddReceivers(addresses ...string) { m.receiverAddresses = append(m.receiverAddresses, addresses...) } -// Send takes a message subject and a message body and sends them to all previously set chats. Message body supports -// html as markup language. +// Send takes a message subject and a message body and sends them to all previously added email receivers. +// The body is sent as plain text by default, or as HTML when the service is configured with WithHTML(). func (m Mailgun) Send(ctx context.Context, subject, message string) error { - mailMessage := mailgun.NewMessage(m.domain, m.senderAddress, subject, message, m.receiverAddresses...) + var mailMessage *mailgun.PlainMessage + switch m.mode { + case mailgunModeText: + mailMessage = mailgun.NewMessage(m.domain, m.senderAddress, subject, message, m.receiverAddresses...) + case mailgunModeHTML: + mailMessage = mailgun.NewMessage(m.domain, m.senderAddress, subject, "", m.receiverAddresses...) + mailMessage.SetHTML(message) + default: + return fmt.Errorf("unknown mailgun mode: %d", m.mode) + } _, err := m.client.Send(ctx, mailMessage) if err != nil { diff --git a/service/mailgun/options.go b/service/mailgun/options.go index a256f428d..82d46e9d8 100644 --- a/service/mailgun/options.go +++ b/service/mailgun/options.go @@ -13,3 +13,10 @@ func WithEurope() Option { _ = m.client.SetAPIBase(mailgun.APIBaseEU) } } + +// WithHTML sets the message mode to HTML. By default, the message mode is text. +func WithHTML() Option { + return func(m *Mailgun) { + m.mode = mailgunModeHTML + } +}