我花了太多时间对着SMTP服务器,因为它不喜欢我使用的base64编码凭据。事实证明,当我选择不使用perl
像互联网上那么多指令一样使用时,我犯了一个大错误。为什么是这样?我认为base64是一个标准。
考虑:
$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf")'
QVNERjEyMzRhc2Rm
$ base64 <<<"ASDF1234asdf"
QVNERjEyMzRhc2RmCg==
$ python3.6 -m base64 <<<"ASDF1234asdf"
QVNERjEyMzRhc2RmCg==
$ python2.7 -m base64 <<<"ASDF1234asdf"
QVNERjEyMzRhc2RmCg==
$ perl -MMIME::Base64 -e "print encode_base64('my_user_name@my_domain.com')"
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20=
$ base64 <<<"my_user_name@my_domain.com"
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20K
因此,perl
在输出中是唯一的,我的服务器就是这样。
为什么我会得到不同的结果?
如何使用perl以外的其他方式获取MIME / SMTP友好输出?
答案 0 :(得分:11)
这不是Perl与其他人的事情;这是&#34;使用Bash的<<<
构造&#34;与#34;不这样做&#34;事情。虽然没有明确记录(至少不在Ubuntu Xenial的联机帮助页中),Bash appends a newline to herestrings (the <<<
thing) when passing them to commands。因此,您使用<<<
调用的所有命令实际上都是'ASDF1234asdf\n'
编码,而Perl(不是用herestring调用)只编码'ASDF1234asdf'
}。不同的输入,不同的输出。
为了将没有尾随换行符的字符串传递给命令的标准输入,请使用printf
命令,例如:
$ printf %s ASDF1234asdf | base64
QVNERjEyMzRhc2Rm
答案 1 :(得分:5)
没有不同的base64编码,但最后是否编码换行符:
$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf")'
QVNERjEyMzRhc2Rm
$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf\n")'
QVNERjEyMzRhc2RmCg==
$ echo -ne "my_user_name@my_domain.com" | base64
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20=
$ echo -ne "my_user_name@my_domain.com\n" | base64
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20K