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));
}
}
}