From c9e14f9b82c05f96bb6cef494099103aacf7758b Mon Sep 17 00:00:00 2001 From: "matteo.piovanelli" Date: Mon, 17 Oct 2016 12:54:53 +0200 Subject: [PATCH 1/8] Modified the OutputCache Module based on the enhancement proposed in Issue 5811, by adding a VaryByRequestCookies property to the CacheSettingsPart to enable the generation of the Cache Key based on cookies --- .../Orchard.OutputCache/Controllers/AdminController.cs | 2 ++ .../Orchard.OutputCache/Filters/OutputCacheFilter.cs | 6 ++++++ .../Modules/Orchard.OutputCache/Models/CacheSettings.cs | 2 ++ .../Orchard.OutputCache/Models/CacheSettingsPart.cs | 5 +++++ .../Orchard.OutputCache/ViewModels/IndexViewModel.cs | 1 + .../Modules/Orchard.OutputCache/Views/Admin/Index.cshtml | 8 +++++++- 6 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Controllers/AdminController.cs index f8a042706..a2798425d 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Controllers/AdminController.cs @@ -89,6 +89,7 @@ namespace Orchard.OutputCache.Controllers { DefaultMaxAge = settings.DefaultMaxAge, VaryByQueryStringParameters = settings.VaryByQueryStringParameters, VaryByRequestHeaders = settings.VaryByRequestHeaders, + VaryByRequestCookies = settings.VaryByRequestCookies, IgnoredUrls = settings.IgnoredUrls, IgnoreNoCache = settings.IgnoreNoCache, VaryByCulture = settings.VaryByCulture, @@ -116,6 +117,7 @@ namespace Orchard.OutputCache.Controllers { settings.DefaultMaxAge = model.DefaultMaxAge; settings.VaryByQueryStringParameters = model.VaryByQueryStringParameters; settings.VaryByRequestHeaders = model.VaryByRequestHeaders; + settings.VaryByRequestCookies = model.VaryByRequestCookies; settings.IgnoredUrls = model.IgnoredUrls; settings.IgnoreNoCache = model.IgnoreNoCache; settings.VaryByCulture = model.VaryByCulture; diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs index 548012e6b..4e0bc04a3 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs @@ -397,6 +397,12 @@ namespace Orchard.OutputCache.Filters { result["HEADER:" + varyByRequestHeader] = requestHeaders[varyByRequestHeader]; } + // Vary by configured cookies. + var requestCookies = filterContext.RequestContext.HttpContext.Request.Cookies; + foreach (var varyByRequestCookies in CacheSettings.VaryByRequestCookies) { + if (requestCookies[varyByRequestCookies] != null) + result["COOKIE:" + varyByRequestCookies] = requestCookies[varyByRequestCookies].Value; + } // Vary by request culture if configured. if (CacheSettings.VaryByCulture) { diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettings.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettings.cs index 62075c24d..7797d7382 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettings.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettings.cs @@ -14,6 +14,7 @@ namespace Orchard.OutputCache.Models { VaryByQueryStringParameters = String.IsNullOrWhiteSpace(part.VaryByQueryStringParameters) ? null : part.VaryByQueryStringParameters.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray(); VaryByRequestHeaders = String.IsNullOrWhiteSpace(part.VaryByRequestHeaders) ? new HashSet() : new HashSet(part.VaryByRequestHeaders.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray()); VaryByRequestHeaders.Add("HOST"); // Always vary by host name/tenant. + VaryByRequestCookies = String.IsNullOrWhiteSpace(part.VaryByRequestCookies) ? new HashSet() : new HashSet(part.VaryByRequestCookies.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray()); IgnoredUrls = String.IsNullOrWhiteSpace(part.IgnoredUrls) ? null : part.IgnoredUrls.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray(); IgnoreNoCache = part.IgnoreNoCache; VaryByCulture = part.VaryByCulture; @@ -27,6 +28,7 @@ namespace Orchard.OutputCache.Models { public int DefaultMaxAge { get; private set; } public IEnumerable VaryByQueryStringParameters { get; private set; } public ISet VaryByRequestHeaders { get; private set; } + public ISet VaryByRequestCookies { get; private set; } public IEnumerable IgnoredUrls { get; private set; } public bool IgnoreNoCache { get; private set; } public bool VaryByCulture { get; private set; } diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettingsPart.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettingsPart.cs index b11eb3fae..69e8441fd 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettingsPart.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettingsPart.cs @@ -44,6 +44,11 @@ namespace Orchard.OutputCache.Models { } } + public string VaryByRequestCookies { + get { return this.Retrieve(x => x.VaryByRequestCookies); } + set { this.Store(x => x.VaryByRequestCookies, value); } + } + public string IgnoredUrls { get { return this.Retrieve(x => x.IgnoredUrls); } set { this.Store(x => x.IgnoredUrls, value); } diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/ViewModels/IndexViewModel.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/ViewModels/IndexViewModel.cs index 1cda10ada..b79ff5509 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/ViewModels/IndexViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/ViewModels/IndexViewModel.cs @@ -11,6 +11,7 @@ namespace Orchard.OutputCache.ViewModels { [Range(0, Int32.MaxValue), Required] public int DefaultMaxAge { get; set; } public string VaryByQueryStringParameters { get; set; } public string VaryByRequestHeaders { get; set; } + public string VaryByRequestCookies { get; set; } public string IgnoredUrls { get; set; } public bool IgnoreNoCache { get; set; } public bool VaryByCulture { get; set; } diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Views/Admin/Index.cshtml b/src/Orchard.Web/Modules/Orchard.OutputCache/Views/Admin/Index.cshtml index 960b43bb4..9750acb7e 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Views/Admin/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Views/Admin/Index.cshtml @@ -43,7 +43,13 @@ @Html.TextBoxFor(m => m.VaryByRequestHeaders, new { @class = "text medium" }) @T("When defined, using comma separated values, sets caching to vary by the specified request headers.") - + +
+ + @Html.TextBoxFor(m => m.VaryByRequestCookies, new { @class = "text medium" }) + @T("When defined, using comma separated values, sets caching to vary via specified cookie string parameters") +
+
@Html.TextAreaFor(m => m.IgnoredUrls, new { @class = "text medium" }) From 58e59e2fca8d9d672d45dee661e11b9a7616dc19 Mon Sep 17 00:00:00 2001 From: HermesSbicego-Laser Date: Wed, 19 Oct 2016 16:30:12 +0200 Subject: [PATCH 2/8] - added EventHandler in order to partecipate in cachekey generation --- .../Filters/OutputCacheFilter.cs | 13 ++++++++++++- .../Orchard.OutputCache/ICachingEventHandler.cs | 12 ++++++++++++ .../Orchard.OutputCache/Orchard.OutputCache.csproj | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/Orchard.Web/Modules/Orchard.OutputCache/ICachingEventHandler.cs diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs index 548012e6b..8df84b69f 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs @@ -41,6 +41,7 @@ namespace Orchard.OutputCache.Filters { private readonly ICacheService _cacheService; private readonly ISignals _signals; private readonly ShellSettings _shellSettings; + private readonly ICachingEventHandler _chachingEvents; private bool _isDisposed = false; public ILogger Logger { get; set; } @@ -55,7 +56,8 @@ namespace Orchard.OutputCache.Filters { IClock clock, ICacheService cacheService, ISignals signals, - ShellSettings shellSettings) { + ShellSettings shellSettings, + ICachingEventHandler chachingEvents) { _cacheManager = cacheManager; _cacheStorageProvider = cacheStorageProvider; @@ -67,6 +69,7 @@ namespace Orchard.OutputCache.Filters { _cacheService = cacheService; _signals = signals; _shellSettings = shellSettings; + _chachingEvents = chachingEvents; Logger = NullLogger.Instance; } @@ -610,6 +613,14 @@ namespace Orchard.OutputCache.Filters { } } + //make CacheKey morphable by external modules + try { + keyBuilder = _chachingEvents.ParticipateInCacheKey(keyBuilder); + } catch (UnauthorizedAccessException ex) { + throw new UnauthorizedAccessException(); + } catch { } + + return keyBuilder.ToString(); } diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/ICachingEventHandler.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/ICachingEventHandler.cs new file mode 100644 index 000000000..6e9aebf5a --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/ICachingEventHandler.cs @@ -0,0 +1,12 @@ +using Orchard.Events; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; + +namespace Orchard.OutputCache { + public interface ICachingEventHandler : IEventHandler { + StringBuilder ParticipateInCacheKey(StringBuilder key); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Orchard.OutputCache.csproj b/src/Orchard.Web/Modules/Orchard.OutputCache/Orchard.OutputCache.csproj index a3a7fa74c..9a4520288 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Orchard.OutputCache.csproj +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Orchard.OutputCache.csproj @@ -103,6 +103,7 @@ + From 350cbbd183414a41cf0886967c918d9482e47fea Mon Sep 17 00:00:00 2001 From: HermesSbicego-Laser Date: Wed, 19 Oct 2016 17:40:58 +0200 Subject: [PATCH 3/8] - typo chaching > caching --- .../Orchard.OutputCache/Filters/OutputCacheFilter.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs index 8df84b69f..b8ddff839 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs @@ -41,7 +41,7 @@ namespace Orchard.OutputCache.Filters { private readonly ICacheService _cacheService; private readonly ISignals _signals; private readonly ShellSettings _shellSettings; - private readonly ICachingEventHandler _chachingEvents; + private readonly ICachingEventHandler _cachingEvents; private bool _isDisposed = false; public ILogger Logger { get; set; } @@ -57,7 +57,7 @@ namespace Orchard.OutputCache.Filters { ICacheService cacheService, ISignals signals, ShellSettings shellSettings, - ICachingEventHandler chachingEvents) { + ICachingEventHandler cachingEvents) { _cacheManager = cacheManager; _cacheStorageProvider = cacheStorageProvider; @@ -69,7 +69,7 @@ namespace Orchard.OutputCache.Filters { _cacheService = cacheService; _signals = signals; _shellSettings = shellSettings; - _chachingEvents = chachingEvents; + _cachingEvents = cachingEvents; Logger = NullLogger.Instance; } @@ -615,7 +615,7 @@ namespace Orchard.OutputCache.Filters { //make CacheKey morphable by external modules try { - keyBuilder = _chachingEvents.ParticipateInCacheKey(keyBuilder); + keyBuilder = _cachingEvents.ParticipateInCacheKey(keyBuilder); } catch (UnauthorizedAccessException ex) { throw new UnauthorizedAccessException(); } catch { } From 1dcee8aae85741975c6589664acbfd80f92514f8 Mon Sep 17 00:00:00 2001 From: HermesSbicego-Laser Date: Wed, 19 Oct 2016 16:30:12 +0200 Subject: [PATCH 4/8] - typo chaching > caching - added EventHandler in order to partecipate in cachekey generation --- .../Filters/OutputCacheFilter.cs | 13 ++++++++++++- .../Orchard.OutputCache/ICachingEventHandler.cs | 12 ++++++++++++ .../Orchard.OutputCache/Orchard.OutputCache.csproj | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/Orchard.Web/Modules/Orchard.OutputCache/ICachingEventHandler.cs diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs index 548012e6b..b8ddff839 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs @@ -41,6 +41,7 @@ namespace Orchard.OutputCache.Filters { private readonly ICacheService _cacheService; private readonly ISignals _signals; private readonly ShellSettings _shellSettings; + private readonly ICachingEventHandler _cachingEvents; private bool _isDisposed = false; public ILogger Logger { get; set; } @@ -55,7 +56,8 @@ namespace Orchard.OutputCache.Filters { IClock clock, ICacheService cacheService, ISignals signals, - ShellSettings shellSettings) { + ShellSettings shellSettings, + ICachingEventHandler cachingEvents) { _cacheManager = cacheManager; _cacheStorageProvider = cacheStorageProvider; @@ -67,6 +69,7 @@ namespace Orchard.OutputCache.Filters { _cacheService = cacheService; _signals = signals; _shellSettings = shellSettings; + _cachingEvents = cachingEvents; Logger = NullLogger.Instance; } @@ -610,6 +613,14 @@ namespace Orchard.OutputCache.Filters { } } + //make CacheKey morphable by external modules + try { + keyBuilder = _cachingEvents.ParticipateInCacheKey(keyBuilder); + } catch (UnauthorizedAccessException ex) { + throw new UnauthorizedAccessException(); + } catch { } + + return keyBuilder.ToString(); } diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/ICachingEventHandler.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/ICachingEventHandler.cs new file mode 100644 index 000000000..6e9aebf5a --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/ICachingEventHandler.cs @@ -0,0 +1,12 @@ +using Orchard.Events; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; + +namespace Orchard.OutputCache { + public interface ICachingEventHandler : IEventHandler { + StringBuilder ParticipateInCacheKey(StringBuilder key); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Orchard.OutputCache.csproj b/src/Orchard.Web/Modules/Orchard.OutputCache/Orchard.OutputCache.csproj index a3a7fa74c..9a4520288 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Orchard.OutputCache.csproj +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Orchard.OutputCache.csproj @@ -103,6 +103,7 @@ + From 548b5d7d8fd95982cc04adc42272152ec327d1c0 Mon Sep 17 00:00:00 2001 From: HermesSbicego-Laser Date: Fri, 21 Oct 2016 09:37:07 +0200 Subject: [PATCH 5/8] - Method renamed - try catch removed --- .../Orchard.OutputCache/Filters/OutputCacheFilter.cs | 7 +------ .../Modules/Orchard.OutputCache/ICachingEventHandler.cs | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs index b8ddff839..e87eeedc2 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs @@ -614,12 +614,7 @@ namespace Orchard.OutputCache.Filters { } //make CacheKey morphable by external modules - try { - keyBuilder = _cachingEvents.ParticipateInCacheKey(keyBuilder); - } catch (UnauthorizedAccessException ex) { - throw new UnauthorizedAccessException(); - } catch { } - + _cachingEvents.KeyGenerated(keyBuilder); return keyBuilder.ToString(); } diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/ICachingEventHandler.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/ICachingEventHandler.cs index 6e9aebf5a..a2dbc640e 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/ICachingEventHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/ICachingEventHandler.cs @@ -7,6 +7,6 @@ using System.Web; namespace Orchard.OutputCache { public interface ICachingEventHandler : IEventHandler { - StringBuilder ParticipateInCacheKey(StringBuilder key); + void KeyGenerated(StringBuilder key); } } \ No newline at end of file From 2bb81eef31b092c8f78b19d9e8f21300d32cf3ba Mon Sep 17 00:00:00 2001 From: HermesSbicego-Laser Date: Fri, 21 Oct 2016 11:46:08 +0200 Subject: [PATCH 6/8] - Added attachments logic --- .../Orchard.Email/Models/EmailMessage.cs | 8 +++++++- .../Services/SmtpMessageChannel.cs | 20 ++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Email/Models/EmailMessage.cs b/src/Orchard.Web/Modules/Orchard.Email/Models/EmailMessage.cs index 3edcd8731..8c588ce91 100644 --- a/src/Orchard.Web/Modules/Orchard.Email/Models/EmailMessage.cs +++ b/src/Orchard.Web/Modules/Orchard.Email/Models/EmailMessage.cs @@ -1,4 +1,6 @@ -namespace Orchard.Email.Models { +using System.Collections.Generic; + +namespace Orchard.Email.Models { public class EmailMessage { public string Subject { get; set; } public string Body { get; set; } @@ -7,5 +9,9 @@ public string From { get; set; } public string Bcc { get; set; } public string Cc { get; set; } + /// + /// IEnumerable of strings representing attachments paths + /// + public IEnumerable Attachments { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs b/src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs index 0ab833e6b..1d869813a 100644 --- a/src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs +++ b/src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs @@ -9,6 +9,8 @@ using Orchard.ContentManagement; using Orchard.DisplayManagement; using Orchard.Logging; using Orchard.Email.Models; +using System.Linq; +using System.IO; namespace Orchard.Email.Services { public class SmtpMessageChannel : Component, ISmtpChannel, IDisposable { @@ -51,7 +53,8 @@ namespace Orchard.Email.Services { ReplyTo = Read(parameters, "ReplyTo"), From = Read(parameters, "From"), Bcc = Read(parameters, "Bcc"), - Cc = Read(parameters, "CC") + Cc = Read(parameters, "CC"), + Attachments = (IEnumerable)parameters["Attachments"] }; if (emailMessage.Recipients.Length == 0) { @@ -105,8 +108,7 @@ namespace Orchard.Email.Services { if (!String.IsNullOrWhiteSpace(emailMessage.From)) { mailMessage.From = new MailAddress(emailMessage.From); - } - else { + } else { // Take 'From' address from site settings or web.config. mailMessage.From = !String.IsNullOrWhiteSpace(_smtpSettings.Address) ? new MailAddress(_smtpSettings.Address) @@ -119,9 +121,13 @@ namespace Orchard.Email.Services { } } + foreach (var attachmentPath in emailMessage.Attachments) { + if (File.Exists(attachmentPath)) { + mailMessage.Attachments.Add(new Attachment(attachmentPath)); + } + } _smtpClientField.Value.Send(mailMessage); - } - catch (Exception e) { + } catch (Exception e) { Logger.Error(e, "Could not send email"); } } @@ -129,7 +135,7 @@ namespace Orchard.Email.Services { private SmtpClient CreateSmtpClient() { // If no properties are set in the dashboard, use the web.config value. if (String.IsNullOrWhiteSpace(_smtpSettings.Host)) { - return new SmtpClient(); + return new SmtpClient(); } var smtpClient = new SmtpClient { @@ -155,7 +161,7 @@ namespace Orchard.Email.Services { } private IEnumerable ParseRecipients(string recipients) { - return recipients.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries); + return recipients.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); } } } \ No newline at end of file From a4c816b29180dde88964e9d55207efd73de4d561 Mon Sep 17 00:00:00 2001 From: HermesSbicego-Laser Date: Fri, 21 Oct 2016 11:55:38 +0200 Subject: [PATCH 7/8] - missing Attachments Key fix --- .../Modules/Orchard.Email/Services/SmtpMessageChannel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs b/src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs index 1d869813a..ff44a551d 100644 --- a/src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs +++ b/src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs @@ -54,7 +54,7 @@ namespace Orchard.Email.Services { From = Read(parameters, "From"), Bcc = Read(parameters, "Bcc"), Cc = Read(parameters, "CC"), - Attachments = (IEnumerable)parameters["Attachments"] + Attachments = (IEnumerable)(parameters.ContainsKey("Attachments") ? parameters["Attachments"] : new List()) }; if (emailMessage.Recipients.Length == 0) { From 580b79c24db2da9b7d97039b4fd6db03412fb5c6 Mon Sep 17 00:00:00 2001 From: HermesSbicego-Laser Date: Fri, 21 Oct 2016 11:46:08 +0200 Subject: [PATCH 8/8] - Added attachments logic --- .../Orchard.Email/Models/EmailMessage.cs | 8 ++++++- .../Services/SmtpMessageChannel.cs | 22 +++++++++++++------ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Email/Models/EmailMessage.cs b/src/Orchard.Web/Modules/Orchard.Email/Models/EmailMessage.cs index 3edcd8731..8c588ce91 100644 --- a/src/Orchard.Web/Modules/Orchard.Email/Models/EmailMessage.cs +++ b/src/Orchard.Web/Modules/Orchard.Email/Models/EmailMessage.cs @@ -1,4 +1,6 @@ -namespace Orchard.Email.Models { +using System.Collections.Generic; + +namespace Orchard.Email.Models { public class EmailMessage { public string Subject { get; set; } public string Body { get; set; } @@ -7,5 +9,9 @@ public string From { get; set; } public string Bcc { get; set; } public string Cc { get; set; } + /// + /// IEnumerable of strings representing attachments paths + /// + public IEnumerable Attachments { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs b/src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs index 0ab833e6b..02e26892a 100644 --- a/src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs +++ b/src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs @@ -9,6 +9,8 @@ using Orchard.ContentManagement; using Orchard.DisplayManagement; using Orchard.Logging; using Orchard.Email.Models; +using System.Linq; +using System.IO; namespace Orchard.Email.Services { public class SmtpMessageChannel : Component, ISmtpChannel, IDisposable { @@ -51,7 +53,8 @@ namespace Orchard.Email.Services { ReplyTo = Read(parameters, "ReplyTo"), From = Read(parameters, "From"), Bcc = Read(parameters, "Bcc"), - Cc = Read(parameters, "CC") + Cc = Read(parameters, "CC"), + Attachments = (IEnumerable)(parameters.ContainsKey("Attachments") ? parameters["Attachments"] : new List()) }; if (emailMessage.Recipients.Length == 0) { @@ -105,8 +108,7 @@ namespace Orchard.Email.Services { if (!String.IsNullOrWhiteSpace(emailMessage.From)) { mailMessage.From = new MailAddress(emailMessage.From); - } - else { + } else { // Take 'From' address from site settings or web.config. mailMessage.From = !String.IsNullOrWhiteSpace(_smtpSettings.Address) ? new MailAddress(_smtpSettings.Address) @@ -119,9 +121,15 @@ namespace Orchard.Email.Services { } } + foreach (var attachmentPath in emailMessage.Attachments) { + if (File.Exists(attachmentPath)) { + mailMessage.Attachments.Add(new Attachment(attachmentPath)); + } else { + throw new FileNotFoundException(T("One or more attachments not found.").Text); + } + } _smtpClientField.Value.Send(mailMessage); - } - catch (Exception e) { + } catch (Exception e) { Logger.Error(e, "Could not send email"); } } @@ -129,7 +137,7 @@ namespace Orchard.Email.Services { private SmtpClient CreateSmtpClient() { // If no properties are set in the dashboard, use the web.config value. if (String.IsNullOrWhiteSpace(_smtpSettings.Host)) { - return new SmtpClient(); + return new SmtpClient(); } var smtpClient = new SmtpClient { @@ -155,7 +163,7 @@ namespace Orchard.Email.Services { } private IEnumerable ParseRecipients(string recipients) { - return recipients.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries); + return recipients.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); } } } \ No newline at end of file