@@ -3,19 +3,20 @@ package ses
33import (
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
2122const (
@@ -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 }
0 commit comments