Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sendgrid: Allow to specify the content type #871

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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