Метод SendEmail не работает - PullRequest
1 голос
/ 01 июня 2011

Я пишу приложение, которое отправляет много электронных писем в течение жизненного цикла приложения.

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

Я использую метод SendEmail в вспомогательном классе SPUtility.Прямо сейчас у меня есть метод, который выглядит следующим образом:

public static void SendEmail(SPWeb web, string to, string subject, string body)
{

    //Some logic goes here
    System.Threading.ThreadPool.QueueUserWorkItem(o =>
    {
        SPUtility.SendEmail(web, false, false, to, subject, body, false);
    });
}

Этот метод определен в DLL, и он вызывается из множества разных веб-частей.

Но это не такза работой.Если я удаляю бит QueueUserWorkItem и просто позволяю ему отправлять электронные письма вне потока, он работает как чудо, но с другой стороны, он медленный.

Как я могу решить эту проблему?

Ответы [ 5 ]

5 голосов
/ 27 ноября 2012

Также есть возможность сделать что-то вроде этого:

public static void SendEmail(SPWeb web, string to, string subject, string body)
{
    var siteId = Web.Site.ID;

    System.Threading.ThreadPool.QueueUserWorkItem(o =>
    {
        using (var site = new SPSite(siteId))
        using (var myWeb = site.OpenWeb())
        {
            SPUtility.SendEmail(myWeb, false, false, to, subject, body);
        }
    });
}

Может, кому-то будет интересно.

5 голосов
/ 01 июня 2011

Я подозреваю, что вам лучше использовать MailMessage Class (System.Net.Mail)

MailMessage mess = 
    new MailMessage(
        SPContext.Current.Site.WebApplication.OutboundMailReplyToAddress, 
        sendTo, 
        subject, 
        message);  
mess.IsBodyHtml = true;  
SmtpClient smtp = 
    new SmtpClient(
        SPContext.Current.Site.WebApplication.OutboundMailServiceInstance.Server.Address);  
smtp.Send(mess);

этот пост MSDN похож на вашу ситуацию, Отправка электронной почты с использованиемSPUtility.SendEmail медленно в производстве

1 голос
/ 01 июня 2011

Быстрое решение проблемы до тех пор, пока вы не сможете настроить более постоянное решение, состояло бы в том, чтобы отправлять ваши электронные письма на сервер smtp на том же компьютере и пересылать их вам.

В будущем я бы создал электронное письмосервис, который легко вызывать, как сервис wcf, в который можно встроить многопоточность.

1 голос
/ 01 июня 2011

Вы должны рассмотреть более распределенный шаблон для отправки этих писем.В частности, я бы определил некоторую структуру для хранения «отправки запросов».Это может быть список SharePoint, MSMQ, очередь в хранилище Azure и т. Д.

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

Если вы решили использовать несколько агентов для обработки этих запросов, вам может потребоваться определить более сложный механизм организации этих агентов для предотвращения помех.

Что касается хоста для агента (ов), это может быть приложение, которое зарегистрировано как запланированная задача, служба Windows с «Таймером» или рабочий процесс SharePoint, который вызывает мой таймер.

Это всего лишь одна реализация, но, в конечном счете, вы хотите отделить действие «запрос» отправки электронной почты от акта «выполнения» этой отправки.

0 голосов
/ 01 июня 2011

Получаете ли вы сообщение об ошибке? Я столкнулся с этим один раз и в итоге поставил небольшую задержку (например, Thread.Sleep (500)) перед отправкой каждого электронного письма. По какой-то причине сервер smtp отклонил некоторые отправленные письма. Кроме того, вы должны следовать совету @ rushonerok и отправлять электронную почту через SMTP-сервер. GlennFerrieLive - гораздо более надежное решение, на которое следует обратить внимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...