现在我的回复没有原始消息,这使得单独理解变得复杂。
回复邮件是一项相当具有挑战性的任务,特别是在开始时您不知道从哪里开始。
最近,我需要编写此类电子邮件并以编程方式发送。我首先做的是查看其他电子邮件客户端(如Thunderbird)如何处理此类邮件。尽管需要一些实验和耐心。
我使用的消息的整体结构主要基于这个Stack Overflow答案:https://dev59.com/hG865IYBdhLWcg3wQMWW#23853079
请注意,您有几个选项:要么组成HTML片段(典型的<body>
标记的内容),要么整个HTML文档(包括<html>
,<head>
和<body>
标记)。我看了一下Thunderbird是如何做的。结果它创建了整个文档,大致生成方式如下:
<head>
部分添加元信息<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
(将字符集替换为您喜欢的字符集)<body>
部分添加您组成的HTML片段、引用的标题(例如:“<div>几天前,John Smith写道:</div>
”)以及紧随其后的<blockquote cite="mid:originalmessagemid@example.com" type="cite">
块。请注意,原始消息中有一个消息ID。<blockquote>
块中。<html>
和<head>
标签...同时保留它们的内容。结果,您可以在新邮件的<body>
标记中看到来自原始邮件的<head>
部分的<style>
和<title>
标记。很混乱。<body>
标签并复制其内容<style>
标签doc = Nokogiri::HTML.parse(strHTML)
body = doc.css('body')[0]
body.css('style').each { |node|
node.unlink
}
puts body.inner_html
没错,在 multipart/alternative
部分中也有邮件的纯文本版本。这里最关键的步骤是将任何HTML文本转换为纯文本版本,这比编写HTML部分更加棘手。毕竟,你需要编写一个简单的渲染引擎(就像其他任何网页浏览器一样)。可能会有专门针对此类问题的工具,但不幸的是我当时找不到。
以下是几个要点,可以帮助您入手:
<style>
或<script>
标签与<b>
或<div>
标签)<br>
和块级标签如<p>
和<div>
是例子)colspan
和rowspan
,用空格填充单元格的内容以对齐等。<b>
、<i>
等标记的替代标记(如用星号或其他方式将其包围)<h1>
、<h2>
等标记<a>
标记,即将其转换为格式:Stack Overflow 网站[http://stackoverflow.com]
<img>
标记,并可能用替代文本替换它们(如果存在)>
等)。如果不是Nokogiri,则HTMLEntities gem在这种情况下可能有所帮助这个列表可以不断延伸。当然,这是没有必要的。
在互联网上有一些库和项目可以实现这个功能,但它们并非为Ruby编写,或者缺少上述功能中的一些。例如:
text/plain
部分的结构与 HTML 部分基本相同。在最开始是你的回复,然后是引用标题和引用的消息。通常格式化为每行都以“>”字符开头。现在有一个问题,你应该粘贴什么内容。
第一种选择是将原始消息的 HTML 部分(通过上述方法)转换并将其作为引用消息粘贴。第二种选择是使用原始消息的 text/plain
部分(如果存在),而不进行任何转换粘贴。后一种选项的好处是,在长时间的交谈中,“>”字符将以树状方式累积。此外,它保留了发件人可能手动组装的纯文本格式,使其更加准确。
根据您的实际需求和想要达到的质量水平,撰写此类邮件的难度可以从简单/棘手到困难不等,特别是如果您需要自己编写所有内容。如果您找到任何Ruby gem可以帮助您完成其中一些任务,请毫不犹豫地使用它们。
组成HTML部分可以像将HTML片段复制并粘贴到彼此中一样容易,最好在此之前删除一些标签。组成纯文本部分可以像完全删除几个标记(<head>
,<script>
,<style>
,...)一样容易,同时保留其内容并按顺序解码所有HTML实体。
删除HTML标记可以使用正则表达式完成,但这是强烈反对的做法,并被认为是穷人工具箱中的工具。因此,我建议使用Nokogiri或类似工具来完成此任务。
虽然这不是一个问题的一部分,但我必须强调编写电子邮件客户端的一个方面。您应该始终记得对HTML消息进行清理,特别是您收到的消息。如果入站邮件中出现可疑的iframe或脚本,并且未被垃圾邮件过滤器立即阻止/过滤,则可能是XSS攻击的一部分。在这种情况下,Sanitize宝石可能会证明有用。
干杯