【问题标题】:Cannot get IIS pickup directory无法获取 IIS 拾取目录
【发布时间】:2011-01-12 12:27:29
【问题描述】:

我一直在使用 Smtp 服务器 127.0.0.1 。我得到的错误:

System.Net.Mail.SmtpException: Cannot get IIS pickup directory.at System.Net.Mail.IisPickupDirectory.GetPickupDirectory().

此错误发生在从 ASP 网页发送电子邮件时。但从 ASP.NET 页面发送电子邮件时,没有发生错误。请帮忙。

【问题讨论】:

    标签: asp.net smtp


    【解决方案1】:

    不幸的是,当在尝试确定 IIS/SMTP 拾取目录的位置时发生任何类问题时会引发此异常。一个常见的原因是缺少 IIS SMTP 服务。

    如果您使用 System.Net.Mail.SmtpClient 发送邮件,请尝试手动设置取件目录:

    // C#
    var client = new SmtpClient();
    client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
    client.PickupDirectoryLocation = ...;
    client.Send(...);
    

    或者在 ASP.NET 的 Web.config 中设置它:

    <configuration>
        <system.net>
            <mailSettings>
                <smtp deliveryMethod="SpecifiedPickupDirectory">
                    <specifiedPickupDirectory
                        pickupDirectoryLocation="..." />
                    <network defaultCredentials="false" />
                </smtp>
            </mailSettings>
        </system.net>
    </configuration> 
    

    或者,改用SmtpDeliveryMethod.Network 方法并将HostPort 属性发送到您的SMTP 服务器。

    更多信息:http://forums.iis.net/p/1149338/1869548.aspx

    【讨论】:

    • 您能详细说明 PickupDirectoryLocation 吗?使用 PickupDirectoryLocation 我们必须赋予什么价值?
    • PickupDirectoryLocation 应设置为 IIS SMTP 服务(或兼容的第三方服务)用作拾取目录的目录的路径 - 所有保存到该目录的电子邮件都将被发送.例如,它可能是“C:\Inetpub\mailroot\Pickup”。
    【解决方案2】:

    pickup 目录存储在 II6 元数据库中,因此如果您的 web-app 运行的帐户无法访问所需的节点,则可能会引发此错误(我自己也有这个)。元数据库权限与文件权限是分开的,因此您可以使用元数据库资源管理器进行探索:

    http://www.microsoft.com/downloads/details.aspx?FamilyID=56fc92ee-a71a-4c73-b628-ade629c89499&displaylang=en(它是 IIS 资源工具包的一部分)

    这些节点需要授予您的网络应用用户读取权限: \LM\SmtpSvc \LM\SmtpSvc\1

    【讨论】:

    • 我应该提到我还必须修复文件权限才能使其正常工作。
    • 这很好,我现在可以看到/理解这个问题,但是在我的 Windows 2008 机器上,我正在使用应用程序池标识,我无法使用 GUI 设置该用户帐户的权限。我以前必须从命令行设置文件权限才能解决这个问题。您知道是否可以对这些权限执行相同的操作?
    【解决方案3】:

    我在 Windows 7 上遇到了同样的错误,代码在 XP 上运行良好。经过多次试验和错误。我将 IIS 设置为将邮件存储在拾取目录中。但我仍然有错误。

    在我的代码中,我注释掉了这一行:

    client.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;

    删除这行代码有效,不知道为什么。希望它也对你有用,因为这个问题是浪费时间来解决问题。

    我不必更改目录的任何权限。 我不必修改元数据库。 我不必修改 web.config(我真的不想这样做,因为我只想在本地机器上进行开发时将电子邮件放入目录中,而不是在生产中 - 我不想要两个不同的 web.config 文件来维护)。

    【讨论】:

    • 只是插话说这对我有用。我正在将 VS2004 项目更新到 VS2010,并且在删除此行之前,电子邮件发送无法正常工作。
    【解决方案4】:

    您也可以为您的单元测试项目指定它:

    public enum TestContextKeys { EmailPickupDirectory, ... };
    
    [TestClass]
    public class AssemblyInitializer
    {
        [AssemblyInitialize]
        public static void Init(TestContext testContext)
        {           
            string configPath = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
            XDocument xmlConfig = XDocument.Load(configPath);
            var emailPickupDirectory = xmlConfig.Element("configuration")
                      .Element("system.net")
                      .Element("mailSettings")
                      .Element("smtp")
                      .Element("specifiedPickupDirectory")
                      .Attribute("pickupDirectoryLocation")
                      .Value;            
    
            testContext.Properties[TestContextKeys.EmailPickupDirectory.ToString()] = emailPickupDirectory;    
         }
    

    还有你的测试代码:

    [TestMethod]
    public void TestEmailRegistration()
    {
        MyApp app = new MyApp();
        app.RegisterUser("Johny Cash",...);
    
        string emailPickupDirectory = (string)_testContext.Properties[TestContextKeys.EmailPickupDirectory.ToString()];
    
        string[] allEmails = Directory.GetFiles(emailPickupDirectory);
    
        string[] recentEmails = allEmails.Where(e => new FileInfo(e).CreationTime.AddMinutes(1) > DateTime.Now).ToArray();
    
        //check that the registration email was sent
        foreach (var email in recentEmails)
        {
            string content = File.ReadAllText(email);
    
            if (content.Contains("Johny Cash") && content.Contains("successful") && content.Contains("registration"))
            {
                File.Delete(email);
                return;//OK found
            }
        }
        Assert.Fail("Registratoin email has not been sent to Johny Cash");
    }
    
    [TestMethod]
    public void TestEmailPickupDirectoryConfiguration()
    {
        string emailPickupDirectory = (string)_testContext.Properties[TestContextKeys.EmailPickupDirectory.ToString()];
    
        MailAddress mailFrom = new MailAddress("testemailpickupdirectory@example.com", "Tester");
        MailAddress mailTo = new MailAddress("testemailpickupdirectory@testing.com", "Tester2");
        string subject = "Test Message TestEmailPickupDirectory";
    
        using (SmtpClient sc = new SmtpClient())
        {
            System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
    
            mail.To.Add(mailTo);
            mail.Subject = subject;
            mail.From = mailFrom;
            mail.IsBodyHtml = true;
            mail.BodyEncoding = System.Text.Encoding.GetEncoding("ISO-8859-9");
            mail.Body = "<html><body>";
            mail.Body += "TestEmailPickupDirectory";
            mail.Body += "</body></html>";
    
            sc.Send(mail);
        }
    
    
        string[] allEmails = Directory.GetFiles(emailPickupDirectory);
    
        string[] recentEmails = allEmails.Where(e => new FileInfo(e).CreationTime.AddMinutes(1) > DateTime.Now).ToArray();
    
        foreach (var email in recentEmails)
        {
            string content = File.ReadAllText(email);
    
            if (content.Contains(mailFrom.Address) && content.Contains(mailTo.Address) && content.Contains(subject))
            {
                File.Delete(email);
                return;//OK found
            }
        }
        Assert.Fail("EmailPickupDirectory configuration may be wrong.");
    }
    

    如果不存在,请在您的 unittest 项目中创建 app.config 文件,或者将这些行与现有的 app.config 合并。

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.net>
        <mailSettings>
          <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="d:\temp\Emails\" />
          </smtp>
        </mailSettings>
      </system.net>
    </configuration>
    

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多