The other day Michael West pinged me to see if I could help someone in one of the SDN forums via this tweet:
The poster had asked if there were an easy way to disable the attachment of files on emails sent by the Web Forms for Marketers (WFFM) module in Sitecore.
After quickly peeking in the WFFM assemblies, I gave a potential solution — check out the thread to see what it was — though it did not work.
Tonight I looked further into how to accomplish this, and came up with the following solution:
using System; using System.Net; using Sitecore.Data; using Sitecore.Form.Core.Client.Data.Submit; using Sitecore.Form.Core.Pipelines.ProcessMessage; using Sitecore.Pipelines; namespace Sitecore.Sandbox.Form.Submit { public class SendMessage : Sitecore.Form.Submit.SendMessage { protected override void ExecuteMail(ID form, AdaptedResultList fields) { ProcessMessageArgs args = new ProcessMessageArgs(form, fields, this.MessageType); base.To = base.To.TrimEnd(new char[] { ',', ';' }); base.LocalFrom = base.From.TrimEnd(new char[] { ',', ';' }); args.To.Append(base.To.Replace(";", ",")); args.From = base.From.Replace(";", ","); // magically populated by WFFM via XML args.IncludeAttachment = IncludeAttachments; args.Mail.Append(base.Mail); args.Subject.Append(base.Subject); args.Recipient = this.Recipient; args.RecipientGateway = this.RecipientGateway; args.Host = base.Host; args.Port = base.Port; args.IsBodyHtml = this.IsBodyHtml; args.EnableSsl = this.EnableSsl; args.Data.Add("FromPhone", this.FromPhone ?? string.Empty); string[] strArray = string.IsNullOrEmpty(base.Login) ? new string[] { string.Empty } : base.Login.Split(new char[] { '\\' }); if ((strArray.Length > 0) && !string.IsNullOrEmpty(strArray[0])) { if ((strArray.Length == 2) && !string.IsNullOrEmpty(strArray[1])) { args.Credentials = new NetworkCredential(strArray[1], base.Password, strArray[0]); } else { args.Credentials = new NetworkCredential(strArray[0], base.Password); } } if (!string.IsNullOrEmpty(base.CC)) { base.CC = base.CC.TrimEnd(new char[] { ',', ';' }); args.CC.Append(base.CC.Replace(";", ",")); } if (!string.IsNullOrEmpty(base.BCC)) { base.BCC = base.BCC.TrimEnd(new char[] { ',', ';' }); args.BCC.Append(base.BCC.Replace(";", ",")); } CorePipeline.Run("processMessage", args); } // magically populated by WFFM via XML private bool IncludeAttachments { get; set; } } }
The class above inherits from Sitecore.Form.Submit.SendMessage in Sitecore.Forms.Custom.dll, and overrides the ExecuteMail() method — this method is declared virtual in Sitecore.Form.Submit.SendMail which is the base class of Sitecore.Form.Submit.SendMessage.
Most of the code in ExecuteMail() above is from the ExecuteMail() method on Sitecore.Form.Submit.SendMessage, though with one minor difference: I have added a boolean property named “IncludeAttachments” which is magically populated by WFFM via an XML property declaration for this class:
I spun up a form quickly with some File Upload fields, and mapped the above Save Action to it:
I then navigated to my form, attached two images, and clicked the submit button:
As you can see, the images were not attached to the email:
I then went back to my Save Action; set the <IncludeAttachments> XML element’s value to be true; saved the form Item; published it; and resubmitted the form:
As you can see, the images were attached this time.
If you have any thoughts on this, please drop a comment.
That’s really great Mike. Now we just need to make a feature request and have Sitecore add this to the next release.
Great idea!
Doing that now!
Mike
Doh. I could have gotten the credit 🙂
This is extremely helpful, thank you! One thing I want to mention is that I had to check off Client Action on the save action to get it to work.