【问题标题】:HTML <base> tag in email电子邮件中的 HTML <base> 标记
【发布时间】:2013-01-14 16:40:55
【问题描述】:

我们有一个内容管理的解决方案(具体来说是 SDL Tridion;但是,这个问题更笼统),其中包括具有不同语言内容的多个网站。它们都共享许多基于 Razor 的模板,这些模板用于在发布页面时呈现带有特定注入内容的 HTML 片段。

CRM 也通过 CMS 进行管理,并且使用相同的模板来创建电子邮件通讯。这些 HTML 电子邮件包含图像,这些图像会发布到管理相关分发列表的任何站点。因为模板系统是通用的,CMS 没有最终产品的绝对 URL 的概念,所以这些图像都嵌入了相对地址。我们有能力将绝对 URL 作为元数据应用到 CMS 中的不同网站,并编写 .Net 扩展以将这些 URL 格式化为渲染图像标签;但是,这会给这项工作增加相当大的开销。

我们可以通过在电子邮件标记的&lt;head&gt; 部分中使用&lt;base href="..." /&gt; 标记来解决此问题。这似乎至少在 Outlook 中有效;但是,我无法找到有关电子邮件客户端支持和不支持此标签的最新信息。

那么问题来了:&lt;base&gt; 标签在电子邮件客户端(尤其是基于浏览器的客户端)中的支持范围有多广?

【问题讨论】:

  • 这只是一个猜测,但了解电子邮件客户端,可能根本不知道。我预测您最终将不得不以某种方式提供绝对 URL
  • 基于 Web 的电子邮件永远不会有 HEAD,因为邮件主机会将其删除。否则会干扰页面自身的 HEAD。
  • @Diodeus - 这是我关心的问题。我不确定我们是否可以不支持网络邮件而侥幸成功!然而,我能找到的大多数关于这方面的帖子都是几年前的,我想知道基于浏览器的邮件提供商是否在处理此类事情的方式上变得更加精明。
  • 大多数关于 HTML 电子邮件的网络帖子都说您应该有绝对链接,尽管有些客户端确实支持基本标签。我认为这就是您的答案,除非您要为 Outlook 等特定客户提供服务。
  • &lt;base&gt; 不必在&lt;head&gt; 中并且可以&lt;body&gt; 中。那我们有什么支持呢?

标签: html html-email base email-client


【解决方案1】:

不幸的是,它不适用于大多数基于 Web 的电子邮件客户端(Hotmail、Gmail),而这通常会增加大约 30% 的接收者。

为什么它不起作用: 大多数基于 Web 的客户端会在您的电子邮件正文标签中注入任何内容,并删除其他所有内容,包括 head。所以,如果你发送:

<html>
<head><base ...></head>
<body><p class="youremail">Email</p></body>
</html>

电子邮件客户端会这样做:

<html>
<head><Email client head></head>
<body>
  <email client wrapper>
  <email>
    <p class="youremail">Email</p>
  </email>
  <email client wrapper>...
</body>

因此您的基本标签将被剥离。即使不是,因为它不包含在电子邮件客户端的头部,它也会被浏览器忽略。

不幸的是,图像上的绝对路径是要走的路。过去我通过使用“预检处理器”解决了类似的问题。您可以使用它来获取 &lt;base&gt; href 并在返回完成的 HTML 之前将其设置在所有图像上。

【讨论】:

  • 这也是我们的结论。我们目前有一个 .net 扩展,它与 CMS 的电子邮件呈现挂钩,并将 标记中的内部 URI 转换为网络服务器上正确的相对地址。我们已经决定,最好的方法是修改它以允许从 CMS 中每个国家/地区站点的元数据中提取“基本 URL”。这并不理想,因为我们希望它更具动态性(在庞大的解决方案中进行配置是另一回事 - 天堂禁止我们必须迁移环境);然而,这似乎是唯一的选择。
  • &lt;base&gt; 不必在&lt;head&gt; 中并且可以&lt;body&gt; 中。那我们有什么支持呢?
  • @StevenVachon 根据 HTML 4 和 5 规范,base 标签只能作为 head 标签的子标签。我敢肯定,无论你把它放在哪里,大多数电子邮件客户端都会继续忽略它,但它值得测试。
  • @Blowski W3C 规范或 WHATWG 规范?
  • @StevenVachon W3C,但无论如何它都没有实际意义,因为电子邮件客户端不遵循任何类型的公共规范。您所能做的就是通过反复试验对他们的规格进行逆向工程。
【解决方案2】:

我不知道您是否使用 Razor,但如果您使用,您可以在 razor 视图中执行此操作:

src="@Request.Url.GetLeftPart(UriPartial.Authority)~/images/screenshot.png"

【讨论】:

    猜你喜欢
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 2020-09-18
    • 2011-02-13
    相关资源
    最近更新 更多