1

如何将电子邮件与之前的答案分开?我只想要最新的回复

例如:

  • 邮件 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/#!>
>>>
>>>
>>
>
4

2 回答 2

1

SigParser 的 API 可以拆分电子邮件,就像您请求英语、德语和西班牙语一样。向它提供电子邮件的正文,它将为您提供数组中每个电子邮件段的正文。

https://api.sigparser.com/

在用于预览电子邮件如何解析的 SigParser Try 页面上,这是上一个答案中电子邮件的结果。

在此处输入图像描述

这是 emails 属性的 API 规范。

在此处输入图像描述

于 2018-11-19T18:08:38.243 回答
0

一种方法是在电子邮件正文中的响应之间寻找一个共同的分隔符。通常不同的响应将由单词“From:”、“---Original Message---”等分隔。

如果是这种情况,并且最近的响应位于顶部,您可以将消息的第一部分抓取到分隔符。例如,这是一个可以做到的方法:

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);

输出是:

谢谢,迫不及待地想见到你!

谢谢,丹

更新

如果您没有始终是相同分隔符的完整字符串,您也可以按通用模式拆分。例如,如果您知道分隔符总是以某些文本开头、包含某些文本和/或以某些文本结尾,则可以使用以下方法。请注意,分隔符参数不是必需的,因此如果没有常见的“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();
}

在您的示例消息中,分隔符看起来总是以“D”开头,包含单词“written”,并以字符串“.com>:”结尾。如果是这种情况,那么您可以像这样使用上述函数:

string lastResponse = GetLastResponse(conversation, "D ", " wrote ", ".com>:");

Console.WriteLine(lastResponse);

输出是:

只是冷静,你呢?

此致

测试人员

开发商

*公司名称 *

*emailA@gmail.com

http://goog_1337018965/ Facebook http://www.facebook.com http://goog_1337018972/ Twitter https://twitter.com/#!

于 2015-01-28T01:57:06.767 回答