2017-07-19 109 views
6

我只是花了太多时间将我的头撞向SMTP服务器,因为它不喜欢我使用的base64编码凭据。原来,当我选择不使用perl就像互联网上的许多指令说的那样,我犯了一个很大的错误。为什么是这样?我认为base64是一个单一的标准。base64和MIME base 64有什么区别?

考虑:

$ 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('[email protected]_domain.com')" 
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20= 

$ base64 <<<"[email protected]_domain.com" 
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20K 

所以,perl在其输出的独特和我的服务器需要这种方式。

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

你如何获得MIME/SMTP友好的输出与Perl以外的东西?

+0

相当于将'perl的-MMIME :: Base64编码-0777pe'print encode_base64($ _)'' – ikegami

回答

10

这不是Perl与其他人的事情;这是一个“使用Bash的<<<构造”与“不这样做”的东西。虽然没有明确记录(至少不在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 
5

没有不同的base64编码,但在结束编码换行符,或不:

$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf")' 
QVNERjEyMzRhc2Rm 
$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf\n")' 
QVNERjEyMzRhc2RmCg== 
$ echo -ne "[email protected]_domain.com" | base64 
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20= 
$ echo -ne "[email protected]_domain.com\n" | base64 
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20K 
+0

这是一个非常简洁的演示。我在echo命令中添加了换行符抑制和转义字符解释,以产生与OP相同的结果。 (和upvoted) –