Альтернатива System.Net.Mail

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

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

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

РЕДАКТИРОВАТЬ. В качестве подтверждающих доказательств см.: http://www.codeproject.com/KB/IP/MailMergeLib.aspx

Ответы

Ответ 1

Если у вас есть почтовый сервер Microsoft Exchange 2007, у вас есть возможность использовать его веб-сервис для отправки электронной почты. Сам веб-сервис немного странный, но мы смогли инкапсулировать странность и заставить ее работать так же, как наш 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;
}

Ответ 2

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

Ответ 3

Как насчет Rebex Secure Mail?

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

Ответ 4

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

Даже недавняя документация рекомендует:

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

Ответ 6

Я был доволен этими компонентами: QuikSoft

Ответ 7

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

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

Ответ 8

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