2010-02-03 26 views

cevap

14

Ne yazık ki, IIS/SMTP alma dizininin konumunu belirlemeye çalışırken herhangi bir türünde sorun oluştuğunda bu özel durum ortaya çıkar. Yaygın bir neden, IIS SMTP hizmetinde eksik.

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

Veya bunun yerine ASP.NET en Web.config, bu set: Eğer System.Net.Mail.SmtpClient kullanarak posta gönderiyorsanız

, elle toplama dizini ayarlamayı deneyin

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

Alternatif olarak, SmtpDeliveryMethod.Network yöntemini kullanın ve SMTP sunucunuza Host ve Port özelliklerini gönderin.

fazla bilgi: http://forums.iis.net/p/1149338/1869548.aspx

+1

PickupDirectoryLocation hakkında daha fazla bilgi alabilir misiniz? PickupDirectoryLocation'ı kullanmak için hangi değeri vermemiz gerekiyor? – ManirajSS

+1

Alım SatışıYedekleme, IIS SMTP hizmeti (veya uyumlu üçüncü taraf hizmeti) tarafından bir alma dizini olarak kullanılan bir dizine giden bir yola ayarlanmalıdır - kaydedilen tüm e-postalar gönderilir. Örneğin, "C: \ Inetpub \ mailroot \ Pickup" olabilir. –

9

web-app olarak çalışan hesap, bu hata atılabilmektedir gerekli düğümlere erişimi yok yani eğer toplama dizini, II6 Metatabanınızı saklanır (vardı bu kendim). Metatabanı izinleri dosya izinleri ayrı, bu yüzden Metatabanı explorer ile keşfetmek:

http://www.microsoft.com/downloads/details.aspx?FamilyID=56fc92ee-a71a-4c73-b628-ade629c89499&displaylang=en (IIS kaynak kitinin onun parçası)

Bu düğümler okumak izni web-app kullanıcıya verdik gerekir

: \ LM \ SmtpSvc \ LM \ SmtpSvc

+0

Bu çalışmasını sağlamak için dosya izinlerini düzeltmem gerektiğini de belirtmeliyim. – Peter

+0

Bu harika ve şimdi sorunu görebiliyorum/anlayabiliyorum, ancak Windows 2008 kutumda Uygulama Havuzu Kimliği kullanıyorum ve bu kullanıcı hesabının izinlerini ayarlamak için GUI'yi kullanamıyorum. Bunu yapmak için daha önce komut satırından dosya izinleri ayarladım. Bu izinler için aynı şeyi yapmanın mümkün olup olmadığını biliyor musunuz? – ProNotion

3

Ben XP üzerinde iyi çalıştı koduyla Windows 7 bu aynı hatayı başlamıştı 1 \. Çok fazla deneme ve hatadan sonra. Postaları bir alma dizinine depolamak için IIS'yi kuruyorum. Ama yine de hatam oldu. Benim kod

çizgiyi dışarı yorumladı:

client.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;

Bu kod satırını çıkarmak işe yaradı, neden olmasın. Umarım bu sizin için de çalışır çünkü bu sorun, gerçek zamanlı bir sorun değildir.

Dizindeki tüm izinleri değiştirmek zorunda kalmamıştım. Metatabanını değiştirmek zorunda DEĞİLDİM. Web.config'i değiştirmem gerekmedi (ki bunu yapmak istemedim çünkü üretimde değil, yerel makinemde geliştirme yaparken sadece bir dizinin içine yerleştirilmiş e-postaları istiyorum.) korumak için iki farklı web.config dosyasını istiyorum).

+0

Sadece bunun benim için çalışılan şey olduğunu söylemek için bağırıyor. Bir VS2004 projesini VS2010'a güncelledim ve bu satır kaldırılıncaya kadar gönderimi reddeden e-posta gönderdim. – spamguy

0

Ayrıca unittest proje için bunu belirtebilirsiniz:

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

Ve test kodu:

[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("[email protected]", "Tester"); 
    MailAddress mailTo = new MailAddress("[email protected]", "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."); 
} 

değil, varsa unittest projede app.config dosyasını oluşturma veya bu satırları birleştirme mevcut app.config ile.

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