我发现下面的答案将帮助你在使用WebCatalog、Epichrome或类似工具时使其正常工作,但如果你将Google Chrome设置为操作系统的默认电子邮件客户端,并将Gmail设置为Chrome的默认电子邮件服务,则所有这些都是不必要且有害的。
可能这里报告的行为只是WebCatalog的一个错误,没有其他问题;如果我发现更多信息,我会再次更新。
Gmail在第一个未编码的&符号之后省略了所有查询字符串参数。因此,如果您首先放置?subject,您只会得到主题;如果您首先放置?body,您只会得到正文。我已经对此进行了更改:
<a href="mailto:?body=https%3A%2F%2Fexample.com&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&body=https%3A%2F%2Fexample.com&subject=Testing">
更明确地说,在JavaScript中,如果
bodyText
是您的URL编码正文内容,而
subjectText
是您的URL编码主题行,则您需要与Gmail和其他邮件客户端完全兼容的格式如下:
const emailUrl = `mailto:?body=${bodyText}%26subject=${subjectText}&body=${bodyText}&subject=${subjectText}`;
这里还有一个Twig版本。这个Twig文件获取未编码的url和title变量,分别用于正文和主题。
{%- macro email_share(body, subject) -%}
{%- set body -%}body={{ body|replace({'&': '&', '"': '"'})|escape('url') }}{%- endset -%}
{%- set subject -%}subject={{ subject|replace({'&': '&', '"': '"'})|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>