我在ruby中创建自己的电子邮件客户端,它当前可以解析/读入消息。它还可以创建对邮件的回复,设置标头,并将邮件发送给原始发件人。
如何将原始引用的邮件添加到回复中?
如何在回复中格式化原始邮件?有最佳做法或格式吗? MIME / RFC?我知道HTML和文本应该有一个字符串。只是不确定如何制作这些琴弦。
现在我的回复在下面没有原始消息,并且使其自身理解变得复杂。
答案 0 :(得分:2)
撰写电子邮件回复是一项相当大的挑战,尤其是在一开始您无法从哪里开始。
最近,我不得不撰写此类电子邮件并以编程方式发送。我首先要做的是看看电子邮件客户端如何做到这一点,比如Thunderbird。这需要一些实验和耐心。
我使用的消息的整体结构很大程度上基于Stack Overflow答案:https://stackoverflow.com/a/23853079/1368043
请注意,您可以选择以下几种方法:编写HTML片段(典型<body>
标记的内容)或整个HTML文档(使用<html>
,<head>
和{{ 1}}标签)。我看了一下Thunderbird是如何做到的。原来它创建了整个文档,大致如下所示:
<body>
部分添加元信息<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
(将字符集替换为您喜欢的字符集)<head>
部分添加您撰写的HTML片段,添加引号的标题(例如:&#34; <body>
&#34;)并添加<div>Few days ago, John Smith wrote: </div>
块就在它之后:<blockquote>
。请注意,原始邮件的邮件ID。这是我对Thunderbird不太喜欢的部分:
<blockquote cite="mid:originalmessagemid@example.com" type="cite">
块中。 Thunderbird并没有真正检查复制的HTML是片段还是文档。但是,如果它是文档,则会在保留其内容时删除<blockquote>
和<html>
标记。结果,您可以看到位于新邮件的<head>
标记中的原始邮件的<style>
部分中的<title>
和<head>
个标记。那太乱了。
此外,Thunderbird并不能应对全球风格。您可以使用全局样式而不是内联样式轻松编写棘手的邮件,当邮件的收件人开始撰写回复时,样式会在整个邮件中流淌。
你可以做同样的事情。它并没有真正伤害任何人,他们更像是通常没有观察到典型邮件的怪癖。再加上它很容易。或者你可以更进一步清理这个烂摊子。
首先,你必须得到任何HTML解析器。我使用 Nokogiri ,我使用它的方式是这样的:
<body>
标记并复制其内容<body>
代码大概如下:
<style>
Nokogiri还有另外一个好处 - 如果您在HTML消息中有任何内嵌图像,您可以轻松找到它们,用&#34; cid代替URL:...&#34;方案并将图像添加为内联附件。
是的,还有doc = Nokogiri::HTML.parse(strHTML)
body = doc.css('body')[0]
body.css('style').each { |node|
node.unlink
}
puts body.inner_html
部分中邮件的纯文本版本。这里最关键的过程是将任何HTML文本转换为纯文本版本的能力。这比编写HTML部分更复杂。毕竟,您必须编写一个简单的渲染引擎(就像任何其他Web浏览器一样)。可能只有宝石,不幸的是我当时找不到任何东西。
很少有一些要点让你开始:
multipart/alternative
或<style>
标记与<script>
或<b>
)<div>
,并且<br>
和<p>
等代码块标记为示例)<div>
和colspan
s,使用空格填充单元格的内容以对齐它们等。rowspan
,<b>
,...标签找到替代标记(例如用星号或其他东西包围它们)<i>
,<h1>
,...代码,方法是在下方和/或上方添加破折号或星号<h2>
代码,即将其转换为以下格式:<a>
Stack Overflow site [http://stackoverflow.com]
代码,并将其替换为替代文字(如果有)<img>
等)。如果不是Nokogiri,那么 HTMLEntities gem可能会有所帮助列表可以继续。当然,这是不必要的
互联网上有一些图书馆和项目可以做到这一点,但它们不是为Ruby编写的,并且/或者他们错过了上面列出的一些功能。例如:
一旦你完成了这个,>
部分的结构几乎与HTML部分相同。在一开始就有你的回复。然后,引用标题,然后引用的消息。它通常是格式化的,以便每行前面都有&#39;&gt;&#39;字符。现在,有一个问题是你应该在那里粘贴什么。
第一个选项是转换原始邮件的HTML部分(通过上述方法)并将其粘贴为引用邮件。其次是使用原始邮件的text/plain
部分(如果存在)并粘贴它而不进行任何转换。后一种选择的好处是,&#39;&gt;&#39;长时间对话中的字符将以树的方式累积。此外,它还保留了发件人可能手动组装的纯文本格式,以使其更准确。
根据您的实际需求和您希望达到的质量水平,撰写此类邮件的难度可以从简单/棘手到难以处理,特别是如果您必须自己编写所有代码。如果您碰巧找到任何可以帮助您完成某些任务的Ruby宝石,请不要犹豫并使用它们。
编写HTML部分可以像复制和粘贴HTML部分一样简单,最好先预先剥离一些标记。编写纯文本部分可以像完全删除少量标记一样简单(text/plain
,<head>
,<script>
,...),剥离所有标记,同时保留其内容并解码所有HTML实体,按此顺序。
删除HTML标记可以使用正则表达式完成,但它是strongly discouraged,并且被认为是穷人工具箱中的工具。所以我建议为此目的使用Nokogiri或类似的东西。
虽然这不是问题的一部分,但我必须强调编写电子邮件客户端的一个方面。您应始终记住清理您的HTML邮件,尤其是您收到的邮件。在收到的邮件中可疑地查找iframe或脚本没有什么好处,当没有立即被垃圾邮件过滤器阻止/过滤时,可能是XSS攻击的一部分。在这种情况下, Sanitize gem可能会很有用。
干杯