using System; using System.Configuration; using System.Web; using System.IO; using System.Reflection; using System.Net.Mail; using System.Net.Configuration; namespace CSharpVitamins { public static class MailHelper { static bool? _isUsingPickupDirectory; /// /// Gets a value to indicate if the default SMTP Delivery /// method is SpecifiedPickupDirectory /// public static bool IsUsingPickupDirectory { get { if (!_isUsingPickupDirectory.HasValue) { Configuration config = WebConfigurationManager.OpenWebConfiguration("~/web.config"); MailSettingsSectionGroup mail = (MailSettingsSectionGroup)config.GetSectionGroup("system.net/mailSettings"); _isUsingPickupDirectory = mail.Smtp.DeliveryMethod == SmtpDeliveryMethod.SpecifiedPickupDirectory; } return _isUsingPickupDirectory.Value; } } /// /// Sets the default PickupDirectoryLocation for the SmtpClient. /// /// /// This method should be called to set the PickupDirectoryLocation /// for the SmtpClient at runtime (Application_Start) /// /// Reflection is used to set the private variable located in the /// internal class for the SmtpClient's mail configuration: /// System.Net.Mail.SmtpClient.MailConfiguration.Smtp.SpecifiedPickupDirectory.PickupDirectoryLocation /// /// The folder must exist. /// /// public static void SetPickupDirectoryLocation(string path) { BindingFlags instanceFlags = BindingFlags.Instance | BindingFlags.NonPublic; PropertyInfo prop; object mailConfiguration, smtp, specifiedPickupDirectory; // get static internal property: MailConfiguration prop = typeof(SmtpClient).GetProperty("MailConfiguration", BindingFlags.Static | BindingFlags.NonPublic); mailConfiguration = prop.GetValue(null, null); // get internal property: Smtp prop = mailConfiguration.GetType().GetProperty("Smtp", instanceFlags); smtp = prop.GetValue(mailConfiguration, null); // get internal property: SpecifiedPickupDirectory prop = smtp.GetType().GetProperty("SpecifiedPickupDirectory", instanceFlags); specifiedPickupDirectory = prop.GetValue(smtp, null); // get private field: pickupDirectoryLocation, then set it to the supplied path FieldInfo field = specifiedPickupDirectory.GetType().GetField("pickupDirectoryLocation", instanceFlags); field.SetValue(specifiedPickupDirectory, path); } /// /// Sets the default PickupDirectoryLocation for the SmtpClient /// to the relative path from the current web root. /// /// Relative path to the web root public static void SetRelativePickupDirectoryLocation(string path) { SetPickupDirectoryLocation(HttpRuntime.AppDomainAppPath, path); } /// /// Sets the default PickupDirectoryLocation for the SmtpClient. /// /// /// This is a shortcut for passing in two paths, which are then /// combined to set the pickup directory. /// /// Base path /// Relative path to be combined with public static void SetPickupDirectoryLocation(string path1, string path2) { SetPickupDirectoryLocation(Path.Combine(path1, path2)); } } }