下記のエントリで書いたのですが、
https://www.statsbeginner.net/entry/2018/09/29/230716
smtplibのHeader()関数で生成したインスタンスの最後に.encode()というメソッドを引数なしで付け加えており、それで正常に動いているのですが、この引数なしのメソッドはどういう役割を果たしているのでしょうか?
同じような記法を、文字列のインスタンスに対しても行っている例を見たことがあります。これを付けないと何が不都合なのでしょうか?
smtplibのHeader()関数で生成したインスタンスの最後に.encode()というメソッドを引数なしで付け加えており、それで正常に動いているのですが、この引数なしのメソッドはどういう役割を果たしているのでしょうか?
これは email.header.Header クラスの encode() メソッドです。
https://docs.python.jp/3/library/email.header.html#email.header.Header.encode
メッセージヘッダを RFC に沿ったやり方でエンコードします。おそらく長い行は折り返され、非 ASCII 部分は base64 または quoted-printable エンコーディングで包含されるでしょう。
RFC-2047 にそった、以下の形式の文字列を取得できます。
encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
https://tools.ietf.org/html/rfc2047.html
同じような記法を、文字列のインスタンスに対しても行っている例を見たことがあります。
こちらは、string クラスの encode() メソッドです。
https://docs.python.jp/3/library/stdtypes.html#str.encode
文字列のエンコードされたバージョンをバイト列オブジェクトとして返します。
原文の直訳になっちゃってますが、文字コードの変換を行います。
引数なしで呼ばれているときは、デフォルトの "utf-8" への変換を行います。
「記法」というか、メソッドの呼び出しなので、メソッド名が同じでも、そのクラスがどんなクラスかによって処理内容は変わります。
これを付けないと何が不都合なのでしょうか?
「これを付けないと」は、メールヘッダーの方の話だと思いますが、%-書式化で %s で受け取ってますから、string を渡してあげなくてはいけません。
mail_address = メアド sender_name = Header('差出人名'.encode('iso-2022-jp'),'iso-2022-jp').encode() sender = '%s <%s>' % (sender_name, mail_address)
email.header.Header クラスには、__str__() メソッドもあるので、str() 関数で変換するのでも構いません。
mail_address = メアド sender_name = str(Header('差出人名'.encode('iso-2022-jp'),'iso-2022-jp')) sender = '%s <%s>' % (sender_name, mail_address)
https://docs.python.jp/3/library/email.header.html#email.header.Header.__str__
https://docs.python.jp/3/library/stdtypes.html#str
コンストラクタ、及び、append() メソッドのところに以下のようにあります。
https://docs.python.jp/3/library/email.header.html#email.header.Header
https://docs.python.jp/3/library/email.header.html#email.header.Header.append
str.encode() メソッドの戻り値は bytes なので、上記の動作をしています。
2018/09/30 16:39:21「単にstr型を与えても」は、こちらの動作になります。
ありがとう御座います。一応挙動に違いがあったんですね。
2018/10/02 18:40:57