在Ruby中格式化电子邮件回复

时间:2016-09-17 22:02:27

标签: ruby-on-rails ruby email actionmailer mime

我在ruby中创建自己的电子邮件客户端,它当前可以解析/读入消息。它还可以创建对邮件的回复,设置标头,并将邮件发送给原始发件人。

如何将原始引用的邮件添加到回复中?

如何在回复中格式化原始邮件?有最佳做法或格式吗? MIME / RFC?我知道HTML和文本应该有一个字符串。只是不确定如何制作这些琴弦。

现在我的回复在下面没有原始消息,并且使其自身理解变得复杂。

1 个答案:

答案 0 :(得分:2)

撰写电子邮件回复是一项相当大的挑战,尤其是在一开始您无法从哪里开始。

最近,我不得不撰写此类电子邮件并以编程方式发送。我首先要做的是看看电子邮件客户端如何做到这一点,比如Thunderbird。这需要一些实验和耐心。

我使用的消息的整体结构很大程度上基于Stack Overflow答案:https://stackoverflow.com/a/23853079/1368043

1。 HTML部分

请注意,您可以选择以下几种方法:编写HTML片段(典型<body>标记的内容)或整个HTML文档(使用<html><head>和{{ 1}}标签)。我看了一下Thunderbird是如何做到的。原来它创建了整个文档,大致如下所示:

  1. 创建HTML文档
  2. <body>部分添加元信息<meta content="text/html; charset=utf-8" http-equiv="Content-Type">(将字符集替换为您喜欢的字符集)
  3. <head>部分添加您撰写的HTML片段,添加引号的标题(例如:&#34; <body>&#34;)并添加<div>Few days ago, John Smith wrote: </div>块就在它之后:<blockquote>。请注意,原始邮件的邮件ID。
  4. 这是我对Thunderbird不太喜欢的部分:

    1. 复制原始邮件的HTML内容并将其粘贴到<blockquote cite="mid:originalmessagemid@example.com" type="cite">块中。
    2. Thunderbird并没有真正检查复制的HTML是片段还是文档。但是,如果它是文档,则会在保留其内容时删除<blockquote><html>标记。结果,您可以看到位于新邮件的<head>标记中的原始邮件的<style>部分中的<title><head>个标记。那太乱了。

      此外,Thunderbird并不能应对全球风格。您可以使用全局样式而不是内联样式轻松编写棘手的邮件,当邮件的收件人开始撰写回复时,样式会在整个邮件中流淌。

      你可以做同样的事情。它并没有真正伤害任何人,他们更像是通常没有观察到典型邮件的怪癖。再加上它很容易。或者你可以更进一步清理这个烂摊子。

      首先,你必须得到任何HTML解析器。我使用 Nokogiri ,我使用它的方式是这样的:

      1. 它会自动将任何片段转换为HTML文档,因此无需单独分析片段和文档
      2. 在文档中找到<body>标记并复制其内容
      3. 删除您找到的所有<body>代码
      4. 将结果复制到需要的地方
      5. 大概如下:

        <style>

        Nokogiri还有另外一个好处 - 如果您在HTML消息中有任何内嵌图像,您可以轻松找到它们,用&#34; cid代替URL:...&#34;方案并将图像添加为内联附件。

        2。纯文本部分

        是的,还有doc = Nokogiri::HTML.parse(strHTML) body = doc.css('body')[0] body.css('style').each { |node| node.unlink } puts body.inner_html 部分中邮件的纯文本版本。这里最关键的过程是将任何HTML文本转换为纯文本版本的能力。这比编写HTML部分更复杂。毕竟,您必须编写一个简单的渲染引擎(就像任何其他Web浏览器一样)。可能只有宝石,不幸的是我当时找不到任何东西。

        很少有一些要点让你开始:

        • 所有换行符(\ r \ n或\ n)应替换为单个空格
        • 所有多个空格应仅减少为一个(除非它们不会破坏)
        • 某些标签会保留内容,而其他标签则不会(例如multipart/alternative<style>标记与<script><b>
        • 某些代码需要在它们之后换行(<div>,并且<br><p>等代码块标记为示例)
        • 您必须正确格式化表格。您必须计算列的宽度,考虑<div>colspan s,使用空格填充单元格的内容以对齐它们等。
        • 您必须为rowspan<b>,...标签找到替代标记(例如用星号或其他东西包围它们)
        • 您还可以格式化标题:<i><h1>,...代码,方法是在下方和/或上方添加破折号或星号
        • 您必须正确格式化<h2>代码,即将其转换为以下格式:<a>
        • 您必须放弃Stack Overflow site [http://stackoverflow.com]代码,并将其替换为替代文字(如果有)
        • 您还必须解码HTML实体(<img>等)。如果不是Nokogiri,那么 HTMLEntities gem可能会有所帮助

        列表可以继续。当然,这是不必要的

        互联网上有一些图书馆和项目可以做到这一点,但它们不是为Ruby编写的,并且/或者他们错过了上面列出的一些功能。例如:

        一旦你完成了这个,&gt;部分的结构几乎与HTML部分相同。在一开始就有你的回复。然后,引用标题,然后引用的消息。它通常是格式化的,以便每行前面都有&#39;&gt;&#39;字符。现在,有一个问题是你应该在那里粘贴什么。

        第一个选项是转换原始邮件的HTML部分(通过上述方法)并将其粘贴为引用邮件。其次是使用原始邮件的text/plain部分(如果存在)并粘贴它而不进行任何转换。后一种选择的好处是,&#39;&gt;&#39;长时间对话中的字符将以树的方式累积。此外,它还保留了发件人可能手动组装的纯文本格式,以使其更准确。

        3。总结

        根据您的实际需求和您希望达到的质量水平,撰写此类邮件的难度可以从简单/棘手到难以处理,特别是如果您必须自己编写所有代码。如果您碰巧找到任何可以帮助您完成某些任务的Ruby宝石,请不要犹豫并使用它们。

        编写HTML部分可以像复制和粘贴HTML部分一样简单,最好先预先剥离一些标记。编写纯文本部分可以像完全删除少量标记一样简单(text/plain<head><script>,...),剥离所有标记,同时保留其内容并解码所有HTML实体,按此顺序。

        删除HTML标记可以使用正则表达式完成,但它是strongly discouraged,并且被认为是穷人工具箱中的工具。所以我建议为此目的使用Nokogiri或类似的东西。

        虽然这不是问题的一部分,但我必须强调编写电子邮件客户端的一个方面。您应始终记住清理您的HTML邮件,尤其是您收到的邮件。在收到的邮件中可疑地查找iframe或脚本没有什么好处,当没有立即被垃圾邮件过滤器阻止/过滤时,可能是XSS攻击的一部分。在这种情况下, Sanitize gem可能会很有用。

        干杯