base64和MIME base 64有什么区别?

Bru*_*sky 7 python linux shell perl mime

我只是花了太多时间对着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
Run Code Online (Sandbox Code Playgroud)

因此,perl它的输出是独一无二的,我的服务器需要它.

为什么我会得到不同的结果?

如何使用perl之外的其他东西获得MIME/SMTP友好输出?

jwo*_*der 12

这不是Perl与其他人的事情; 这是"使用Bash的<<<构造"与"不做那样"的事情.虽然没有明确记录(至少在Ubuntu Xenial的联机帮助页中没有),但是<<<当将它们传递给命令时,Bash会向herestrings(the thing)添加换行符.因此,您调用的所有命令<<<实际上都是编码'ASDF1234asdf\n',而Perl(不使用herestring调用)只是编码'ASDF1234asdf'.不同的输入,不同的输出.

为了将没有尾部换行符的字符串传递给命令的标准输入,请使用printf命令,例如:

$ printf %s ASDF1234asdf | base64
QVNERjEyMzRhc2Rm
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 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
Run Code Online (Sandbox Code Playgroud)