ホームページ > バックエンド開発 > Python チュートリアル > Python3 が SMTP プロトコルを使用して電子メールを送信する方法の例

Python3 が SMTP プロトコルを使用して電子メールを送信する方法の例

黄舟
リリース: 2017-10-02 09:43:14
オリジナル
3441 人が閲覧しました

SMTP (Simple Mail Transfer Protocol) は、送信元アドレスから宛先アドレスへメールを送信するための一連のルールであり、レターの転送方法を制御します。以下の記事では、Python3 が SMTP プロトコルを使用して電子メールを送信する方法を主に紹介します。必要な友達は参考にしてください。

はじめに

この記事では主に、SMTP プロトコルを使用して電子メールを送信する Python3 に関する関連内容を紹介します。Python プログラムを使用して指定されたメールボックスに電子メールを送信する方法を紹介する前に、まず、電子メールに関する関連情報。

電子メールは Web よりも長い歴史を持ち、これまでインターネット上で非常に広く使用されているサービスでもあります。

ほぼすべてのプログラミング言語は電子メールの送受信をサポートしていますが、コードを書き始める前に、インターネット上で電子メールがどのように機能するかを理解する必要があります。

自分のメール アドレスが me@163.com で、相手のメール アドレスが friends@sina.com であるとします。Outlook や Foxmail などのソフトウェアを使用してメールを作成し、相手のメール アドレスを入力して、[クリック] をクリックします。 「送信」するとメールが送信されます。これらの電子メール ソフトウェアは MUA: Mail User Agent - メール ユーザー エージェントと呼ばれます。

MUA から送信されたメールは相手のコンピューターに直接届きませんが、MTA: メール転送エージェント - メール転送エージェント (NetEase、Sina などの電子メール サービス プロバイダー) に送信されます。私たち自身の電子メールは 163.com であるため、電子メールはまず NetEase が提供する MTA に配信され、次に NetEase の MTA によって他のサービス プロバイダー (Sina の MTA) に送信されます。このプロセスは他の MTA を経由することもありますが、特定のルートは気にせず、速度だけを気にします。

メールがSinaのMTAに届いた後、相手は@sina.comのメールアドレスを使用しているため、SinaのMTAはメールの最終宛先であるMDA:Mail Delivery Agentにメールを配信します。電子メールは MDA に到達した後、Sina のサーバーに静かに置かれ、ファイルまたは特別なデータベースに保管されます。この場所を電子メール ボックスと呼びます。メールを取得するには、相手は MUA を使用して MDA から自分のコンピュータにメールを取得する必要があります。

つまり、メールの流れは次のとおりです。

送信者 -> MTA -> MTA -> 複数の MTA <- MUA <- 受信者上記の基本概念を理解するには、電子メールを送受信するためのプログラムを作成する必要があります。

1. MTA に電子メールを送信するための MUA を作成します。

2. MDA からのメールを受信するには、MUA を書き込みます。

メールを送信する場合、MUA と MTA で使用されるプロトコルは SMTP (Simple Mail Transfer Protocol) です。後続の MTA も別の MTA に対して SMTP プロトコルを使用します。

電子メールを受信するとき、MUA と MDA は 2 つのプロトコルを使用します: POP: ポスト オフィス プロトコル、現在のバージョンは 3 (一般的に POP3 として知られています); IMAP: インターネット メッセージ アクセス プロトコル、現在のバージョンは 4 ですが、利点は、メールを取得するだけでなく、MDA に保存されているメールを受信トレイからゴミ箱に移動するなど、直接操作することもできます。

電子メールを送信するとき、電子メール クライアント ソフトウェアは、最初に SMTP サーバー、つまりどの MTA に送信するかを設定するように求めます。 163 の電子メール アドレスを使用していると仮定すると、Sina の MTA は Sina ユーザーのみにサービスを提供するため、Sina の MTA に直接送信することはできません。したがって、163 が提供する SMTP サーバー アドレス (smtp.163.com) を入力して、自分が 163 であることを証明する必要があります。 163 ユーザーの場合、SMTP サーバーは、MUA が通常 SMTP プロトコル経由で MTA に電子メールを送信できるように、電子メール アドレスと電子メール パスワードを入力することも要求します。

同様に、MDA から電子メールを受信する場合、MDA サーバーは、誰もあなたになりすまして電子メールを受信しないように、電子メール パスワードの検証を要求します。そのため、Outlook などの電子メール クライアントは、POP3 を入力するように求めます。または IMAP サーバー アドレス、電子メール アドレス、およびパスワード。これにより、MUA は POP または IMAP プロトコルを通じて MDA から電子メールを正常に取得できます。

最後の特記事項:

現在、ほとんどの電子メール サービス プロバイダーは、SMTP 送信機能と POP 受信機能を手動で有効にする必要があります。そうでない場合、Web でのログインのみが許可されます: たとえば、QQ メールボックス

次に、私たちのメイントピックであるPythonを介して電子メールを送信する方法を始めます。

------------------------------------------------ --------------------------------

簡単なテキストメールを送信します

送信プロトコルはSMTPですPython には SMTP のサポートが組み込まれており、プレーン テキストの電子メール、HTML メール、および添付ファイル付きの電子メールを送信できます。

Python は、smtplib と email の 2 つのモジュールで SMTP をサポートしており、Email は電子メールの構築を担当し、smtplib は電子メールの送信を担当します。

まず、最も単純なプレーンテキストメールを作成しましょう:

from email.mime.text import MIMEText
msg = MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;)
ログイン後にコピー

注: MIMEText オブジェクトを構築する場合、最初のパラメーターは電子メールの本文、2 番目のパラメーターは MIME のサブタイプです。「plain」を渡すとプレーン テキストを意味し、最終的な MIME は「text/plain」になります。最後に、複数言語の互換性を確保するには、UTF-8 エンコーディングを使用する必要があります。

本文のコンテンツだけでなく、送信するメールにヘッダー情報も追加する必要があります。ヘッダー情報には、メールの送信者や受信者、件名などの情報が含まれます。


msg = MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;) #邮件正文
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;aa <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题
ログイン後にコピー

送信したい情報を構築したら、Python で対応する関数を呼び出して SMTP 経由で送信するだけです。


server = smtplib.SMTP(smtp_server, 25) #SMTP协议默认端口是25
server.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件
server.quit()
ログイン後にコピー

set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。SMTP协议就是简单的文本命令和响应。login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string() を使用して MIMEText オブジェクトを str に変換します。

完全なコード例は次のとおりです:


from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

import smtplib

def _format_addr(s): #格式化一个邮件地址
name, addr = parseaddr(s)
return formataddr((Header(name, &#39;utf-8&#39;).encode(), addr))

from_addr = &#39;fengxinlinux@sina.com&#39; #发送者邮箱地址
password = &#39;******&#39; #发送者邮箱密码,不告诉你密码=。=
to_addr = &#39;903087053@qq.com&#39; #接收者邮箱地址
smtp_server = &#39;smtp.sina.com&#39; #发送者所在的邮箱供应商的MTA地址
#from_addr = input(&#39;From: &#39;)
#password = input(&#39;Password: &#39;)
#to_addr = input(&#39;To: &#39;)
#smtp_server = input(&#39;SMTP server: &#39;)

msg = MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;) #邮件正文
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;axin <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题


server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
server.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件
server.quit()
1
ログイン後にコピー

プログラムを実行すると、テストしたメールボックスに新しい電子メールが受信されたことがわかります。

他の情報は同じですが、受信者の情報はプログラムに入力された axin ではないことがわかります。

多くの電子メール サービス プロバイダーは、電子メールを表示するときに受信者の名前をユーザーの登録名に自動的に置き換えますが、他の受信者の名前の表示には影響しません。

テストをしていたところ、送信したメールがメールプロバイダーによってスパムと判断され、直接ゴミ箱に入れられてしまうことがありました。 。 。何がスパムとみなされるかについては、私にはわかりません。 。

添付ファイル付きのメールを送信する

上記の知識があれば、添付ファイル付きのメールを送信する方法は実際には非常に簡単です。

添付ファイル付きの電子メールは、テキストと各添付ファイル自体の複数の部分を含む電子メールと見なすことができます。したがって、電子メール自体を表す MIMEMultipart オブジェクトを構築し、それに電子メール本文として MIMEText を追加できます。添付ファイルの MIMEBase オブジェクトで十分です:


# 邮件对象:
msg= MIMEMultipart()
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;axin <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题

# 邮件正文是MIMEText:
msg.attach(MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;))

# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open(&#39;/home/fengxin/图片/11.jpg&#39;,&#39;rb&#39;) as fhandle:
mime = MIMEBase(&#39;image&#39;,&#39;jpeg&#39;,filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;, filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-ID&#39;, &#39;<0>&#39;)
mime.add_header(&#39;X-Attachment-Id&#39;, &#39;0&#39;)
# 把附件的内容读进来:
mime.set_payload(fhandle.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)
ログイン後にコピー

次に、通常の送信プロセスに従ってメッセージを送信します (タイプが MIMEMultipart に変更されていることに注意してください)。電子メールを受信できるようになります。添付ファイル付き。

完全なコード例は次のとおりです:


from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase


import smtplib

def _format_addr(s): #格式化一个邮件地址
name, addr = parseaddr(s)
return formataddr((Header(name, &#39;utf-8&#39;).encode(), addr))

from_addr = &#39;你的邮箱地址&#39; #发送者邮箱地址
password = &#39;你的邮箱密码&#39; #发送者邮箱密码
to_addr = &#39;903087053@qq.com&#39; #接收者邮箱地址
smtp_server = &#39;smtp.sina.com&#39; #发送者所在的邮箱供应商的MTA地址
#from_addr = input(&#39;From: &#39;)
#password = input(&#39;Password: &#39;)
#to_addr = input(&#39;To: &#39;)
#smtp_server = input(&#39;SMTP server: &#39;)


msg= MIMEMultipart()
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;axin <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题

msg.attach(MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;))

with open(&#39;/home/fengxin/图片/11.jpg&#39;,&#39;rb&#39;) as fhandle:
mime = MIMEBase(&#39;image&#39;,&#39;jpeg&#39;,filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;, filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-ID&#39;, &#39;<0>&#39;)
mime.add_header(&#39;X-Attachment-Id&#39;, &#39;0&#39;)
# 把附件的内容读进来:
mime.set_payload(fhandle.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)

server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
server.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件
server.quit()
1
ログイン後にコピー

実行後。次の図に示すように、テスト メールボックスはメールを正しく受信しました。

以上がPython3 が SMTP プロトコルを使用して電子メールを送信する方法の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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