Skip to content

Commit 77ea481

Browse files
authored
Upgrade to github.com/aws/aws-sdk-go-v2 (#16)
1 parent 7c9f82f commit 77ea481

File tree

4 files changed

+90
-55
lines changed

4 files changed

+90
-55
lines changed

email/ses/ses.go

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,20 @@ package ses
33
import (
44
"bytes"
55
"context"
6+
"errors"
67
"fmt"
78
"html/template"
89
netMail "net/mail"
910
textTemplate "text/template"
1011

1112
jt "github.com/MicahParks/jsontype"
12-
"github.com/aws/aws-sdk-go/aws"
13-
"github.com/aws/aws-sdk-go/aws/awserr"
14-
"github.com/aws/aws-sdk-go/aws/credentials"
15-
"github.com/aws/aws-sdk-go/aws/session"
16-
"github.com/aws/aws-sdk-go/service/ses"
17-
13+
mld "github.com/MicahParks/magiclinksdev"
1814
"github.com/MicahParks/magiclinksdev/email"
15+
"github.com/aws/aws-sdk-go-v2/aws"
16+
"github.com/aws/aws-sdk-go-v2/config"
17+
"github.com/aws/aws-sdk-go-v2/credentials"
18+
"github.com/aws/aws-sdk-go-v2/service/sesv2"
19+
"github.com/aws/aws-sdk-go-v2/service/sesv2/types"
1920
)
2021

2122
const (
@@ -59,19 +60,21 @@ type SES struct {
5960
magicLinkTxtTmpl *textTemplate.Template
6061
oTPHTMLTmpl *template.Template
6162
oTPTxtTmpl *textTemplate.Template
62-
ses *ses.SES
63+
ses *sesv2.Client
6364
}
6465

6566
// NewProvider creates a new SES provider. It will create an AWS session using the provided configuration.
66-
func NewProvider(conf Config) (SES, error) {
67-
sess, err := session.NewSession(&aws.Config{
68-
Credentials: credentials.NewStaticCredentials(conf.AccessKeyID, conf.SecretKey, ""),
69-
Region: aws.String(conf.AWSRegion),
67+
func NewProvider(ctx context.Context, conf Config) (SES, error) {
68+
appCreds := aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(conf.AccessKeyID, conf.SecretKey, ""))
69+
cfg, err := config.LoadDefaultConfig(ctx, func(o *config.LoadOptions) error {
70+
o.Credentials = appCreds
71+
o.Region = conf.AWSRegion
72+
return nil
7073
})
7174
if err != nil {
72-
return SES{}, fmt.Errorf("failed to create AWS session: %w", err)
75+
return SES{}, fmt.Errorf("failed to load default AWS config: %w", err)
7376
}
74-
svc := ses.New(sess)
77+
svc := sesv2.NewFromConfig(cfg)
7578
requiredConf := InitializedConfig{
7679
FromEmail: conf.FromEmail.Get(),
7780
}
@@ -83,7 +86,7 @@ func NewProvider(conf Config) (SES, error) {
8386
}
8487

8588
// NewProviderInitialized creates a new SES provider with an initialized configuration.
86-
func NewProviderInitialized(conf InitializedConfig, svc *ses.SES) (SES, error) {
89+
func NewProviderInitialized(conf InitializedConfig, svc *sesv2.Client) (SES, error) {
8790
magicLinkHTMLTmpl := template.Must(template.New("").Parse(email.MagicLinkHTMLTemplate))
8891
magicLinkTxtTML := textTemplate.Must(textTemplate.New("").Parse(email.MagicLinkTextTemplate))
8992
otpHTMLTmpl := template.Must(template.New("").Parse(email.OTPHTMLTemplate))
@@ -118,45 +121,42 @@ func (s SES) sendEmail(ctx context.Context, e email.Email, htmlTmpl *template.Te
118121
return fmt.Errorf("failed to execute template for text email: %w", err)
119122
}
120123

121-
input := &ses.SendEmailInput{
122-
Destination: &ses.Destination{
123-
ToAddresses: []*string{
124-
aws.String(e.To.String()),
124+
input := &sesv2.SendEmailInput{
125+
Destination: &types.Destination{
126+
ToAddresses: []string{
127+
e.To.String(),
125128
},
126129
},
127-
Message: &ses.Message{
128-
Body: &ses.Body{
129-
Html: &ses.Content{
130-
Charset: aws.String(charSet),
131-
Data: aws.String(htmlBuf.String()),
130+
Content: &types.EmailContent{
131+
Simple: &types.Message{
132+
Body: &types.Body{
133+
Html: &types.Content{
134+
Charset: aws.String(charSet),
135+
Data: aws.String(htmlBuf.String()),
136+
},
137+
Text: &types.Content{
138+
Charset: aws.String(charSet),
139+
Data: aws.String(textBuf.String()),
140+
},
132141
},
133-
Text: &ses.Content{
142+
Subject: &types.Content{
134143
Charset: aws.String(charSet),
135-
Data: aws.String(textBuf.String()),
144+
Data: aws.String(e.Subject),
136145
},
137146
},
138-
Subject: &ses.Content{
139-
Charset: aws.String(charSet),
140-
Data: aws.String(e.Subject),
141-
},
142147
},
143-
Source: aws.String(s.from.String()),
148+
FromEmailAddress: mld.Ptr(s.from.String()),
144149
}
145150

146-
_, err = s.ses.SendEmailWithContext(ctx, input)
151+
_, err = s.ses.SendEmail(ctx, input)
147152
if err != nil {
148-
aerr, ok := err.(awserr.Error)
149-
if ok {
150-
switch aerr.Code() {
151-
case ses.ErrCodeMessageRejected:
152-
return fmt.Errorf("failed to send email due to AWS message rejected error: %w", err)
153-
case ses.ErrCodeMailFromDomainNotVerifiedException:
154-
return fmt.Errorf("failed to send email due to AWS sending from unverfied domain error: %w", err)
155-
case ses.ErrCodeConfigurationSetDoesNotExistException:
156-
return fmt.Errorf("failed to send email due to AWS configuration does not exist error: %w", err)
157-
default:
158-
return fmt.Errorf("failed to send email due to AWS error: %w", err)
159-
}
153+
var mr *types.MessageRejected
154+
var dnve *types.MailFromDomainNotVerifiedException
155+
switch {
156+
case errors.As(err, &mr):
157+
return fmt.Errorf("failed to send email due to AWS message rejected error: %w", err)
158+
case errors.As(err, &dnve):
159+
return fmt.Errorf("failed to send email due to AWS sending from unverfied domain error: %w", err)
160160
}
161161
return fmt.Errorf("failed to send email via AWS SES: %w", err)
162162
}

go.mod

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ require (
99
github.com/MicahParks/jwkset v0.8.0
1010
github.com/MicahParks/keyfunc/v3 v3.3.11
1111
github.com/MicahParks/recaptcha v0.0.5
12-
github.com/aws/aws-sdk-go v1.55.5
12+
github.com/aws/aws-sdk-go-v2 v1.39.2
13+
github.com/aws/aws-sdk-go-v2/config v1.31.12
14+
github.com/aws/aws-sdk-go-v2/credentials v1.18.16
15+
github.com/aws/aws-sdk-go-v2/service/sesv2 v1.53.5
1316
github.com/golang-jwt/jwt/v5 v5.2.2
1417
github.com/google/uuid v1.6.0
1518
github.com/jackc/pgx/v5 v5.7.1
@@ -21,10 +24,20 @@ require (
2124
)
2225

2326
require (
27+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9 // indirect
28+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 // indirect
29+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 // indirect
30+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
31+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.9 // indirect
32+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 // indirect
33+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9 // indirect
34+
github.com/aws/aws-sdk-go-v2/service/sso v1.29.6 // indirect
35+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1 // indirect
36+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.6 // indirect
37+
github.com/aws/smithy-go v1.23.0 // indirect
2438
github.com/jackc/pgpassfile v1.0.0 // indirect
2539
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
2640
github.com/jackc/puddle/v2 v2.2.2 // indirect
27-
github.com/jmespath/go-jmespath v0.4.0 // indirect
2841
github.com/sendgrid/rest v2.6.9+incompatible // indirect
2942
github.com/tidwall/match v1.1.1 // indirect
3043
github.com/tidwall/pretty v1.2.1 // indirect

go.sum

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,36 @@ github.com/MicahParks/keyfunc/v3 v3.3.11 h1:eA6wNltwdSRX2gtpTwZseBCC9nGeBkI9KxHt
66
github.com/MicahParks/keyfunc/v3 v3.3.11/go.mod h1:y6Ed3dMgNKTcpxbaQHD8mmrYDUZWJAxteddA6OQj+ag=
77
github.com/MicahParks/recaptcha v0.0.5 h1:RvKq7E1BZJtz5ubSkBun20jXxIsMWt2oZ0ppTJOzX1A=
88
github.com/MicahParks/recaptcha v0.0.5/go.mod h1:aFv3iZDDs6Pbi6tRpUm8gofaTUnDxOQ27x5KsK0CZwE=
9-
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
10-
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
9+
github.com/aws/aws-sdk-go-v2 v1.39.2 h1:EJLg8IdbzgeD7xgvZ+I8M1e0fL0ptn/M47lianzth0I=
10+
github.com/aws/aws-sdk-go-v2 v1.39.2/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY=
11+
github.com/aws/aws-sdk-go-v2/config v1.31.12 h1:pYM1Qgy0dKZLHX2cXslNacbcEFMkDMl+Bcj5ROuS6p8=
12+
github.com/aws/aws-sdk-go-v2/config v1.31.12/go.mod h1:/MM0dyD7KSDPR+39p9ZNVKaHDLb9qnfDurvVS2KAhN8=
13+
github.com/aws/aws-sdk-go-v2/credentials v1.18.16 h1:4JHirI4zp958zC026Sm+V4pSDwW4pwLefKrc0bF2lwI=
14+
github.com/aws/aws-sdk-go-v2/credentials v1.18.16/go.mod h1:qQMtGx9OSw7ty1yLclzLxXCRbrkjWAM7JnObZjmCB7I=
15+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9 h1:Mv4Bc0mWmv6oDuSWTKnk+wgeqPL5DRFu5bQL9BGPQ8Y=
16+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9/go.mod h1:IKlKfRppK2a1y0gy1yH6zD+yX5uplJ6UuPlgd48dJiQ=
17+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 h1:se2vOWGD3dWQUtfn4wEjRQJb1HK1XsNIt825gskZ970=
18+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9/go.mod h1:hijCGH2VfbZQxqCDN7bwz/4dzxV+hkyhjawAtdPWKZA=
19+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 h1:6RBnKZLkJM4hQ+kN6E7yWFveOTg8NLPHAkqrs4ZPlTU=
20+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9/go.mod h1:V9rQKRmK7AWuEsOMnHzKj8WyrIir1yUJbZxDuZLFvXI=
21+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
22+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
23+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.9 h1:w9LnHqTq8MEdlnyhV4Bwfizd65lfNCNgdlNC6mM5paE=
24+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.9/go.mod h1:LGEP6EK4nj+bwWNdrvX/FnDTFowdBNwcSPuZu/ouFys=
25+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 h1:oegbebPEMA/1Jny7kvwejowCaHz1FWZAQ94WXFNCyTM=
26+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1/go.mod h1:kemo5Myr9ac0U9JfSjMo9yHLtw+pECEHsFtJ9tqCEI8=
27+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9 h1:5r34CgVOD4WZudeEKZ9/iKpiT6cM1JyEROpXjOcdWv8=
28+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9/go.mod h1:dB12CEbNWPbzO2uC6QSWHteqOg4JfBVJOojbAoAUb5I=
29+
github.com/aws/aws-sdk-go-v2/service/sesv2 v1.53.5 h1:ZHBssvFtrtfNCm5APnzFrkdCX4KPDKlSGZ2NbfPmISY=
30+
github.com/aws/aws-sdk-go-v2/service/sesv2 v1.53.5/go.mod h1:eJP5lLTdqKwiQB5mKKaSjjJlLB0xcT3pTFF576PbdP0=
31+
github.com/aws/aws-sdk-go-v2/service/sso v1.29.6 h1:A1oRkiSQOWstGh61y4Wc/yQ04sqrQZr1Si/oAXj20/s=
32+
github.com/aws/aws-sdk-go-v2/service/sso v1.29.6/go.mod h1:5PfYspyCU5Vw1wNPsxi15LZovOnULudOQuVxphSflQA=
33+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1 h1:5fm5RTONng73/QA73LhCNR7UT9RpFH3hR6HWL6bIgVY=
34+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1/go.mod h1:xBEjWD13h+6nq+z4AkqSfSvqRKFgDIQeaMguAJndOWo=
35+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.6 h1:p3jIvqYwUZgu/XYeI48bJxOhvm47hZb5HUQ0tn6Q9kA=
36+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.6/go.mod h1:WtKK+ppze5yKPkZ0XwqIVWD4beCwv056ZbPQNoeHqM8=
37+
github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE=
38+
github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
1139
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1240
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
1341
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -23,10 +51,6 @@ github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs=
2351
github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA=
2452
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
2553
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
26-
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
27-
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
28-
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
29-
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
3054
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
3155
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
3256
github.com/sendgrid/rest v2.6.9+incompatible h1:1EyIcsNdn9KIisLW50MKwmSRSK+ekueiEMJ7NEoxJo0=
@@ -61,8 +85,6 @@ golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
6185
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
6286
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
6387
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
64-
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
65-
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
6688
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
6789
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
6890
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

setup/setup.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ func CreateNopProviderServer(ctx context.Context, conf NopConfig, options Server
224224

225225
// CreateMultiProviderServer creates a new magiclinksdev server with multiple email providers.
226226
func CreateMultiProviderServer(ctx context.Context, conf MultiConfig, options ServerOptions) (*handle.Server, error) {
227-
sesProvider, err := ses.NewProvider(conf.SES)
227+
sesProvider, err := ses.NewProvider(ctx, conf.SES)
228228
if err != nil {
229229
return nil, fmt.Errorf("failed to create email provider: %w", err)
230230
}
@@ -254,7 +254,7 @@ func CreateMultiProviderServer(ctx context.Context, conf MultiConfig, options Se
254254

255255
// CreateSESProvider creates a new magiclinksdev server with a SES email provider.
256256
func CreateSESProvider(ctx context.Context, conf SESConfig, options ServerOptions) (*handle.Server, error) {
257-
provider, err := ses.NewProvider(conf.SES)
257+
provider, err := ses.NewProvider(ctx, conf.SES)
258258
if err != nil {
259259
return nil, fmt.Errorf("failed to create email provider: %w", err)
260260
}

0 commit comments

Comments
 (0)