什么是最好的分隔符来分隔多个电子邮件?

42
我正在使用mailto链接来填充用户默认邮件程序中的bcc
$mem_email=" ";    
$sql="SELECT email_address FROM employee";
$contacts = $db->query($sql);
while($contact = $db->fetchByAssoc($contacts))
{
    if($contact['email_address']!="" && $contact['email_address']!=NULL)
    {
        $mem_email.=$contact['email_address'].", ";
    }
}

header("Location: mailto:?bcc={$mem_email}"); 

在 bcc 字段中分隔多个电子邮件地址,最佳的分隔符是 , 还是 ;

在我的情况下,我使用的是 ,


如果您正在使用普通的 mailto 锚点,那么是的,这是最好的方法。 - Mihai Iorga
4个回答

52

分隔符应为逗号 (,),且不应有空格。

请参阅 RFC 6068


1
谢谢,RFC 6068链接真的很棒,可以学习“mailto” URI方案。 - Mansoor Jafar
2
@UriNetanel https://datatracker.ietf.org/doc/html/rfc6068 - Alnitak

16

如果您需要,请注意以下内容:

尽管RFC明确推荐使用逗号,但Microsoft Outlook将使用在区域设置中定义的“列表分隔符”。对于系统配置了不同列表分隔符(如分号)的Windows+Outlook用户,您的mailto链接可能无法正确工作。在这种情况下,Outlook将拒绝使用逗号分割电子邮件地址。

请记住这一点。


好吧,我似乎有一个反例。我有Windows 10和Outlook 365,我的区域设置明确指定逗号作为列表分隔符。事实上,它不允许我将其更改为其他任何内容,至少不是在我的美式英语设置下。但是Outlook绝对需要使用分号分隔收件人。实际上,当我输入收件人时,它会自动在每个收件人后插入分号和空格(即使是行中的最后一个)。我可以编辑掉空格,它仍然有效,但是如果我转到发件箱并查看邮件,则Outlook会重新插入空格。 - phantomflash
好的,修改上面的评论。经过进一步调查,我发现 Outlook 中有一个选项。(在我的版本中,)您可以单击“文件” - “选项” - “邮件”,向下滚动到“发送邮件”部分,并选择“逗号可用于分隔多个收件人”。如果选中此选项,Outlook 实际上会接受逗号,并在约 3 秒钟后(当它将给定的电子邮件地址与其自己的地址簿进行验证时)将其更改为分号。所以现在人们可以争论谁应该更努力地适应:创建邮件程序的开发人员还是 Outlook 用户。 - phantomflash
@phantomflash,很高兴知道这些行为在不到十年的时间里有所改善。 - Ishmaeel
自从我发表评论以来,我读到了一篇文章,说这个功能是在Outlook 2010中引入的。 - phantomflash

3

简短回答

TLDR答案:使用没有空格的,分隔电子邮件地址。

RFC6068:“mailto” URI方案(2010年10月发布)仅是一个建议标准它不是一个被接受的互联网标准。 它也没有讨论逗号分隔。

TLDR注意事项/陷阱

  • 请注意(根据RFC6854),您不应该在电子邮件的Sender字段中用逗号分隔地址(出于安全原因)。
  • 许多服务允许使用空格和,,因此理想的正则表达式拆分为/\s*,\s*/
  • Outlook和Exchange(以及其他符合X.400 / X.500标准的软件)支持使用;。这是因为X.400 / X.500规范将分号视为有效的名称分隔符(请参见RFC1485,发布于1993年7月)。从现在开始,建议使用,

来源

引用最初的标准RFC2822:Internet Message Format,发布于2001年4月...

3.6.3. Destination address fields

The destination fields of a message consist of three possible fields, each of the same form: The field name, which is either "To", "Cc", or "Bcc", followed by a comma-separated list of one or more addresses (either mailbox or group syntax).

to              =   "To:" address-list CRLF

cc              =   "Cc:" address-list CRLF

bcc             =   "Bcc:" [address-list / CFWS] CRLF

这个提议的标准于2008年10月被接受为草案标准,其中包括RFC5322:Internet消息格式。我想引用那里的文本,但他们决定保持原样。在2013年3月提出了一项更新,其中包括RFC6854:更新Internet消息格式以允许组语法...:不应该在Sender字段中允许逗号分隔值,因为这样就不确定谁真正触发了发送电子邮件。引用此RFC,RFC6854...

2.1. RFC 5322第3.6.2节起源者字段的替换

...from字段和sender字段不应使用组语法;相反,from字段应仅使用邮箱列表语法,而sender字段应仅使用邮箱语法(请参见RFC 6854第3节)。如果sender字段使用组语法,则该组不得包含多个邮箱。


1
请使用以下代码:
implode(',', $contacts);

以上代码将给出逗号分隔的电子邮件地址。


我已经使用了 $mem_email.=$contact['email_address'].", ";,它运行良好。 - Mansoor Jafar
我使用了$mem_email.=$contact['email_address'].",";,它运行得很好。那么implode(',', $contacts);有什么额外的好处吗? - Mansoor Jafar
Mansoor,使用您的版本,您连接的电子邮件地址字符串将具有尾随逗号,但使用implode仅会在地址之间放置逗号,而不是在末尾。除此之外,这纯粹是美学 - 更简单的代码看起来更漂亮,更易于跟踪,但最终取决于您 - 在此情况下,微小的优化差异不会产生任何影响。 - Ben Green
继续我上一条评论,implode不会检查数组中的空或null值,因此如果您要用这种方法执行操作,则需要先使用array_filter()函数。 - Ben Green

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