@@ -32,30 +32,30 @@ public EmailParser(IEmailViewRender alternativeViewRenderer)
32
32
/// <param name="emailViewOutput">The email view output.</param>
33
33
/// <param name="email">The <see cref="Email"/> used to generate the output.</param>
34
34
/// <returns>A <see cref="MailMessage"/> containing the email headers and content.</returns>
35
- public async Task < MailMessage > ParseAsync ( string emailViewOutput , Email email )
35
+ public async Task < MailMessage > ParseAsync ( string emailViewOutput , Email email , ImageEmbedder ? imageEmbedder = null )
36
36
{
37
37
var message = new MailMessage ( ) ;
38
- await InitializeMailMessageAsync ( message , emailViewOutput , email ) ;
38
+ await InitializeMailMessageAsync ( message , emailViewOutput , email , imageEmbedder ) ;
39
39
return message ;
40
40
}
41
41
42
- private async Task InitializeMailMessageAsync ( MailMessage message , string emailViewOutput , Email email )
42
+ private async Task InitializeMailMessageAsync ( MailMessage message , string emailViewOutput , Email email , ImageEmbedder ? imageEmbedder = null )
43
43
{
44
44
if ( string . IsNullOrWhiteSpace ( emailViewOutput ) )
45
45
{
46
46
throw new ArgumentNullException ( nameof ( emailViewOutput ) ) ;
47
47
}
48
48
using ( var reader = new StringReader ( emailViewOutput ) )
49
49
{
50
- await ParserUtils . ParseHeadersAsync ( reader , ( key , value ) => ProcessHeaderAsync ( key , value , message , email ) ) ;
50
+ await ParserUtils . ParseHeadersAsync ( reader , ( key , value ) => ProcessHeaderAsync ( key , value , message , email , imageEmbedder ) ) ;
51
51
AssignCommonHeaders ( message , email ) ;
52
52
if ( message . AlternateViews . Count == 0 )
53
53
{
54
54
var messageBody = reader . ReadToEnd ( ) . Trim ( ) ;
55
- if ( email . ImageEmbedder . HasImages )
55
+ if ( imageEmbedder != null && imageEmbedder . HasImages )
56
56
{
57
57
var view = AlternateView . CreateAlternateViewFromString ( messageBody , new ContentType ( "text/html" ) ) ;
58
- email . ImageEmbedder . AddImagesToView ( view ) ;
58
+ imageEmbedder . AddImagesToView ( view ) ;
59
59
message . AlternateViews . Add ( view ) ;
60
60
message . Body = "Plain text not available." ;
61
61
message . IsBodyHtml = false ;
@@ -112,19 +112,29 @@ private void AssignCommonHeaders(MailMessage message, Email email)
112
112
private void AssignCommonHeader < T > ( Email email , string header , Action < T > assign )
113
113
where T : class
114
114
{
115
- object value ;
115
+ object ? value ;
116
116
if ( email . ViewData . TryGetValue ( header , out value ) )
117
117
{
118
- var typedValue = value as T ;
119
- if ( typedValue != null ) assign ( typedValue ) ;
118
+ if ( value is T typedValue )
119
+ {
120
+ assign ( typedValue ) ;
121
+ return ;
122
+ }
123
+ }
124
+ var foundKV = email . ViewData . Where ( x => String . Equals ( x . Key , header , StringComparison . OrdinalIgnoreCase ) && x . Value is T typedValue ) ;
125
+ if ( foundKV . Any ( ) )
126
+ {
127
+ var val = foundKV . First ( ) ;
128
+ assign ( ( T ) val . Value ) ;
129
+ return ;
120
130
}
121
131
}
122
132
123
- private async Task ProcessHeaderAsync ( string key , string value , MailMessage message , Email email )
133
+ private async Task ProcessHeaderAsync ( string key , string value , MailMessage message , Email email , ImageEmbedder ? imageEmbedder )
124
134
{
125
135
if ( IsAlternativeViewsHeader ( key ) )
126
136
{
127
- foreach ( var view in CreateAlternativeViews ( value , email ) )
137
+ foreach ( var view in CreateAlternativeViews ( value , email , imageEmbedder ) )
128
138
{
129
139
message . AlternateViews . Add ( await view ) ;
130
140
}
@@ -135,17 +145,17 @@ private async Task ProcessHeaderAsync(string key, string value, MailMessage mess
135
145
}
136
146
}
137
147
138
- private IEnumerable < Task < AlternateView > > CreateAlternativeViews ( string deliminatedViewNames , Email email )
148
+ private IEnumerable < Task < AlternateView > > CreateAlternativeViews ( string deliminatedViewNames , Email email , ImageEmbedder ? imageEmbedder )
139
149
{
140
150
var viewNames = deliminatedViewNames . Split ( new [ ] { ',' , ' ' , ';' } , StringSplitOptions . RemoveEmptyEntries ) ;
141
- return viewNames . Select ( v => CreateAlternativeView ( email , v ) ) . ToList ( ) ;
151
+ return viewNames . Select ( v => CreateAlternativeView ( email , v , imageEmbedder ) ) . ToList ( ) ;
142
152
}
143
153
144
- private async Task < AlternateView > CreateAlternativeView ( Email email , string alternativeViewName )
154
+ private async Task < AlternateView > CreateAlternativeView ( Email email , string alternativeViewName , ImageEmbedder ? imageEmbedder )
145
155
{
146
156
var fullViewName = GetAlternativeViewName ( email , alternativeViewName ) ;
147
- var output = await alternativeViewRenderer . RenderAsync ( email , fullViewName ) ;
148
- string contentType ;
157
+ var output = await alternativeViewRenderer . RenderAsync ( email , fullViewName , imageEmbedder ) ;
158
+ string ? contentType ;
149
159
string body ;
150
160
using ( var reader = new StringReader ( output ) )
151
161
{
@@ -179,7 +189,10 @@ private async Task<AlternateView> CreateAlternativeView(Email email, string alte
179
189
// A different charset can be specified in the Content-Type header.
180
190
// e.g. Content-Type: text/html; charset=utf-8
181
191
}
182
- email . ImageEmbedder . AddImagesToView ( alternativeView ) ;
192
+ if ( imageEmbedder != null )
193
+ {
194
+ imageEmbedder . AddImagesToView ( alternativeView ) ;
195
+ }
183
196
return alternativeView ;
184
197
}
185
198
@@ -206,9 +219,9 @@ private MemoryStream CreateStreamOfBody(string body)
206
219
return stream ;
207
220
}
208
221
209
- private string ParseHeadersForContentType ( StringReader reader )
222
+ private string ? ParseHeadersForContentType ( StringReader reader )
210
223
{
211
- string contentType = null ;
224
+ string ? contentType = null ;
212
225
ParserUtils . ParseHeaders ( reader , ( key , value ) =>
213
226
{
214
227
if ( key . Equals ( "content-type" , StringComparison . OrdinalIgnoreCase ) )
0 commit comments