Gmail剥离mailto链接的正文内容

4

我一直在支持的网站上看到这个问题,并确认在其他地方也是如此。

当使用mailto链接分享URL时,我发现某些客户端可以正常显示mailto链接中的body字段,在Gmail中则会将其剥离。

我在这里看到了一些相关问题,但没有建议解决方法或解决办法。

我还看到有人提到body字段是非标准的,但似乎规范要求必须遵守它。

https://www.rfc-editor.org/rfc/rfc6068#page-7

'mailto' URI的创建者不能指望URI解析器理解超过“主题”标题字段和“正文”。将'mailto' URI解析为邮件消息的客户端必须能够正确创建[RFC5322]兼容的邮件消息,其中包括“主题”标题字段和“正文”。

那么Gmail是否不符合规范?


为了演示我所看到的行为,请将以下内容粘贴到浏览器url栏中,并将Gmail设置为默认电子邮件客户端:mailto:?subject=qux&body=xyzzy

如果你的经验与我的一致,你在Gmail邮件中将没有正文,只有主题。检查时,你可能会发现Gmail网页应用程序的url栏读取类似于以下内容:https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=1&source=mailto&su=qux,其中su表示原始mailto url的subject字段,确实没有body字段。

现在,更改默认电子邮件客户端(我尝试使用Mail macOS应用程序),你将看到主题和正文都被填充了。

有人是否成功在Gmail中实现指定的行为?


我发现的是,你只能有主题或正文中的一个;如果你在查询字符串中首先放置正文,你将得到正文但没有主题。 - 75th Trombone
1个回答

2
我发现下面的答案将帮助你在使用WebCatalog、Epichrome或类似工具时使其正常工作,但如果你将Google Chrome设置为操作系统的默认电子邮件客户端,并将Gmail设置为Chrome的默认电子邮件服务,则所有这些都是不必要且有害的。
可能这里报告的行为只是WebCatalog的一个错误,没有其他问题;如果我发现更多信息,我会再次更新。
Gmail在第一个未编码的&符号之后省略了所有查询字符串参数。因此,如果您首先放置?subject,您只会得到主题;如果您首先放置?body,您只会得到正文。我已经对此进行了更改:
<a href="mailto:?body=https%3A%2F%2Fexample.com&amp;subject=Testing">

将此转换为中文,其中的“&”符号编码为“%26”:
<a href="mailto:?body=https%3A%2F%2Fexample.com%26subject=Testing">

...并且在Gmail中运行,但是Mail.app会将整个查询字符串作为电子邮件正文。但正如我所说,Gmail省略了第一个未编码的“&”之后的所有内容。因此,我重复了带有未编码“&”的正文和主题,并且这在任何地方都有效:

<a href="mailto:?body=https%3A%2F%2Fexample.com%26subject=Testing&amp;body=https%3A%2F%2Fexample.com&amp;subject=Testing">

更明确地说,在JavaScript中,如果bodyText是您的URL编码正文内容,而subjectText是您的URL编码主题行,则您需要与Gmail和其他邮件客户端完全兼容的格式如下:
const emailUrl = `mailto:?body=${bodyText}%26subject=${subjectText}&amp;body=${bodyText}&amp;subject=${subjectText}`;

这里还有一个Twig版本。这个Twig文件获取未编码的url和title变量,分别用于正文和主题。
{%- macro email_share(body, subject) -%}
  {%- set body -%}body={{ body|replace({'&amp;': '&', '&quot;': '"'})|escape('url') }}{%- endset -%}
  {%- set subject -%}subject={{ subject|replace({'&amp;': '&', '&quot;': '"'})|escape('url') }}{%- endset -%}
  {%- set query_string -%}?{{ body|replace({'%26': '%2526'}) }}%26{{ subject|replace({'%26': '%2526'}) }}&{{ body }}&{{ subject }}{%- endset -%}
  {{- query_string -}}
{%- endmacro -%}

{% import _self as self %}

<a class="share__button" href="mailto:{{ self.email_share(url, title) }}">Share via email</a>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接