2009-10-23 5 views
14

Я работаю над инструментом, который рассылает письма с нашего почтового сервера на C#. Я использовал классы System.Net.Mail для отправки почты.System.Net.Mail Alternative

Недавно я столкнулся с различными проблемами в отношении нарушений RFC и других проблем, таких как SmtpClient, которые не заканчивают сеанс SMTP в соответствии с протоколом. Каждая из этих проблем учитывает высокий балл спама и влияет на доставку электронной почты, поэтому мне нужно решение этих проблем.

Мне интересно, к чему прибегают другие люди, чтобы решить эти проблемы. Попросите людей начать использовать компонент третьей части, если это так?

EDIT: Как подтверждающих доказательств, см: http://www.codeproject.com/KB/IP/MailMergeLib.aspx

+0

Вы должны ссылаться на подтверждающие доказательства, которые вы ссылаетесь во втором абзаце. –

+1

Хороший golly: http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/879f13d7-24e6-4a0f-b396-627e9da25fc1/ Очевидно, что это не высокий приоритет. –

+0

На самом деле для нас было очень важно исправить ошибки в .NET 4.0, и мы внесли значительные улучшения в эту область System.Net.Mail. См. Мой ответ ниже –

ответ

-1

Я использовал SQL Server для отправки сообщений электронной почты в ситуациях, когда клиент рабочего стола не был в состоянии отправить почту (как правило, по соображениям безопасности), но сервер может.

+1

Почему downvote? Для магазинов Microsoft DBMail в SQL Server _is_ является жизнеспособной альтернативой System.Net.Mail. –

+0

Я думаю, что этот вопрос можно четко понимать как «альтернативу .NET для SmtpClient» - он говорит, что использует C# – PandaWood

+0

. Мартин спросил: «Люди начали использовать компонент третьей части, если это так?» Я интерпретировал «компонент третьей части», чтобы предоставить больше возможностей, чем чистое решение C#. Хотя это не чистый C#, SQL DBMail является обходным решением. –

2

Если у вас есть 2007 почтовый сервер Microsoft Exchange, то у вас есть возможность использовать это web service направления для отправки электронной почты. Сам веб-сервис немного странный, но мы смогли инкапсулировать странность и заставить ее работать так же, как и наш SMTP-класс.

Во-первых, вам нужно будет сделать ссылку на обмен веб-службы, как это: https://mail.yourwebserver.com/EWS/Services.wsdl

Вот пример:

public bool Send(string From, MailAddress[] To, string Subject, string Body, MailPriority Priority, bool IsBodyHTML, NameValueCollection Headers) 
{ 
    // Create a new message. 
    var message = new MessageType { ToRecipients = new EmailAddressType[To.Length] }; 

    for (int i = 0; i < To.Length; i++) 
    { 
     message.ToRecipients[i] = new EmailAddressType { EmailAddress = To[i].Address }; 
    } 

    // Set the subject and sensitivity properties. 
    message.Subject = Subject; 
    message.Sensitivity = SensitivityChoicesType.Normal; 
    switch (Priority) 
    { 
     case MailPriority.High: 
      message.Importance = ImportanceChoicesType.High; 
      break; 

     case MailPriority.Normal: 
      message.Importance = ImportanceChoicesType.Normal; 
      break; 

     case MailPriority.Low: 
      message.Importance = ImportanceChoicesType.Low; 
      break; 
    } 

    // Set the body property. 
    message.Body = new BodyType 
        { 
         BodyType1 = (IsBodyHTML ? BodyTypeType.HTML : BodyTypeType.Text), 
         Value = Body 
        }; 

    var items = new List<ItemType>(); 
    items.Add(message); 

    // Create a CreateItem request. 
    var createItem = new CreateItemType() 
        { 
         MessageDisposition = MessageDispositionType.SendOnly, 
         MessageDispositionSpecified = true, 
         Items = new NonEmptyArrayOfAllItemsType 
           { 
            Items = items.ToArray() 
           } 
        }; 


    var imp = new ExchangeImpersonationType 
       { 
        ConnectingSID = new ConnectingSIDType { PrimarySmtpAddress = From } 
       }; 
    esb.ExchangeImpersonation = imp; 

    // Call the CreateItem method and get its response. 
    CreateItemResponseType response = esb.CreateItem(createItem); 

    // Get the items returned by CreateItem. 
    ResponseMessageType[] itemsResp = response.ResponseMessages.Items; 
    foreach (ResponseMessageType type in itemsResp) 
    { 
     if (type.ResponseClass != ResponseClassType.Success) 
      return false; 
    } 

    return true; 
} 
0

Для совместимых со стандартами и широким набором почтовых инструментов (и другие стандарты IETF) Я несколько раз нашел/n программное обеспечение IP * Works - хороший API. Я использовал его как в исходящих, так и исходящих сценариях. Для исходящего сценария я использовал его для большой поддержки почтовой рассылки, и в моем текущем проекте я использую его для широкомасштабного поиска почты IMAP для интенсивного использования входящих почтовых ящиков поддержки клиентов. У меня никогда не было проблем с соблюдением (насколько это хорошо).

Этот набор поддерживает гораздо больше, чем IMAP и SMTP. Его можно найти here, и я нашел, что стоимость вполне приемлема, учитывая то, что вы получаете за свои деньги.

1

SmtpClient был изменен в .NET 4.0 так, чтобы он правильно закрывал соединения, отправив сообщение QUIT. Кроме того, были внесены существенные улучшения в соответствие стандартам с кодировкой Unicode и сгибанием длин длинной строки, поэтому вы должны найти, что ваши спам-счета снижаются, если вы переходите на .NET 4.0. Исправляемые и кодирующие исправления поставляются в .NET 4.0 Beta 2, но вам придется подождать, пока .NET 4.0 RC не получит сообщение о выходе QUIT. Кроме того, SmtpClient теперь реализует IDisposable, чтобы вы могли детерминистически закрыть ваши smtp-соединения, когда вы закончите отправлять сообщения. Этот блог подробности некоторые улучшения, которые были сделаны, хотя это не говорит о IDisposable на SmtpClient (должен быть еще один блог на этом блоге в какой-то момент, который описывает, что изменение): http://blogs.msdn.com/ncl/archive/2009/08/06/what-s-new-in-system-net-mail.aspx

+1

Длинные объекты по-прежнему неправильно кодируются в .NET 4.0. Команда System.Net.Mail не могла исправить это годами! Это ужасно, и команда работает ужасно. – nightcoder

+0

Просто из любопытства, что неправильно кодируется? Я больше не работаю, но меня интересует то, что вы ожидаете. Одна вещь, которую я помню, это то, что существуют стандарты, с точки зрения которых вы должны выбрать кодирование, и они в основном игнорируются (по умолчанию он используется для Q-кодирования, я думаю, вместо Base64, что должно быть для некоторых языков), но фактическая кодировка должна быть верный. –

+0

Jeff, если я отправлю электронное письмо с длинной темой на русском языке (кириллическая кодировка), то получатель получит сообщение с неправильными символами (показано как вопросительные знаки) в середине темы, что-то вроде «Очень длинный длинный длинный длинный длинный длинный длинный длинный длинный длинный длинный предмет "(но по-русски, конечно). Я не помню точной причины, но, как я помню, это из-за неправильного кодирования предмета (они не соответствуют стандарту в кодировке, который, как я думаю). – nightcoder

1

Что о Rebex Secure Mail?

Раскрытие информации: Я участвую в разработке этой библиотеки.

1

Один из вариантов: MailKit. Имеет массу функций, отправка может быть надежно отменена с помощью CancellationToken, поэтому у него нет the problem из SmtpClient, что он не соблюдает указанный тайм-аут. Имеет много загрузок на NuGet.

Даже недавнее documentation рекомендует его:

[System.Obsolete ("SmtpClient и ее сеть типов плохо спроектированных, мы настоятельно рекомендуем использовать https://github.com/jstedfast/MailKit и https://github.com/jstedfast/MimeKit вместо")] класс SmtpClient общественности: IDisposable