インターネットベースのアプリケーションでは、多くの場合、プログラムは電子メールを自動的に送信する必要があります。たとえば、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 やその他のメッセージ ドキュメントを含む電子メール メッセージを処理するために使用されます。これらのモジュールを使用して電子メールのコンテンツを定義するのは非常に簡単です。よく使用されるクラスをいくつか示します:
上記の説明はわかりにくいように思えるかもしれませんが、実際、私の 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 モジュール を参照してください。