【问题标题】:Sending email with EWS API very slow使用 EWS API 发送电子邮件非常慢
【发布时间】:2017-03-01 20:46:54
【问题描述】:

我下面的代码表现很差。我使用 .Net StopWatch 类找出导致缓慢的代码。 这条线似乎是问题所在:

message.SendAndSaveCopy();

E.G 批 20 封电子邮件:发送第一封电子邮件大约需要 2 秒,这个时间逐渐增加,直到第 20 封电子邮件,最多需要 18 秒。

public int SendBulkMarketing(bool CheckDelivery)
{
    int iCounter = 0;
    DataTable dt = null;
    try
    {
        DeliveryReportDAL myDeliveryReportDAL = new DeliveryReportDAL();
        dt = myDeliveryReportDAL.GetListMessageToSend('E');
        if (dt == null) return iCounter;
        iCounter = dt.Rows.Count;
    }
    catch (Exception ex)
    {
        new Util().LogError(ex, "SMTP:: SendBulkMarketing 1st catch");
        return 0;
    }
    if (iCounter > 0)
    {
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
        service.Credentials = new WebCredentials(Account_UserName, Account_Password, Account_Domain);
        service.Url = new Uri(Service_URL);

        for (int I = 0; I < iCounter; ++I)
        {
            try
            {
                string myGUID = "{" + dt.Rows[I]["GUID"].ToString() + "}";
                if (IsValidEmailAddress(dt.Rows[I]["OwnerEmail"].ToString()) == false)
                {
                    DeliveryReportDAL myReport = new DeliveryReportDAL();
                    myReport.SaveSentStatus(myGUID, 'G', 3);
                    continue;
                }

                EmailMessage message = new EmailMessage(service);
                message.Subject = dt.Rows[I]["TemplateSubject"].ToString();
                message.Body = dt.Rows[I]["TemplateText"].ToString().Replace("\0", " ");
                message.ToRecipients.Add(dt.Rows[I]["OwnerEmail"].ToString());
                message.IsDeliveryReceiptRequested = true;
                Guid myPropertySetId = new Guid(myGUID);

                ExtendedPropertyDefinition myExtendedPropertyDefinition = new ExtendedPropertyDefinition(myPropertySetId, "blablabla", MapiPropertyType.String);

                ServicePointManager.ServerCertificateValidationCallback =
                delegate(object sender1,
                         System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                         System.Security.Cryptography.X509Certificates.X509Chain chain,
                         System.Net.Security.SslPolicyErrors sslPolicyErrors)
                { return true; };

                message.SendAndSaveCopy();

                DeliveryReportDAL myReport1 = new DeliveryReportDAL();
                myReport1.SaveSentStatus(dt.Rows[I]["GUID"].ToString(), 'G', 1);
            }
            catch (Exception ex)
            {
                new Util().LogError(ex, "SMTP:: SendBulkMarketing 2nd catch");
            }
        }
    }
    return iCounter;
}

如果能帮助我提高代码的性能,我将不胜感激。

【问题讨论】:

  • 我不知道确切的问题,但以下链接可能对您进行更多调试有所帮助如果您的发现,请告诉我们。
  • @SivakrishnaDonepudi 感谢您的帮助。但是,我已经使用了日志记录/跟踪功能,但它没有为我提供任何答案,而且我也完全了解最佳实践。我认为这个问题可能是由于 Exchange 服务器上的限制策略,特别是 MessageRateLimit 策略。我目前正在对此进行调查。

标签: c# exchangewebservices ews-managed-api


【解决方案1】:

此性能问题现已解决。

这是一个基本的编码问题。该问题是由 for 循环内部调用的单独方法调用引起的(未在提供的代码 sn-p 中显示)。它包含性能密集型功能,但不需要在 for 循环内调用。

将这个性能繁重的方法调用移到 for 循环之外解决了这个问题。

【讨论】:

    猜你喜欢
    • 2019-10-10
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2019-07-12
    相关资源
    最近更新 更多