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

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

14 голосов
/ 23 октября 2009

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

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

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

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

Ответы [ 8 ]

2 голосов
/ 08 сентября 2016

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

Даже последняя документация рекомендует это:

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

2 голосов
/ 25 октября 2009

Если у вас есть сервер электронной почты 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;
}
1 голос
/ 21 июня 2010

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

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

1 голос
/ 15 декабря 2009

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

0 голосов
/ 26 октября 2009

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

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

0 голосов
/ 23 октября 2009

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

0 голосов
/ 23 октября 2009
0 голосов
/ 23 октября 2009

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

...