Skip to content

Commit e924f54

Browse files
authored
feat: add headers support to sendgrid mail (#31)
* feat: add headers support to sendgrid mail * fixup! feat: add headers support to sendgrid mail * fixup! fixup! feat: add headers support to sendgrid mail
1 parent 5bee41d commit e924f54

File tree

6 files changed

+46
-9
lines changed

6 files changed

+46
-9
lines changed

.github/workflows/build-and-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
2828
- name: Generate code
2929
run: |
30-
docker run --rm -v ${GITHUB_WORKSPACE}:/local openapitools/openapi-generator-cli generate -i /local/api/notification-service.yaml -g go-server -o /local/ -p sourceFolder=internal/server -p packageName=server --git-user-id=commitdev --git-repo-id=zero-notification-service
30+
docker run --rm -v ${GITHUB_WORKSPACE}:/local openapitools/openapi-generator:cli-5.3.x generate -i /local/api/notification-service.yaml -g go-server -o /local/ -p sourceFolder=internal/server -p packageName=server --git-user-id=commitdev --git-repo-id=zero-notification-service
3131
sudo chmod -R a+rw ${GITHUB_WORKSPACE}
3232
go get golang.org/x/tools/cmd/goimports
3333
goimports -w ${GITHUB_WORKSPACE}/internal/server/

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
.env
12
.envrc
23
zero-notification-service
34
.history/

api/notification-service.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,8 @@ components:
262262
$ref: '#/components/schemas/EmailSender'
263263
message:
264264
$ref: '#/components/schemas/MailMessage'
265+
headers:
266+
$ref: '#/components/schemas/MailHeaders'
265267

266268
SendBulkMailRequest:
267269
type: object
@@ -285,6 +287,8 @@ components:
285287
$ref: '#/components/schemas/EmailSender'
286288
message:
287289
$ref: '#/components/schemas/MailMessage'
290+
headers:
291+
$ref: '#/components/schemas/MailHeaders'
288292

289293
MailMessage:
290294
type: object
@@ -305,6 +309,11 @@ components:
305309
description: Schedule these mesages to go out at the time specified by this UNIX timestamp
306310
format: int64
307311

312+
MailHeaders:
313+
type: object
314+
additionalProperties:
315+
type: string
316+
308317
SendSMSRequest:
309318
type: object
310319
required:

internal/mail/mail.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ type Client interface {
2222

2323
// SendBulkMail sends a batch of email messages to all the specified recipients
2424
// All the calls to send mail happen in parallel, with their responses returned on the provided channel
25-
func SendBulkMail(toList []server.EmailRecipient, from server.EmailSender, cc []server.EmailRecipient, bcc []server.EmailRecipient, message server.MailMessage, client Client, responseChannel chan BulkSendAttempt) {
25+
func SendBulkMail(toList []server.EmailRecipient, from server.EmailSender, cc []server.EmailRecipient, bcc []server.EmailRecipient, headers map[string]string, message server.MailMessage, client Client, responseChannel chan BulkSendAttempt) {
2626
wg := sync.WaitGroup{}
2727
wg.Add(len(toList))
2828

2929
// Create goroutines for each send
3030
for _, to := range toList {
3131
go func(to server.EmailRecipient) {
32-
response, err := SendIndividualMail([]server.EmailRecipient{to}, from, cc, bcc, message, client)
32+
response, err := SendIndividualMail([]server.EmailRecipient{to}, from, cc, bcc, headers, message, client)
3333
responseChannel <- BulkSendAttempt{to.Address, response, err}
3434
wg.Done()
3535
}(to)
@@ -42,7 +42,7 @@ func SendBulkMail(toList []server.EmailRecipient, from server.EmailSender, cc []
4242
}
4343

4444
// SendIndividualMail sends an email message
45-
func SendIndividualMail(to []server.EmailRecipient, from server.EmailSender, cc []server.EmailRecipient, bcc []server.EmailRecipient, message server.MailMessage, client Client) (*rest.Response, error) {
45+
func SendIndividualMail(to []server.EmailRecipient, from server.EmailSender, cc []server.EmailRecipient, bcc []server.EmailRecipient, headers map[string]string, message server.MailMessage, client Client) (*rest.Response, error) {
4646
sendMessage := sendgridMail.NewV3Mail()
4747

4848
sendMessage.SetFrom(sendgridMail.NewEmail(from.Name, from.Address))
@@ -72,6 +72,12 @@ func SendIndividualMail(to []server.EmailRecipient, from server.EmailSender, cc
7272
}
7373
sendMessage.AddPersonalizations(personalization)
7474

75+
if len(headers) > 0 {
76+
for key, value := range headers {
77+
sendMessage.SetHeader(key, value)
78+
}
79+
}
80+
7581
return client.Send(sendMessage)
7682
}
7783

internal/mail/mail_test.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,42 @@ type FakeClient struct {
2020

2121
// Mock the Send function
2222
func (cl *FakeClient) Send(email *sendgridMail.SGMailV3) (*rest.Response, error) {
23-
cl.Called()
23+
cl.Called(email)
2424
return nil, nil
2525
}
2626

27+
func TestSendMail(t *testing.T) {
28+
toList := createRandomRecipients(1, 1)
29+
cc := make([]server.EmailRecipient, 0)
30+
bcc := make([]server.EmailRecipient, 0)
31+
from := server.EmailSender{Name: "Test User", Address: "[email protected]"}
32+
headers := map[string]string{
33+
"X-Test-Header": "Test Header Value",
34+
}
35+
message := server.MailMessage{Subject: "Subject", Body: "Body"}
36+
client := FakeClient{}
37+
38+
headersMatcher := mock.MatchedBy(func(m *sendgridMail.SGMailV3) bool {
39+
return m.Headers["X-Test-Header"] == headers["X-Test-Header"]
40+
})
41+
client.On("Send", headersMatcher).Return(nil, nil)
42+
mail.SendIndividualMail(toList, from, cc, bcc, headers, message, &client)
43+
client.AssertNumberOfCalls(t, "Send", 1)
44+
}
45+
2746
func TestSendBulkMail(t *testing.T) {
2847
toList := createRandomRecipients(2, 5)
2948
cc := make([]server.EmailRecipient, 0)
3049
bcc := make([]server.EmailRecipient, 0)
3150
from := server.EmailSender{Name: "Test User", Address: "[email protected]"}
51+
headers := make(map[string]string)
3252
message := server.MailMessage{Subject: "Subject", Body: "Body"}
3353
client := FakeClient{}
3454

35-
client.On("Send").Return(nil, nil)
55+
client.On("Send", mock.Anything).Return(nil, nil)
3656

3757
responseChannel := make(chan mail.BulkSendAttempt)
38-
mail.SendBulkMail(toList, from, cc, bcc, message, &client, responseChannel)
58+
mail.SendBulkMail(toList, from, cc, bcc, headers, message, &client, responseChannel)
3959

4060
// Range over the channel until empty
4161
returnedCount := 0

internal/service/api_email_service.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ func (s *EmailApiService) SendEmail(ctx context.Context, sendMailRequest server.
4242
}
4343

4444
client := sendgrid.NewSendClient(s.config.SendgridAPIKey)
45-
response, err := mail.SendIndividualMail(sendMailRequest.ToAddresses, sendMailRequest.FromAddress, sendMailRequest.CcAddresses, sendMailRequest.BccAddresses, sendMailRequest.Message, client)
45+
46+
response, err := mail.SendIndividualMail(sendMailRequest.ToAddresses, sendMailRequest.FromAddress, sendMailRequest.CcAddresses, sendMailRequest.BccAddresses, sendMailRequest.Headers, sendMailRequest.Message, client)
4647

4748
if err != nil {
4849
zap.S().Errorf("Error sending mail: %v", response)
@@ -79,7 +80,7 @@ func (s *EmailApiService) SendBulk(ctx context.Context, sendBulkMailRequest serv
7980

8081
responseChannel := make(chan mail.BulkSendAttempt)
8182

82-
mail.SendBulkMail(sendBulkMailRequest.ToAddresses, sendBulkMailRequest.FromAddress, sendBulkMailRequest.CcAddresses, sendBulkMailRequest.BccAddresses, sendBulkMailRequest.Message, client, responseChannel)
83+
mail.SendBulkMail(sendBulkMailRequest.ToAddresses, sendBulkMailRequest.FromAddress, sendBulkMailRequest.CcAddresses, sendBulkMailRequest.BccAddresses, sendBulkMailRequest.Headers, sendBulkMailRequest.Message, client, responseChannel)
8384

8485
var successful []server.SendBulkMailResponseSuccessful
8586
var failed []server.SendBulkMailResponseFailed

0 commit comments

Comments
 (0)