2010-09-08 76 views
1

我从POP服务器检索原始文本(包括标题和消息)。我需要捕获标题之后的所有内容,标题之间以空行和用户消息之间的空白行结束。提取电子邮件数据的正则表达式模式

与此同时,我想要忽略来自原始邮件的任何内容,如果它是回复。为我解析开始电子邮件的回复与

------Original Message------ 

开始一个例子电子邮件可能看起来像这样

返回路径:...
...
更多电子邮件元数据:...

你好,来自正则表达式土地,我很高兴收到你的来信。
------原始邮件------
元数据:...
...

嘿伙计正则表达式,你能帮帮我吗?谢谢!

此致,我。

我需要提取“来自正则表达式的问候语,我很高兴收到您的来信。”和原始邮件之前的任何其他文本/行。

我现在正在使用这个正则表达式(C#在多行模式下),它似乎工作,除了它捕获------原始消息------如果主体是空白的。我宁愿只是有一个空白的字符串。

^\s*$\n(.*)(\n------Original Message------)? 

编辑
我没有投下来的人,如果你碰巧downvote,它通常是有帮助的,包括注释。

回答

0

为什么你不使用DotnetOpenMail?使用正则表达式做,这是一种错误的做法,你会更好使用专用的电子邮件处理程序代替....

+0

我使用,我被告知要使用,而不是获取信息为目的(POP3客户端,我会更喜欢),我只能检索每条消息的原始文本。否则,这不会是一个问题。 – jlafay 2010-09-08 14:37:45

+0

呃......这对于这个使用正则表达式没有任何意义...你使用的是什么pop3客户端 - 那个pop3客户端应该正在处理消息正文的处理等等否则正则表达式不会是需要! – t0mm13b 2010-09-08 14:45:24

+0

谢谢你试图帮助tommie。那么让我们从这个角度来说吧。我有PO3邮件客户端代码,我将它扩展为为从POP服务器检索的每条消息实例化一个MailMessage对象。现在我正在编写方法来提取部分原始文本以保存对象属性。 – jlafay 2010-09-08 14:46:55

0

这样做的原因是,你必须在括号内的额外\n。如果身体是空白的,那里没有额外的换行符。因此,试试这个:

^\s*$\r\n(.*)(^------Original Message------$)? 

如果你不想在身体的末端换行,你仍然可以使用string.Trim()上匹配的部分。

注意:这里假定输入使用\r\n行结束符(根据MIME标准在电子邮件标题中需要)。

+0

这产生了相同的结果。 – jlafay 2010-09-08 14:39:35

+0

@jlafay:对,对不起。它应该是'\ r \ n'而不是'\ n'。更新了答案。 – Timwi 2010-09-08 14:51:03

-1

您需要(?=(\n------Original Message------))先行更换(\n------Original Message------)有来无回的那部分,只是为了确保它的存在

+0

这样比较好。问题是它没有考虑不包含“原始消息”的电子邮件。非常接近,谢谢。 – jlafay 2010-09-08 14:46:10

+0

除了“原始消息”以外,还有什么替代终结符? – 2010-09-08 14:48:32

+0

我只是希望它在原始消息行之前停止捕获。并非所有的电子邮件都会有这一行,只是大部分都会。所以如果这条线不存在,它是一个新的电子邮件,而不是一个回复。我想要所有这些。 – jlafay 2010-09-08 14:54:40