Skip to content

Commit

Permalink
Sendgrid: Allow to specify the content type (#871)
Browse files Browse the repository at this point in the history
Co-authored-by: Niko Köser <[email protected]>
  • Loading branch information
firefart and nikoksr authored Nov 2, 2024
1 parent 9e1bf26 commit dc57a16
Showing 1 changed file with 38 additions and 12 deletions.
50 changes: 38 additions & 12 deletions service/sendgrid/sendgrid.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,23 @@ import (

// SendGrid struct holds necessary data to communicate with the SendGrid API.
type SendGrid struct {
usePlainText bool
client *sendgrid.Client
senderAddress string
senderName string
receiverAddresses []string
}

// BodyType is used to specify the format of the body.
type BodyType int

const (
// PlainText is used to specify that the body is plain text.
PlainText BodyType = iota
// HTML is used to specify that the body is HTML.
HTML
)

// New returns a new instance of a SendGrid notification service.
// You will need a SendGrid API key.
// See https://sendgrid.com/docs/for-developers/sending-email/api-getting-started/
Expand All @@ -27,6 +38,7 @@ func New(apiKey, senderAddress, senderName string) *SendGrid {
senderAddress: senderAddress,
senderName: senderName,
receiverAddresses: []string{},
usePlainText: false,
}
}

Expand All @@ -36,11 +48,30 @@ func (s *SendGrid) AddReceivers(addresses ...string) {
s.receiverAddresses = append(s.receiverAddresses, addresses...)
}

// BodyFormat can be used to specify the format of the body.
// Default BodyType is HTML.
func (s *SendGrid) BodyFormat(format BodyType) {
switch format {
case PlainText:
s.usePlainText = true
case HTML:
s.usePlainText = false
default:
s.usePlainText = false
}
}

// Send takes a message subject and a message body and sends them to all previously set chats. Message body supports
// html as markup language.
func (s SendGrid) Send(ctx context.Context, subject, message string) error {
from := mail.NewEmail(s.senderName, s.senderAddress)
content := mail.NewContent("text/html", message)
var contentType string
if s.usePlainText {
contentType = "text/plain"
} else {
contentType = "text/html"
}
content := mail.NewContent(contentType, message)

// Create a new personalization instance to be able to add multiple receiver addresses.
personalization := mail.NewPersonalization()
Expand All @@ -55,18 +86,13 @@ func (s SendGrid) Send(ctx context.Context, subject, message string) error {
mailMessage.AddContent(content)
mailMessage.SetFrom(from)

select {
case <-ctx.Done():
return ctx.Err()
default:
resp, err := s.client.Send(mailMessage)
if err != nil {
return fmt.Errorf("send message: %w", err)
}
resp, err := s.client.SendWithContext(ctx, mailMessage)
if err != nil {
return fmt.Errorf("send message: %w", err)
}

if resp.StatusCode != http.StatusAccepted {
return errors.New("the SendGrid endpoint did not accept the message")
}
if resp.StatusCode != http.StatusAccepted {
return errors.New("the SendGrid endpoint did not accept the message")
}

return nil
Expand Down

0 comments on commit dc57a16

Please sign in to comment.