C# 如何将电子邮件与其以前的答复区分开来
如何将电子邮件与其以前的答复区分开来?我只想要最新的答复 例如:C# 如何将电子邮件与其以前的答复区分开来,c#,.net,email,openpop,C#,.net,Email,Openpop,如何将电子邮件与其以前的答复区分开来?我只想要最新的答复 例如: 邮件1:客户发送一封邮件,内容为:“你好” 邮件2:我 用文字数字回答电子邮件:“是吗?” 邮件3:客户 回答:“你在干什么?” 但是当我收集这3封带有短语GetBodyAsText的邮件时,我会从每封邮件中得到完整的对话——包含1、2和3 我只想要邮件3的内容。如何做到这一点 我已经尝试了几种方法,例如消息部分,但它的作用是相同的,检索邮件1、2和3 你有任何链接,我可以阅读更多关于它,或代码样本? 必须说我使用OpenPo
- 邮件1:客户发送一封邮件,内容为:“你好”
- 邮件2:我 用文字数字回答电子邮件:“是吗?”
- 邮件3:客户 回答:“你在干什么?”
Models.Helpdesk.Email obj = new Models.Helpdesk.Email();
obj.MessageNumber = i;
obj.MessageId = message.Headers.MessageId;
obj.From = message.Headers.From.Address;
obj.Subject = message.Headers.Subject;
obj.Reference = message.Headers.References;
OpenPop.Mime.MessagePart plaintxt = message.FindFirstPlainTextVersion();
if ((plaintxt != null))
{
obj.Body = plaintxt.GetBodyAsText();
}
else
{
if ((htmltxt != null))
{
obj.Body = htmltxt.GetBodyAsText();
}
else
{
obj.Body = "";
}
}
obj.DateSent = message.Headers.DateSent;
obj.Recvd = message.Headers.Date;
这是我的电子邮件输出:
Just chillin, you?
Yours sincerely
*Testperson*
Developer
*Companyname *
*emailA@gmail.com
<http://goog_1337018965/> Facebook <http://www.facebook.com>
<http://goog_1337018972/> Twitter <https://twitter.com/#!>
D 28. januar 2015 kl. 09.16 wrote Test Test <emailA@gmail.com>:
> What are you doing Dan
>
> D 28. januar 2015 kl. 09.12 wrote Test Test <emailA@gmail.com>:
>
> Hey Steve
>>
>> D 28. januar 2015 kl. 09.09 wrote Test Test <emailA@gmail.com>:
>>
>> Hey Dan
>>>
>>> Yours sincerely
>>>
>>>
>>>
>>> *Testperson*
>>>
>>> Developer
>>>
>>> *Companyname *
>>>
>>>
>>> <http://goog_1337018965/> Facebook <http://www.facebook.com>
>>> <http://goog_1337018972/> Twitter
>>> <https://twitter.com/#!>
>>>
>>>
>>
>
冷静点,你呢?
谨上
*测试人员*
开发商
*公司名称*
*emailA@gmail.com
脸谱网
啁啾
D 28。2015年1月,吉隆坡。09.16书面测试:
>你在干什么,丹
>
>D 28。2015年1月,吉隆坡。09.12书面测试:
>
>嘿,史蒂夫
>>
>>D 28。2015年1月,吉隆坡。09.09书面测试:
>>
>>嗨,丹
>>>
>>>您诚挚的
>>>
>>>
>>>
>>>*测试人员*
>>>
>>>显影剂
>>>
>>>*公司名称*
>>>
>>>
>>>脸谱网
>>>推特
>>>
>>>
>>>
>>
>
一种方法是在电子邮件正文中的响应之间寻找一个公共分隔符。通常,不同的响应将由单词“From:”、“---原始消息----”等分隔 如果是这种情况,并且最新的响应位于顶部,那么您只需抓取消息的第一部分,直到分隔符。例如,这里有一个方法可以做到这一点:
static string GetLastResponse(string message, string delimeter = "From:")
{
int delimeterPosition = message.IndexOf(delimeter);
return (delimeterPosition > -1)
? message.Substring(0, delimeterPosition)
: message;
}
然后你可以这样称呼它:
obj.Body =
@"Thanks, can't wait to see you!
Thanks,
Dan
From: Jack Smith
Sent: Tuesday, January 27, 2015 1:15 PM
To: Dan Smith; Ron Smith; Betty Smith
Cc: Jane Doe; John Doe
Subject: RE: Family Reunion
+ Dan
Dan, if you can go, I can go!
Thanks,
Jack
From: Ron Smith
Sent: Tuesday, January 27, 2015 1:15 PM
To: Jack Smith; Betty Smith
Cc: Jane Doe; John Doe
Subject: RE: Family Reunion
What do you guys think about getting together for drinks on Saturday?
Thanks,
Ron";
string lastResponse = GetLastResponse(obj.Body);
Console.WriteLine(lastResponse);
输出为:
谢谢,迫不及待地想见你
谢谢,丹
更新
如果没有始终相同的delimeter的完整字符串,也可以使用公共模式拆分。例如,如果您知道delimeter总是以某个文本开始、包含某个文本和/或以某个文本结束,则可以使用以下方法。请注意,delimeter参数不是必需的,因此如果没有常见的“startsWith”、“endsWith”或“contains”字符串,则可以将null传递给其中一个或多个参数:
private static string GetLastResponse(string message, string delimStartsWith,
string delimContains, string delimEndsWith,
StringComparison comparison = StringComparison.Ordinal)
{
if (string.IsNullOrWhiteSpace(message)) return message;
var lastResponse = new StringBuilder();
var lines = message.Split(new[] {"\r\n", "\n"}, StringSplitOptions.None);
foreach (var line in lines)
{
// Check to see if this line starts with, contains,
// and ends with the specified text
if ((delimStartsWith == null || line.StartsWith(delimStartsWith, comparison)) &&
(delimContains == null || line.IndexOf(delimContains, comparison) >= 0) &&
(delimEndsWith == null ||line.EndsWith(delimEndsWith, comparison)))
{
// If we get here it means all our conditions were met, so this
// line is a delimeter and we should break out of this loop.
break;
}
// Haven't reached a delimeter yet, so add this line to our lastResponse
lastResponse.AppendLine(line);
}
return lastResponse.ToString();
}
在您的示例消息中,delimeters似乎总是以“D”开头,包含单词“write”,并以字符串“.com>:”结尾。如果是这种情况,那么您可以像这样使用上述函数:
string lastResponse = GetLastResponse(conversation, "D ", " wrote ", ".com>:");
Console.WriteLine(lastResponse);
输出为:
冷静点,你呢
您诚挚的
测试人员
显影剂
*公司名称*
*emailA@gmail.com
脸谱网
推特
SigParser的API可以拆分电子邮件,就像您请求使用英语、德语和西班牙语一样。给它一封邮件的正文,它会给你一个数组中每个邮件段的正文 在SigParser的Try页面上,预览电子邮件的解析方式,这是前一个答案中电子邮件的结果 这是电子邮件属性的API规范
你能发布你的密码吗?嘿@Rufus。我试过你的解决办法,但没有成功。我刚刚发布了我的电子邮件对话-这似乎与您的不同,因为我没有任何“发件人”作为分隔符。这部分是电子邮件中的实际文本,还是您修改了其中的任何内容:
d28。2015年1月,吉隆坡。09.16编写测试测试:
我用一个新示例更新了我的答案,该示例允许您指定delimeter字符串的一部分(而不必指定整个字符串,因为在您的示例中,整个字符串在响应之间会发生变化)。