Не удается получить каталог раскладки IIS - PullRequest
9 голосов
/ 03 февраля 2010

Я использую сервер SMTP 127.0.0.1. Ошибка, которую я получаю:

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

Эта ошибка произошла, когда электронная почта отправлялась с веб-страницы ASP. Пожалуйста, помогите.

Ответы [ 4 ]

14 голосов
/ 21 февраля 2010

К сожалению, это исключение возникает, когда возникает проблема любого при попытке определить местоположение каталога раскладки 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 и отправьте свойства Host и Port на SMTP-сервер.

Дополнительная информация: http://forums.iis.net/p/1149338/1869548.aspx

9 голосов
/ 06 сентября 2010

Каталог раскладки хранится в метабазе II6, поэтому, если учетная запись, с которой работает ваше веб-приложение, не имеет доступа к необходимым узлам, эта ошибка может быть выдана (если бы она была у меня). Разрешения метабазы ​​отделены от прав доступа к файлам, поэтому вы можете исследовать их с помощью обозревателя метабазы:

http://www.microsoft.com/downloads/details.aspx?FamilyID=56fc92ee-a71a-4c73-b628-ade629c89499&displaylang=en (входит в комплект ресурсов IIS)

Эти узлы должны иметь разрешение на чтение для пользователя вашего веб-приложения: \ LM \ SMTPSVC \ LM \ SMTPSVC \ 1

3 голосов
/ 16 ноября 2011

У меня была такая же ошибка в Windows 7 с кодом, который отлично работал на XP. После долгих проб и ошибок. Я настроил IIS для хранения почты в каталоге раскладки. Но у меня все еще была ошибка.

В своем коде я закомментировал строку:

client.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;

Удаление этой строки кода сработало, не знаю почему. Надеюсь, что это сработает и у вас, потому что эта проблема - бесполезная трата времени на устранение неполадок.

Мне НЕ нужно было изменять какие-либо разрешения для каталога. Мне не нужно было модифицировать метабазу. Мне НЕ нужно было изменять web.config (что я действительно не хотел делать, потому что я хочу, чтобы электронные письма помещались в каталог, пока я занимаюсь разработкой на своем локальном компьютере, а не на производстве - я не хотел два разных файла web.config для поддержки).

0 голосов
/ 05 июня 2014

Вы также можете указать его для вашего проекта unittest:

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

Создайте файл app.config в вашем проекте unittest, если он не существует, или объедините эти строки с существующим 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...