C# 使用EWS将电子邮件数据传递到数据库
我目前正在开发一个windows服务,该服务使用Exchange Web服务API从邮箱收集电子邮件,并将电子邮件中的数据传递到存储过程。然后,存储过程将此数据添加到SSMS中的表中。我已经手动测试了存储过程,它运行良好。我也有一个方法写一个文本文件和所有方面的电子邮件(收件人,日期,主题等)正在收集 我的问题是,只有邮箱中最新的电子邮件被传递到数据库。下面是我的代码: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;
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”变量继续增长。