Pythonのsmtplibモジュールを使ってメールを処理する方法を詳しく解説_基礎知識

WBOY
リリース: 2016-05-16 15:52:54
オリジナル
2677 人が閲覧しました

インターネットベースのアプリケーションでは、多くの場合、プログラムは電子メールを自動的に送信する必要があります。たとえば、Web サイトの登録システムは、ユーザーが登録するときに登録を確認する電子メールを送信します。ユーザーがログイン パスワードを忘れた場合、ユーザーは電子メールを通じてパスワードを取得します。 smtplib モジュールは、Python での SMTP (Simple Mail Transfer Protocol) のクライアント実装です。 smtplib モジュールを使用すると、電子メールを簡単に送信できます。次の例では、10 行未満のコードで電子メールを送信します。

#coding=gbk 
 
import smtplib 
 
smtp = smtplib.SMTP() 
smtp.connect("smtp.yeah.net", "25") 
smtp.login('用户名', '密码') 
smtp.sendmail('from@yeah.net', 'to@21cn.com', 'From: from@yeah.net/r/nTo: to@21cn.com/r/nSubject: this is a email from python demo/r/n/r/nJust for test~_~') 
smtp.quit()
ログイン後にコピー

この例は非常に簡単です^_^! stmplib モジュールのクラスとメソッドについては、以下で詳しく紹介します。
smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

SMTP クラスのコンストラクターは、SMTP サーバーとの接続を表し、この接続を通じて SMTP サーバーに指示を送信し、関連する操作 (ログイン、電子メールの送信など) を実行できます。このクラスは、以下で説明する多数のメソッドを提供します。パラメータはすべてオプションです。上の例の SMTP ホストは「smtp.yeah.net」です。デフォルトは 25 です。 SMTP オブジェクトを作成しています。 これら 2 つのパラメータは初期化中に指定され、初期化中にサーバーに接続するために connect メソッドが自動的に呼び出されます。

smtplib モジュールには SMTP_SSL クラスと LMTP クラスも提供されており、それらの動作は基本的に SMTP と同じです。

smtplib.SMTP によって提供されるメソッド:

SMTP.set_debuglevel(level)
ログイン後にコピー

デバッグモードかどうかを設定します。デフォルトは False で、非デバッグ モードです。これは、デバッグ情報が出力されないことを意味します。

SMTP.connect([host[, port]])
ログイン後にコピー

指定された smtp サーバーに接続します。パラメータはそれぞれ smpt ホストとポートを表します。注: ホスト パラメータでポート番号を指定することもできるため (例: smpt.yeah.net:25)、ポート パラメータを指定する必要はありません。

SMTP.docmd(cmd[, argstring])
ログイン後にコピー

SMTP サーバーに指示を送信します。オプションのパラメータ argstring は、命令のパラメータを表します。次の例では、docmd メソッドを呼び出してサーバーに指示を送信することにより、電子メール送信を完全に実装しています (smtp.yeah.net メール サーバーでテストされています。他のメール サーバーでは試されていません):

import smtplib, base64, time 
userName = base64.encodestring('from').strip() 
password = base64.encodestring('password').strip() 
smtp = smtplib.SMTP() 
smtp.connect("smtp.yeah.net:25") 
print smtp.docmd('helo', 'from') 
print smtp.docmd('auth login') 
print smtp.docmd(userName) 
print smtp.docmd(password) 
print smtp.docmd('mail from:', '<from@yeah.net>') 
print smtp.docmd('rcpt to:', '<from@yeah.net>') 
#data 指令表示邮件内容 
print smtp.docmd('data') 
print smtp.docmd(
'''''from: from@yeah.net 
to: from@yeah.net 
subject: subject 
email body 
. 
'''
) 
smtp.quit()
ログイン後にコピー

SMTP.helo([ホスト名])

「helo」コマンドを使用して、サーバーに対して ID を確認します。これは、SMTP サーバーに「私が誰であるか」を伝えることと同じです。
SMTP.has_extn(名前)

指定された名前がサーバーのメーリング リストに存在するかどうかを確認します。セキュリティ上の理由から、SMTP サーバーはこのコマンドをブロックすることがよくあります。
SMTP.verify(アドレス)

指定された電子メール アドレスがサーバーに存在するかどうかを確認します。セキュリティ上の理由から、SMTP サーバーはこのコマンドをブロックすることがよくあります。
SMTP.login(ユーザー、パスワード)

SMTP サーバーにログインします。現在、ほぼすべての SMTP サーバーは、電子メールの送信を許可する前にユーザー情報が正当であることを検証する必要があります。
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])

メールを送信します。ここで、3 番目のパラメータ msg が電子メールを表す文字列であることに注意してください。一般に、メールはタイトル、送信者、受信者、メールの内容、添付ファイルなどで構成されていることがわかります。メールを送信するときは、メッセージの形式に注意してください。この形式は、smtp プロトコルで定義されている形式です。上記の例では、msg の値は次のとおりです:


'''''From: from@yeah.net 
To: to@21cn.com 
Subject: test 
 
just for test'''
ログイン後にコピー

この文字列の意味は、メールの送信者が「from@yeah.net」、受信者が「to@21cn.com」、メールのタイトルが「test」、メールの内容が「just for test」であることを意味します。 」。注意してみると、送信するメールの内容が写真、動画、添付ファイルなど非常に複雑な場合、MIME 形式に従って文字列を結合するのは非常に面倒です。心配しないでください。Python はこれをすでに考慮しており、写真、ビデオ、添付ファイルなどの複雑なコンテンツを含む電子メールを簡単に送信できる電子メール モジュールを提供しています。 smtplib モジュールを紹介した後、メール モジュールの基本的な使い方を簡単に紹介します。
SMTP.quit()

SMTP サーバーからの切断は、「quit」コマンドを送信することと同じです。
電子メールとその関連サブモジュール

emial モジュールは、RFC 2822 に基づいた MIME やその他のメッセージ ドキュメントを含む電子メール メッセージを処理するために使用されます。これらのモジュールを使用して電子メールのコンテンツを定義するのは非常に簡単です。よく使用されるクラスをいくつか示します:

  • クラス email.mime.multipart.MIMEMultipart: 複数の MIME オブジェクトのコレクション。
  • クラス email.mime.audio.MIMEAudio: MIME オーディオ オブジェクト。
  • クラス email.mime.image.MIMEImage: MIME バイナリ ファイル オブジェクト。
  • クラス email.mime.text.MIMEText: MIME テキスト オブジェクト。

上記の説明はわかりにくいように思えるかもしれませんが、実際、私の SMTP と MIME の理解も非常に表面的です。しかし、ほとんどの場合、必要なのは使い方を知ることだけです。これらのクラスを使用して添付ファイル付きの電子メールを送信する方法を示す簡単な例を次に示します。

#coding=gbk 
import smtplib, mimetypes 
from email.mime.text import MIMEText 
from email.mime.multipart import MIMEMultipart 
from email.mime.image import MIMEImage 
 
msg = MIMEMultipart() 
msg['From'] = "from@yeah.net" 
msg['To'] = 'to@21cn.com' 
msg['Subject'] = 'email for tesing' 
 
#添加邮件内容 
txt = MIMEText("这是邮件内容~~") 
msg.attach(txt) 
 
#添加二进制附件 
fileName = r'e:/PyQt4.rar' 
ctype, encoding = mimetypes.guess_type(fileName) 
if ctype is None or encoding is not None: 
 ctype = 'application/octet-stream' 
maintype, subtype = ctype.split('/', 1) 
att1 = MIMEImage((lambda f: (f.read(), f.close()))(open(fileName, 'rb'))[0], _subtype = subtype) 
att1.add_header('Content-Disposition', 'attachment', filename = fileName) 
msg.attach(att1) 
 
#发送邮件 
smtp = smtplib.SMTP() 
smtp.connect('smtp.yeah.net:25') 
smtp.login('from', '密码') 
smtp.sendmail('from@yeah.net', 'to@21cn.com', msg.as_string()) 
smtp.quit() 
print '邮件发送成功'
ログイン後にコピー

とても簡単なことではありませんか?シンプルさは美しく、最小限のコードで問題を解決します。これが Python です。 smtplib の詳細については、Python マニュアル smtplib モジュール を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート