Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将电子邮件与其以前的答复区分开来_C#_.net_Email_Openpop - Fatal编程技术网

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:客户 回答:“你在干什么?”
但是当我收集这3封带有短语GetBodyAsText的邮件时,我会从每封邮件中得到完整的对话——包含1、2和3

我只想要邮件3的内容。如何做到这一点

我已经尝试了几种方法,例如消息部分,但它的作用是相同的,检索邮件1、2和3

你有任何链接,我可以阅读更多关于它,或代码样本? 必须说我使用OpenPop.Mine

这是我的代码:

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字符串的一部分(而不必指定整个字符串,因为在您的示例中,整个字符串在响应之间会发生变化)。