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