我想在博客帖子下面创建一个“转发给朋友”链接,该帖子打开我的电子邮件客户端并准备好了消息。我可以让它用于单行消息,但我希望能够在消息体内打破行。我怎么能这样做?
<?php
printf(
'<a href="mailto:?subject=%s&body=%s">Forward this to a friend</a>',
the_title_attribute('echo=0'),
sprintf('The link: %s Have a great day! Stefaan', get_the_permalink())
);
?>
如何在上面有空行的新行上开始“祝你有美好的一天!”
链接:...
祝你有美好的一天!
斯特凡
我的博客使用带有Genesis主题的WordPress,我将我的代码放入启用了PHP的genesis_footer_entry
钩子中(参见screenshot - 电子邮件文本是荷兰语)。
答案 0 :(得分:3)
<强>解释强>
a mailto:
是电子邮件地址的URI方案,与所有其他URI一样,字符需要转换为可以通过Internet传输的格式。
使用原始代码的简化形式来说明以下几点
printf(<href="mailto:?subject=%s&body=%s">Description</a>, the_title_attribute( 'echo=0' ) , sprintf("content link:%s more content", get_the_permalink())
代码按以下顺序运行
get_the_permalink()
获取您网页的网址sprintf()
使用第1步的结果替换%s
中的$content
print_f()
然后替换为
i)第一个%s
即subject=%s
,其结果为the_title_attribute( 'echo=0' )
,我假设
是页面或您的网站的标题然后
ii)第二个%s
,即body=%s
,其结果为步骤2,以形成完整的a mailto
链接为了保留换行符,您应该在输出之前将$content
字符串转换为URL编码形式。
在使用rawurlencode()
函数完成的PHP中,它将字符串中的换行符\r\n
转换为%0D%0A
,根据 RFC 3986 。
由于百分号[{1}}用于%
中的转化规范,因此您应该在字符串格式为sprint_f()
后将字符串传递给rawurlencode()
,因此使用sprint_f()
<强>解决方案强>
我已经完整地整理了解决方案,您可以复制并粘贴到您的小部件中,以避免因错误实施而导致的误报。
格式1和格式2包含基本相同的代码,这两种格式可以说明如何插入换行符,可以通过1 rawurlencode(sprint_f($string, $arg))
或2)pressing enter
来表示行需要休息。
我为typing in \r\n
添加了一个单独的字符串,以便于编辑和编写代码。
格式1
$content
格式2
<?php
//Start new line by pressing enter
//IMPORTANT NOTE: do not remove the %s
$content="Hi there, this might be interesting for you
This is the link: %s
Have a great day!
Stefaan
";
//No need to amend the code below
printf(
'<a class="simple-mail-link" href="mailto:?subject=%s&body=%s">
<div class="label">
<div class="dashicons dashicons-admin-plugins"></div>
Forward this to a friend</div></a>',the_title_attribute( 'echo=0' ),
rawurlencode(sprintf( $content,get_the_permalink()))
);
?>
<强>演示强>
<?php
//Start new line by adding \r\n
//IMPORTANT NOTE: do not remove the %s
$content="Hi there, this might be interesting for you\r\nThis is the link: %s\r\nHave a great day!\r\nStefaan";
//No need to amend the code below
printf(
'<a class="simple-mail-link" href="mailto:?subject=%s&body=%s">
<div class="label">
<div class="dashicons dashicons-admin-plugins"></div>
Forward this to a friend</div></a>',the_title_attribute( 'echo=0' ),
rawurlencode(sprintf( $content,get_the_permalink()))
);
?>
&#13;
答案 1 :(得分:3)
您无法在 正文 的 正文 中使用HTML标记
根据RFC 2368,这是不可能的:
特殊的hname“body”表示关联的hvalue是 信息的主体。 “body”hname应包含for的内容 消息的第一个text / plain正文部分。 mailto URL是 主要用于生成短文本消息 实际上是自动处理的内容(例如“订阅”) 邮件列表的消息),而不是一般的MIME主体。
所以任何解决方案都依赖于HTML标签是不可能的。 我建议的解决方案是使用 \ r \ n 以及PHP函数 rawurlencode
所以这是代码
<?php
printf(
'<a class="simple-mail-link" href="mailto:x@y.com?subject=%s&body=%s"><div class="label"><div class="dashicons dashicons-admin-plugins"></div>Forward this to a friend</div></a>',
'My Subject',
rawurlencode(sprintf( "Hi there, this might be interesting for you.\r\nThis is the link: %s.\r\nHave a great day!\r\nStefaan", get_the_permalink()))
);
?>
注意:我尝试使用带有http://example.com/test.php
的变量替换 get_the_permalink()代码的引用:
What is the equivalent of JavaScript's encodeURIcomponent in PHP?
答案 2 :(得分:2)
根据电子邮件规范,每个电子邮件行都需要以旧<CR><LF>
对结尾 - 因此您需要在\r\n
字符串中使用sprintf()
。
"This is the link: %s.\r\n Have a great day!\r\n Stefaan"
如果\r\n
无效,您就会受到源语言限制。鉴于:
\r
是ASCII 13
(十六进制0D
)\n
是ASCII 10
(十六进制0A
)也许您可以使用" "
?
答案 3 :(得分:0)
将urlencoded字符串用于CR / LF
%0D%0A
你想休息的地方。
在示例中
<a
class="simple-mail-link"
href="mailto:?subject=hello&body=Hello%0D%0A%0D%0AWorld!"
>
答案 4 :(得分:0)
在%s
电话中添加另一个sprintf()
参数,并将换行符%0A
的网址编码版本(两次)传递给它:
printf(
'<a class="simple-mail-link" href="mailto:?subject=%s&body=%s"><div class="label"><div class="dashicons dashicons-admin-plugins"></div>Forward this to a friend</div></a>',
'subject',
sprintf( 'Hi there, this might be interesting for you. This is the link: %s. %sHave a great day! Stefaan', "link-here", "%0A%0A" )
);
编辑:
此外,您还可以将%0A
添加到字符串本身,但您必须记住通过在其前添加额外的字符来转义%
字符:
printf(
'<a class="simple-mail-link" href="mailto:?subject=%s&body=%s"><div class="label"><div class="dashicons dashicons-admin-plugins"></div>Forward this to a friend</div></a>',
'subject',
sprintf( 'Hi there, this might be interesting for you. This is the link: %s. %%0A%%0AHave a great day! Stefaan', "link-here" )
);
答案 5 :(得分:0)
我决定彻底解决这个问题并解决在这里所做的所有尝试。如果您需要quick answer,请查看当前接受的。
要使用 mailto:
网址 body
参数中的文字,percent-encode。在PHP中,使用rawurlencode()
。主题也应该被编码。
$subj = "Whatever subject";
$body = "Multi-\r\nline\r\nbody";
printf(
"mailto:?subject=%s&body=%s",
rawurlencode($subj),
rawurlencode($body)
);
mailto:?subject=Whatever%2Osubject&body=Multi-%0D%0Aline%0D%0Abody
要将其用作 HTML链接的目标,请将HTML中具有特殊含义的字符替换为实体引用 - 在PHP中使用htmlspecialchars()
,并且Wordpress有一位发烧友(和filtrable)esc_html()
。
$subj = "Whatever subject";
$body = "Multi-\r\nline\r\nbody";
printf(
'<a href="%s">mailto: URL with multi-line body</a>',
htmlspecialchars(sprintf(
"mailto:?subject=%s&body=%s",
rawurlencode($subj),
rawurlencode($body)
), ENT_QUOTES)
);
<a href="mailto:?subject=Whatever%2Osubject&Multi-%0D%0Aline%0D%0Abody">mailto: URL with multi-line body</a>
我相信到现在为止,您知道如何修改PHP代码以生成这样的链接。
您必须处理几个级别的技术,每个技术都有自己的转义方案:
PHP(例如"\n"
是一个带换行符的字符串,不带反斜杠和字母n;如果你需要,你需要转义反斜杠 - "\\n"
)
(s)printf(例如,要打印文字%
,您必须写%%
)
HTML(例如&
启动实体引用;从字面上看,它应该被编码为实体引用&
)
网址(例如,空格不是网址的有效部分,而%20
必须为percent-encoded)
如果不检查中间步骤,手动操作太多了,并确保它是正确的。如果你得到任何错误的中间步骤,它就会被打破。
安全的方法是手动构建最后一步的产品,只有一旦工作,继续并尝试以编程方式生成它。在这种情况下,这样的产品是一旦粘贴到浏览器的位置栏中的URL就打开了预先填充多行体的邮件编辑器。您可以从一个简单的工作示例开始,使其变得越来越复杂,直到它满足您的需求。当手动构建过于繁琐时,您可能选择了太复杂的产品 - 选择最简单的产品仍然可以按照您想要的方式工作,以后可以增加复杂性。
如果你手动构建网址时遇到困难,那你就不走运了。要么你必须阅读更多关于这个主题,寻求帮助,或放弃。如果不仅仅是您,则问题出在您的浏览器和电子邮件客户端之间。其中至少有一个有bug。根据我使用mailto:URL的经验,这并不罕见。即使你让它为你工作,你的博客的访问者可能不会那么幸运他们的设置。
我花了很多时间来研究一下HTML规范中关于我在其他答案和问题本身所呈现的尝试中看到的问题。具体做法是:
<
)中未加密码>
和<br>
HTML实现现在相当强大,甚至HTML规范也变得非常宽松,将&符号(&
)编码为实体引用(&
;在HTML5中称为character references),因此你通常不会这样做。 (但是,HTML 4规范要求编码。)
在HTML文件的实际字节级别,引用attribute values in HTML5可以自由包含几乎*任何字符,但用于引用它们的引号除外(必须用字符引用替换)。 / p>
*有关详细信息,请参阅HTML5规范中的Preprocessing the input stream和ambiguous ampersand。
这就是为什么即使换行和未编码的<br>
在引用的属性值中也可以。但实际上,href
中的不确定(与例如title
不同),因为...
在语义级别,当解析所有内容时,任何字符串(包括空字符串)都被允许作为属性值,但specific attributes add further constraints。
这就是HTML咬你的地方 - href
指定包含valid URL potentially surrounded by spaces,但不能包含
<
,>
以及其他许多角色。这些字符必须为percent-encoded。对于实际的definition of URL and its syntax,HTML规范遵循其他规范。
Handling invalid URLs is implementation-defined,这些机制可能在浏览器中不一致。只要尊重规格。我的Firefox忽略了换行符并保留了空格 - URL中也不允许使用空格,但Firefox在对URL执行任何其他操作之前对其进行编码。
答案 6 :(得分:-1)
您可以在sprintf中添加<br>
代码(假设您要为HTML显示分隔线):
sprintf( 'Hi there, this might be interesting for you. This is the link: %s.<br> Have a great day!<br> Stefaan',get_the_permalink() )
修改强>
如果您希望纯文本邮件使用\r\n
和双引号:
sprintf("Hi there, this might be interesting for you. This is the link: %s.\r\n Have a great day!\r\n Stefaan",get_the_permalink() )
答案 7 :(得分:-1)
你可能会在那里扔掉一个PHP_EOL
<?php
printf(
'<a class="simple-mail-link" href="mailto:?subject=%s&body=%s"><div class="label"><div class="dashicons dashicons-admin-plugins"></div>Forward this to a friend</div></a>',
the_title_attribute( 'echo=0' ),
sprintf( 'Hi there, this might be interesting for you. This is the link: %s. %sHave a great day! %sStefaan',get_the_permalink(), PHP_EOL, PHP_EOL )
);