如何处理Symfony Mailer组件SMTP传输中凭据中的特殊字符?

12

背景

Symfony 4.3引入了一个新的邮件组件。

可以在这里查看:

对于SMTP传输,已经确定ENV变量中的DSN格式如下:

MAILER_DSN=smtp://user:pass@smtp.example.com

问题

写DSN时如何处理用户和密码中的特殊字符?

假设凭据是:

username: alice@example.com
password: the:password:is:difficult

这样设置最有可能失败:

MAILER_DSN=smtp://alice@example.com:the:password:is:difficult@smtp.example.com

我该如何编码/转义内容?哪种DSN是正确的?


你找到解决方案了吗? - Abenil
1
至少在用户名中使用@符号不是问题,在我的情况下可以轻松使用。 - spackmat
@Abenil 实际上,这个 MAILER_DSN=smtp://some.name@gmail.com:mypassword@smtp.gmail.com 对于我的 Gmail 地址已经起作用了,但我没有在这里回复自己,因为我没有“任何字符的通用线索”。特别是我没有测试密码中的 :。只是对于“双 @”,我可以确认它起作用了。但是,嘿!我没有找到任何官方文档。我只是通过试错发现它可以工作。所以...我准备随时在没有事先通知的情况下发现它失败。 - Xavi Montero
2个回答

13

您可以对数值进行urlencode编码。

Mailer组件中有一个测试(Tests/Transport/DsnTest.php),表明它应该能够使用编码后的值工作。

enter image description here

因此,您可以使用在线编码器将您的值转换为编码形式(例如:https://www.urlencoder.org/

您的字符串:

MAILER_DSN=smtp://alice@example.com:the:password:is:difficult@smtp.example.com

成为:

MAILER_DSN=smtp://alice%40example.com:the%3Apassword%3Ais%3Adifficult@smtp.example.com

2
永远不应该将密码粘贴到在线工具中。 - twigmac

2

被接受的答案是正确的。但是无需对用户名或密码进行编码或转义。我成功地尝试了一个包含@字符的用户名,以及一个包含:=|,的密码。

因此,以下是有效的配置:

MAILER_DSN=smtp://alice@example.com:the:pa=|,ssword@smtp.example.com:587

我同意“非编码”版本是可行的。但是,以我卑微的观点来看,作为代码的人类读者,您可能会对优先级产生疑虑;但如果进行编码,则不会有任何疑问。我深信“让机器读懂代码很容易,让人类读懂代码才是难点”。我更喜欢编码,因为它消除了歧义,而无需了解“哪个符号具有优先级”的低级细节。这是“不要让我思考”原则应用于您的代码的人类读者。干净的代码规则。 - Xavi Montero
1
我在某种程度上同意你的观点。但愿我的回答能够帮助那些在痛苦的故障排除阶段中,找出 SMTP 连接为何无法工作的人。编码不是错误的原因。 - Michael Käfer
1
可能可以工作,但最终不会成功。尝试使用MAILER_DSN=smtp://alice@example.com:the:pa####=|,ssword@smtp.example.com:587,此外,用户名和密码将进行URL解码。所以如果你碰巧没有对应该被编码的内容进行编码,比如%等等,你将会遇到问题。这个回答真是糟糕透了。请参考Dsn::fromString。 - Toskan
@Toskan 你错了。我写过你可以使用 @:=|,。但是我没有写过你可以使用 #% - Michael Käfer

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