2017-07-19 111 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) –