2014-10-24 20 views
5

Mając nadzieję, że ktoś będzie w stanie pomóc z tym, rozejrzałem się i nie mogę znaleźć nigdzie odpowiedzi..NET 4.5 Klient SMTP Problem z drażnieniem podczas dostarczania do katalogu Pickup

Tworzę wiadomość pocztową, która będzie dostarczana do określonego katalogu pobierania, kod ten był wielokrotnie używany w przeszłości bez problemów. Teraz jednak, gdy sprawdzam wynikowy plik, a dokładniej adres URL w pliku eml, widzę, że w środku znajduje się podwójne .. Z tego, co czytałem, rozumiem, że jest to część protokołu SMTP, która polega na dodawaniu kropek, jeśli pierwszy znak w linii zaczyna się od .. Plik ten zostanie później odebrany przez inną usługę, która ostatecznie przeprowadzi wysyłanie wiadomości e-mail.

Byłem w stanie zawęzić go do dokładnej linii, gdy zadzwonię pod numer client.Send(). Jeśli sprawdzam treść wiadomości przed wysłaniem, adres URL jest poprawnie uformowany. Po sprawdzeniu treści wiadomości po jej wywołaniu w adresie URL pojawia się ...

Moje pytanie lub pytania, jak sądzę, są następujące:

  1. Czy ktoś jeszcze natknąć się na problem z nadzieniem dot podczas korzystania SmtpDeliveryMethod.SpecifiedPickupDirectory?
  2. Czyja praca polega na prawidłowym obsługiwaniu tego? .NET SMTP lub usługa dodatkowa, która odbiera tę wiadomość w późniejszym terminie i wysyła ją do ostatecznego miejsca docelowego?
  3. Wszelkie porady, jak rozwiązać ten problem?

Próbowałem wcześniej approach described here, ale nie udało się z wieloma wyjątkami.

Poszukuję głównie sposobu na zapisanie tego pliku eml do lokalizacji na dysku, która może być później odebrana z powrotem i wysłana, moja wiedza na temat języka C# jest nadal dość ograniczona, więc może być coś prostego. patrząc, więc wszelkie rady lub wskazówki byłyby niezwykle cenne!

Utworzyłem małą próbkę kodu, aby spróbować odtworzyć problem, nie jest to dokładna treść, której używam, ale pokazuje, że po wysłaniu za pośrednictwem metody client.Send() istnieją 2 ".." na początku napisu.

using (var client = new SmtpClient()) 
{ 
client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; 
client.PickupDirectoryLocation = @"C:\temp"; 
var message = new MailMessage(); 
message.To.Add(new MailAddress("[email protected]")); 
message.From = new MailAddress("[email protected]"); 
message.Subject = "Smtp Dot Stuffing Test"; 
message.Body = ".A.B.C..... .0.1.2.3.4.5.6.7.8.9"; 
client.Send(message); 
} 
+0

Czy możesz pokazać nam jakiś odpowiedni kod? – Dawnkeeper

+0

@Dawnacker Właśnie dodałem mały fragment kodu przykładowego, aby zademonstrować problem –

Odpowiedz

3

SmtpClient nie powinien być wypychany do bajtów podczas zapisywania do pliku. Jest to potrzebne tylko wtedy, gdy faktycznie "ładuje" strumień wiadomości do serwera SMTP, aby zapobiec przedwczesnemu zakończeniu polecenia DATA (które kończy się linią: ". \ R \ n").

Jeśli SmtpClient jest funkcją wypychania bajtów podczas zapisywania do pliku, zachowanie jest dość zepsute.

Ponieważ jest to niemożliwe do obejścia, jeśli używasz System.Net.Mail (i zakładam, że jesteś), mogę polecić użycie MimeKit do utworzenia i zapisania twojej wiadomości do pliku.

Następnie, jeśli chcesz ponownie przeanalizować wiadomość i wysłać ją przez SMTP, możesz użyć do tego celu MailKit.

+0

Tak, używam System.Net.Mail, więc brzmi to jak coś tam jest złamane. Najmniej nie robiłem niczego wyraźnie nie tak, podam twoją sugestię i zobaczę, jak sobie radzę.Dzięki za radę –

+0

Po prostu podałem to, a raz zadzwoniłem do MimeKits "WriteTo()" i sprawdziłem wynikowy plik eml, który został sformatowany poprawnie. Dzięki za podpowiedź na temat Mimekit, całkiem przydatna biblioteka! –

+0

Nie ma problemu, i dzięki! – jstedfast