1010using FluentEmail . Core . Interfaces ;
1111using FluentEmail . Core . Models ;
1212using FluentEmail . Mailgun . HttpHelpers ;
13+ using Newtonsoft . Json ;
1314
1415namespace FluentEmail . Mailgun
1516{
16- public class MailgunSender : ISender
17+ public class MailgunSender : IMailgunSender
1718 {
1819 private readonly string _apiKey ;
1920 private readonly string _domainName ;
@@ -51,46 +52,39 @@ public SendResponse Send(IFluentEmail email, CancellationToken? token = null)
5152
5253 public async Task < SendResponse > SendAsync ( IFluentEmail email , CancellationToken ? token = null )
5354 {
54- var parameters = new List < KeyValuePair < string , string > > ( ) ;
55-
56- parameters . Add ( new KeyValuePair < string , string > ( "from" , $ "{ email . Data . FromAddress . Name } <{ email . Data . FromAddress . EmailAddress } >") ) ;
57- email . Data . ToAddresses . ForEach ( x => {
58- parameters . Add ( new KeyValuePair < string , string > ( "to" , $ "{ x . Name } <{ x . EmailAddress } >") ) ;
59- } ) ;
60- email . Data . CcAddresses . ForEach ( x => {
61- parameters . Add ( new KeyValuePair < string , string > ( "cc" , $ "{ x . Name } <{ x . EmailAddress } >") ) ;
62- } ) ;
63- email . Data . BccAddresses . ForEach ( x => {
64- parameters . Add ( new KeyValuePair < string , string > ( "bcc" , $ "{ x . Name } <{ x . EmailAddress } >") ) ;
65- } ) ;
66- email . Data . ReplyToAddresses . ForEach ( x => {
67- parameters . Add ( new KeyValuePair < string , string > ( "h:Reply-To" , $ "{ x . Name } <{ x . EmailAddress } >") ) ;
68- } ) ;
69- parameters . Add ( new KeyValuePair < string , string > ( "subject" , email . Data . Subject ) ) ;
70-
55+ var parameters = BuildMailgunParameters ( email ) ;
56+
7157 parameters . Add ( new KeyValuePair < string , string > ( email . Data . IsHtml ? "html" : "text" , email . Data . Body ) ) ;
7258
7359 if ( ! string . IsNullOrEmpty ( email . Data . PlaintextAlternativeBody ) )
7460 {
7561 parameters . Add ( new KeyValuePair < string , string > ( "text" , email . Data . PlaintextAlternativeBody ) ) ;
7662 }
63+
64+ var files = BuildMailgunFiles ( email ) ;
7765
78- email . Data . Tags . ForEach ( x =>
79- {
80- parameters . Add ( new KeyValuePair < string , string > ( "o:tag" , x ) ) ;
81- } ) ;
66+ return await SendAsync ( parameters , files , token ) ;
67+ }
8268
83- foreach ( var emailHeader in email . Data . Headers )
84- {
85- var key = emailHeader . Key ;
86- if ( ! key . StartsWith ( "h:" ) )
87- {
88- key = "h:" + emailHeader . Key ;
89- }
69+ private async Task < SendResponse > SendAsync ( List < KeyValuePair < string , string > > parameters , List < HttpFile > files , CancellationToken ? token = null )
70+ {
71+ token ? . ThrowIfCancellationRequested ( ) ;
72+
73+ var response = await _httpClient . PostMultipart < MailgunResponse > ( "messages" , parameters , files )
74+ . ConfigureAwait ( false ) ;
9075
91- parameters . Add ( new KeyValuePair < string , string > ( key , emailHeader . Value ) ) ;
76+ var result = new SendResponse { MessageId = response . Data ? . Id } ;
77+ if ( ! response . Success )
78+ {
79+ result . ErrorMessages . AddRange ( response . Errors . Select ( x => x . ErrorMessage ) ) ;
80+ return result ;
9281 }
9382
83+ return result ;
84+ }
85+
86+ private static List < HttpFile > BuildMailgunFiles ( IFluentEmail email )
87+ {
9488 var files = new List < HttpFile > ( ) ;
9589 email . Data . Attachments . ForEach ( x =>
9690 {
@@ -109,17 +103,60 @@ public async Task<SendResponse> SendAsync(IFluentEmail email, CancellationToken?
109103 ContentType = x . ContentType
110104 } ) ;
111105 } ) ;
106+ return files ;
107+ }
108+
109+ private static List < KeyValuePair < string , string > > BuildMailgunParameters ( IFluentEmail email )
110+ {
111+ var parameters = new List < KeyValuePair < string , string > > ( ) ;
112+
113+ parameters . Add ( new KeyValuePair < string , string > ( "from" ,
114+ $ "{ email . Data . FromAddress . Name } <{ email . Data . FromAddress . EmailAddress } >") ) ;
115+
116+ email . Data . ToAddresses . ForEach ( x =>
117+ {
118+ parameters . Add ( new KeyValuePair < string , string > ( "to" , $ "{ x . Name } <{ x . EmailAddress } >") ) ;
119+ } ) ;
120+ email . Data . CcAddresses . ForEach ( x =>
121+ {
122+ parameters . Add ( new KeyValuePair < string , string > ( "cc" , $ "{ x . Name } <{ x . EmailAddress } >") ) ;
123+ } ) ;
124+ email . Data . BccAddresses . ForEach ( x =>
125+ {
126+ parameters . Add ( new KeyValuePair < string , string > ( "bcc" , $ "{ x . Name } <{ x . EmailAddress } >") ) ;
127+ } ) ;
128+ email . Data . ReplyToAddresses . ForEach ( x =>
129+ {
130+ parameters . Add ( new KeyValuePair < string , string > ( "h:Reply-To" , $ "{ x . Name } <{ x . EmailAddress } >") ) ;
131+ } ) ;
132+ parameters . Add ( new KeyValuePair < string , string > ( "subject" , email . Data . Subject ) ) ;
112133
113- var response = await _httpClient . PostMultipart < MailgunResponse > ( "messages " , parameters , files ) . ConfigureAwait ( false ) ;
134+ email . Data . Tags . ForEach ( x => { parameters . Add ( new KeyValuePair < string , string > ( "o:tag " , x ) ) ; } ) ;
114135
115- var result = new SendResponse { MessageId = response . Data ? . Id } ;
116- if ( ! response . Success )
136+ foreach ( var emailHeader in email . Data . Headers )
117137 {
118- result . ErrorMessages . AddRange ( response . Errors . Select ( x => x . ErrorMessage ) ) ;
119- return result ;
138+ var key = emailHeader . Key ;
139+ if ( ! key . StartsWith ( "h:" ) )
140+ {
141+ key = "h:" + emailHeader . Key ;
142+ }
143+
144+ parameters . Add ( new KeyValuePair < string , string > ( key , emailHeader . Value ) ) ;
120145 }
146+
147+ return parameters ;
148+ }
121149
122- return result ;
150+ public async Task < SendResponse > SendWithTemplateAsync ( IFluentEmail email , string templateName , object templateData ,
151+ CancellationToken ? token = null )
152+ {
153+ var parameters = BuildMailgunParameters ( email ) ;
154+ var files = BuildMailgunFiles ( email ) ;
155+
156+ parameters . Add ( new KeyValuePair < string , string > ( "template" , templateName ) ) ;
157+ parameters . Add ( new KeyValuePair < string , string > ( "h:X-Mailgun-Variables" , JsonConvert . SerializeObject ( templateData ) ) ) ;
158+
159+ return await SendAsync ( parameters , files , token ) ;
123160 }
124161 }
125162}
0 commit comments