C# 使用EWS将电子邮件数据传递到数据库

C# 使用EWS将电子邮件数据传递到数据库,c#,asp.net,stored-procedures,ssms,exchangewebservices,C#,Asp.net,Stored Procedures,Ssms,Exchangewebservices,我目前正在开发一个windows服务,该服务使用Exchange Web服务API从邮箱收集电子邮件,并将电子邮件中的数据传递到存储过程。然后,存储过程将此数据添加到SSMS中的表中。我已经手动测试了存储过程,它运行良好。我也有一个方法写一个文本文件和所有方面的电子邮件(收件人,日期,主题等)正在收集 我的问题是,只有邮箱中最新的电子邮件被传递到数据库。下面是我的代码: int offset = 0; int pageSize = 50;

我目前正在开发一个windows服务,该服务使用Exchange Web服务API从邮箱收集电子邮件,并将电子邮件中的数据传递到存储过程。然后,存储过程将此数据添加到SSMS中的表中。我已经手动测试了存储过程,它运行良好。我也有一个方法写一个文本文件和所有方面的电子邮件(收件人,日期,主题等)正在收集

我的问题是,只有邮箱中最新的电子邮件被传递到数据库。下面是我的代码:

            int offset = 0;
            int pageSize = 50;
            bool moreEmails = true;
            ItemView view = new ItemView(pageSize, offset, OffsetBasePoint.Beginning);

            view.PropertySet = PropertySet.IdOnly;
            FindItemsResults<Item> findResults;
            List<EmailMessage> emails = new List<EmailMessage>();
            findResults = service.FindItems(WellKnownFolderName.Inbox, view);

            while (moreEmails)
            {
                foreach (var item in findResults.Items)
                {
                    emails.Add((EmailMessage)item);
                }

                moreEmails = findResults.MoreAvailable;

                if (moreEmails)
                {
                    view.Offset += pageSize;
                }
            }

            PropertySet properties = (BasePropertySet.FirstClassProperties);
            service.LoadPropertiesForItems(emails, properties);

            foreach (var EmailParam in emails)
            {
                FromEmail = EmailParam.From.ToString();
                EmailDate = EmailParam.DateTimeReceived.ToString("yyyy-MM-dd hh:mm:ss");
                EmailSubject = EmailParam.Subject;
                EmailBody = EmailParam.Body;
                int SourceID = 1;

                foreach (var recipient in EmailParam.ToRecipients)
                {
                    ToEmail += recipient.Address.ToString();
                }

                foreach (var cc in EmailParam.CcRecipients)
                {
                    Emailcc += cc.Address.ToString();
                }

                using (SqlConnection con = new SqlConnection(conStr))
                {
                    con.Open();
                    SqlDataAdapter da = new SqlDataAdapter("mtsp_CreateTicket", con);
                    da.SelectCommand.CommandType = System.Data.CommandType.StoredProcedure;

                    da.SelectCommand.Parameters.AddWithValue("@Date", EmailDate);
                    da.SelectCommand.Parameters.AddWithValue("@FromEmail", FromEmail);
                    da.SelectCommand.Parameters.AddWithValue("@ToEmail", ToEmail);
                    da.SelectCommand.Parameters.AddWithValue("@EmailSubject", EmailSubject);
                    da.SelectCommand.Parameters.AddWithValue("@EmailBody", EmailBody);
                    da.SelectCommand.Parameters.AddWithValue("@Emailcc", Emailcc);
                    da.SelectCommand.Parameters.AddWithValue("@SourceID", SourceID);
                    da.SelectCommand.ExecuteNonQuery();
                }
            }
int offset=0;
int pageSize=50;
bool=true;
ItemView视图=新的ItemView(页面大小、偏移量、偏移量基点.开始);
view.PropertySet=PropertySet.IdOnly;
FindItemsResults findResults;
列表电子邮件=新列表();
findResults=service.FindItems(WellKnownFolderName.Inbox,视图);
while(更多电子邮件)
{
foreach(findResults.Items中的变量项)
{
电子邮件。添加((EmailMessage)项);
}
moreEmails=findResults.MoreAvailable;
如果(更多电子邮件)
{
view.Offset+=页面大小;
}
}
PropertySet属性=(BasePropertySet.FirstClassProperties);
服务。加载项目的属性(电子邮件、属性);
foreach(电子邮件中的var EmailParam)
{
FromEmail=EmailParam.From.ToString();
EmailDate=EmailParam.DateTimeReceived.ToString(“yyyy-MM-dd hh:MM:ss”);
EmailSubject=EmailParam.Subject;
EmailBody=EmailParam.Body;
int SourceID=1;
foreach(EmailParam.ToRecipients中的var收件人)
{
ToEmail+=recipient.Address.ToString();
}
foreach(EmailParam.CcRecipients中的var cc)
{
Emailcc+=cc.Address.ToString();
}
使用(SqlConnection con=newsqlconnection(cont))
{
con.Open();
SqlDataAdapter da=新的SqlDataAdapter(“mtsp_CreateTicket”,con);
da.SelectCommand.CommandType=System.Data.CommandType.StoredProcess;
da.SelectCommand.Parameters.AddWithValue(“@Date”,EmailDate);
da.SelectCommand.Parameters.AddWithValue(“@FromEmail”,FromEmail);
da.SelectCommand.Parameters.AddWithValue(“@ToEmail”,ToEmail);
da.SelectCommand.Parameters.AddWithValue(“@EmailSubject”,EmailSubject);
da.SelectCommand.Parameters.AddWithValue(“@EmailBody”,EmailBody);
da.SelectCommand.Parameters.AddWithValue(“@Emailcc”,Emailcc);
da.SelectCommand.Parameters.AddWithValue(“@SourceID”,SourceID);
da.SelectCommand.ExecuteOnQuery();
}
}

这是我第一次使用windows服务,我对这项服务有点陌生,因此非常感谢您的帮助。谢谢

如果电子邮件集合中有多个条目,那么您可能会遇到异常,并且代码正在中止循环?顺便说一句,在关闭SqlConnection后,您需要重置ToEmail和Emailcc变量。您可以添加更多代码吗?当你阅读1封电子邮件的参数时,我只看到了部分,服务在哪里?阅读所有电子邮件的时间在哪里?@stevie_c似乎没有抛出任何异常。我要写入的文本文件显示了正在收集的所有数据。这段代码也在try-catch中,没有异常。此外,我假设在foreach循环中设置ToEmail和Emailcc会在每次迭代中重置?@polzka90我添加了显示我如何收集收件箱电子邮件的代码。由于您在ToEmail和Emailcc上使用+=运算符,这些变量将在每次迭代中围绕“emails”变量继续增长。