web-dev-qa-db-ja.com

MIMEMultipart、MIMEText、MIMEBase、およびPython

MIMEに関する事前の知識があまりないため、Pythonスクリプトを添付してメールを送信するスクリプトを作成する方法を学びました。相互参照した後Pythonドキュメント、Stack Overflowの質問、および一般的なWeb検索で、次のコードで解決しました [1] 動作するかテストしました。

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email import encoders

fromaddr = "YOUR EMAIL"
toaddr = "EMAIL ADDRESS YOU SEND TO"

msg = MIMEMultipart()

msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "SUBJECT OF THE EMAIL"

body = "TEXT YOU WANT TO SEND"

msg.attach(MIMEText(body, 'plain'))

filename = "NAME OF THE FILE WITH ITS EXTENSION"
attachment = open("PATH OF THE FILE", "rb")

part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)

msg.attach(part)

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(fromaddr, "YOUR PASSWORD")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
  1. このスクリプトがどのように機能するかについて大まかな考えがあり、次のワークフローを作成しました。私のフローチャート(?)の精度を教えてください。

     as.string()  
     |
     +------------MIMEMultipart  
                  |                                                |---content-type  
                  |                                   +---header---+---content disposition  
                  +----.attach()-----+----MIMEBase----|  
                                     |                +---payload (to be encoded in Base64)
                                     +----MIMEText
    
  2. MIMEMultipart、MIMEText、およびMIMEBaseをいつ使用するかを知るにはどうすればよいですか?これは複雑な質問のように思えるので、おそらく私にいくつかの一般的な経験則を提供しますか?

  3. MIMEはツリーのような構造をしていると読みました[2] 、それはMIMEMultipartが常に一番上にあるということですか?
  4. 最初のコードブロックでは、MIMEMultipartは['From']、['To']、および['Subject']をエンコードしますが、Pythonのドキュメントでは、MIMETextを使用してエンコードすることもできます[ 'From']、['To']、および['Subject']。使用するものをどのように決定しますか?
  5. 「ペイロード」とは正確には何ですか?転送するコンテンツはありますか?もしそうなら、これにはどのような種類のコンテンツが含まれますか(本文と添付ファイルがペイロードとして扱われていることに気付きました)?これは簡単な質問だと思いましたが、満足できる信頼できる簡単な答えを見つけることができませんでした。
  6. MIMEは一部のテキストよりもはるかに単純なファイル形式を添付できますが、最後にすべてのエンコード、ヘッダー情報、ペイロードがすべて文字列に変換され、.sendmail()に渡されるようになっているのは本当ですか?

[1] http://naelshiab.com/tutorial-send-email-python/
[2] http://blog.magiksys.net/generate-and-send-mail-with-python-tutorial

20
Ken Lin

電子メールメッセージ

電子メールメッセージは、ヘッダー(「From」、「To」、「Subject」など)と本文( RFC 822、セクション3.1 を参照)で構成されます。

メッセージの本文は、デフォルトではプレーンASCII text。MIME( RFC 2045 として処理されます。 RFC 2046RFC 2047RFC 2048RFC 2049 )は、さまざまな種類の電子メールコンテンツを指定できます。

MIMEで非常に便利なことの1つは、Content-Typeを指定することです(例:text/htmlまたはapplication/octet-stream)。

もう1つの便利な点は、複数の部分を含むメッセージを作成できることです(たとえば、HTMLとHTML内に画像の両方が必要な場合)。これは、multipart Content-Type( RFC 2046、section 5.1 )を指定することによって行われます。

マルチパートメッセージ

メッセージにmultipart Content-Typeがある場合、それは複数のメッセージで構成され、それぞれが独自のContent-Typeを定義することを意味します(これもマルチパートまたはその他の何かである可能性があります)。マルチパートメッセージはPython MIMEMultipart クラスで表されます)にあります。

したがって、質問3に答えるには、MIMEMultipartを使用すると、はい、ツリーのような構造になりますが、 MIMEText が使用されている場合、ツリーではありません。

質問4は、ヘッダーを設定するクラス( "To"、 "From"など)を尋ねます-これは、 Message クラスですが、すべてのMIMEクラスはMessageから継承されるため、どのクラスでも実行できますが、これらのヘッダーは、マルチパートメッセージのルート部分。

つまり、メッセージが1つのMIME部分のみで構成されている場合は、その部分にヘッダーを指定します。複数の部分で構成されている場合、ルートはMIMEMultipartです-その部分のヘッダーを指定します。

質問2「MIMEMultipart、MIMEText、およびMIMEBaseをいつ使用するか」を尋ねます。 -MIMEBaseは単なる基本クラスです。 specification が言うように: "通常、特にMIMEBaseのインスタンスを作成することはありません"-MIMETextはテキスト用です(例text/plainまたはtext/html)、メッセージ全体がテキスト形式の場合、またはその一部の場合。 -MIMEMultipartは、「複数のパーツがある」と言ってパーツを一覧表示するためのものです。添付ファイルがある場合は、次のことも行います。同じコンテンツの代替バージョンを提供する(例:プレーンテキストバージョンとHTMLバージョン)

質問5 "正確に"ペイロード "とは何ですか?"-それは単なる空想的な言葉ですメッセージの内容(またはメッセージ部分)

質問6SMTPで7ビットのみを使用することには制限があります。詳細については、 this answer を参照してください。

質問1は完全には理解できませんでしたが、グラフは多かれ少なかれ正しいようです。ところで、 MIMEBase があるので、ここではMIMEApplicationを使用しません。これは、意図した目的により適しているようです。

6
zvone