PythonでGmail APIを使ってメールを取得した際に、メールの本文が所々おかしな箇所で改行されているぞと思い、base64デコードした後の変数を見てみると\r\nの改行コードが追加されてました。
(Pdb) pp gmail[‘body’]
(・・・
‘今後セキュリティに求められるのは、経験則に頼らない、セキュリティ・バイ・デ\r\n’
‘ザインの考え方。\r\n’
・・・)
調べてみると、「電子メールのMIME形式としてBase64エンコードする際は、MIMEの基準で76文字ごとに改行コード(CRLF)が入ります。」とのこと。
ここの質問を見ると、解決策は改行コード’\r\n’を消すことだと書いてある。
https://stackoverflow.com/questions/45537564/decoding-mime-email-from-gmail-api-r-n-and-3d-python
あれ、そんなことしたら本来必要な改行コードも消えちゃうよね。もっとスマートな解決策ないかなと思って少し調べてみたけど見つからなかったのでとりあえず上記解決策を適用して次に進むことにしました。
やり方は、MIMEの規定上1行についき76文字で改行コードが挿入されるということなので文字数をカウントし、規定文字数への到達が原因で\r\nが入ったと想定される場合は、\r\nを除くようにする。こととしました。
コードは以下の通り。
#文字列を改行コードで分割しlist形式に変更(ここで改行コードは一旦全て消える) gmail_split = gmail['body'].splitlines() gmail_fixed = "" for i in range(len(gmail_split)): count = 0 for c in gmail_split[i]: #全角の場合2文字、半角の場合1文字としてカウント if unicodedata.east_asian_width(c) in 'FWA': count += 2 else: count += 1 #76文字から\r\nの2文字を引いて、1行が74 or 73文字だったら改行コードを追加して文字列結合。それ未満だったらそのまま追加。 if count == 74 or count == 73: gmail_fixed += gmail_split[i] else: gmail_fixed += gmail_split[i] gmail_fixed += '\r\n'
(Pdb) pp gmail[‘body’]
(・・・
‘今後セキュリティに求められるのは、経験則に頼らない、セキュリティ・バイ・デザインの考え方。\r\n’
・・・)
とりあえず上記で問題なく表示出来ました。
もっとスマートな解決策が見つかったら記事更新しようと思います。
以上。