我正在创建一个基本系统,允许用户通过电子邮件回复网站上的帖子。但是,大多数电子邮件客户端在其回复电子邮件中包含以前电子邮件的文本。该文本在网站上是不受欢迎的。
是否有一种可靠的方法可以在不事先了解早期电子邮件的情况下仅提取新邮件?我正在使用email
类的Python。
Content-Type: text/plain; charset=ISO-8859-1
test message! This is the part I want.
On Thu, Mar 24, 2011 at 3:51 PM, <test@test.com> wrote:
> Hi!
>
> Herman just posted a comment on the website:
>
>
> From: Herman
> "Hi there! I might be interested"
>
>
> Regards,
> The Website Team
> http://www.test.com
>
这是来自gmail的回复邮件,我相信其他客户可能会采用不同的方式。一个好的开始可能是忽略以>
开头的行,但在新消息之间也可能有这样的行,然后它们可能应该被保留。我还会有内容类型行和日期行。
答案 0 :(得分:4)
电子邮件回复的格式取决于客户端。没有可行的方法来提取最新的消息而没有删除太多或不够的风险。
但是,标记引号的常用方法是在前面添加>
,因此以该字符开头的行 - 特别是如果在电子邮件的最后或开头有多个 - 可能是引号。< / p>
但是你的例子中的On Thu, Mar 24, 2011 at 3:51 PM, <test@test.com> wrote:
很难提取。在引号之前以:
结尾的行可能表示它属于引号,您无法确切知道 - 它也可能是新消息的一部分而冒号只是一个错字{{{ 1}}(在德语键盘.
上是:
)。
答案 1 :(得分:1)
我认为这应该有用
import re
string_list = re.findall(r"\w+\s+\w+[,]\s+\w+\s+\d+[,]\s+\d+\s+\w+\s+\d+[:]\d+\s+\w+.*", strings) # regex for On Thu, Mar 24, 2011 at 3:51 PM
res = strings.split(string_list[0]) # split on that match
print(res[0]) # get before string of the regex
答案 2 :(得分:1)
@LAMRIN TAWSRAS给出的答案仅在找到匹配项的情况下才可用于解析Gmail日期表达式之前的文本,否则将引发错误。另外,无需在整个消息中搜索多个日期表达式,只需要找到第一个即可。因此,我将优化他的解决方案以使用re.search()
:
def get_body_before_gmail_reply_date(msg):
body_before_gmail_reply = msg
# regex for date format like "On Thu, Mar 24, 2011 at 3:51 PM"
matching_string_obj = re.search(r"\w+\s+\w+[,]\s+\w+\s+\d+[,]\s+\d+\s+\w+\s+\d+[:]\d+\s+\w+.*", msg)
if matching_string_obj:
# split on that match, group() returns full matched string
body_before_gmail_reply_list = msg.split(matching_string_obj.group())
# string before the regex match, so the body of the email
body_before_gmail_reply = body_before_gmail_reply_list[0]
return body_before_gmail_reply
答案 3 :(得分:0)
尝试一下:
import re
def deleteForwardedMessagesFromMessage(message):
nextMessage = re.split(r"\n.*[\,].*\<\s*.*>", message)[0]
print(nextMessage)
return nextMessage
答案 4 :(得分:0)
试试这个它适用于法语/英语电子邮件:
<块引用>在 2011 年 3 月 24 日星期四下午 3:51,test@test.com 写道:
<块引用>勒梅尔。 28 日2021 à 10:03, test.test@orange.com a écrit :
regex=r'\w+\s+\w+[,.]\s+(\w+\s+\d+|\d+\s+\w+)[,.]\s+\d+\s+(\w+|\à )\s+\d+[:]\d+(\s+\w+)?,?\s+(\s*\s*[a-zA-Z][._-]?[a-zA -Z][@]\w+[.]?\w{2,3}\s*>?;?\s*)(a écrit|wrote)\s*:'