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

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

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('hello, this is axin...', 'plain', 'utf-8')

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

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


msg = MIMEText('hello, this is axin...', 'plain', 'utf-8') #邮件正文
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 サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python:ゲーム、GUIなどPython:ゲーム、GUIなどApr 13, 2025 am 12:14 AM

PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。

Python vs. C:比較されたアプリケーションとユースケースPython vs. C:比較されたアプリケーションとユースケースApr 12, 2025 am 12:01 AM

Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

2時間のPython計画:現実的なアプローチ2時間のPython計画:現実的なアプローチApr 11, 2025 am 12:04 AM

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Python:主要なアプリケーションの調査Python:主要なアプリケーションの調査Apr 10, 2025 am 09:41 AM

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

2時間でどのくらいのPythonを学ぶことができますか?2時間でどのくらいのPythonを学ぶことができますか?Apr 09, 2025 pm 04:33 PM

2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は?プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は?Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか?中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか?Apr 02, 2025 am 07:15 AM

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

Python 3.6にピクルスファイルをロードするときに「__Builtin__」モジュールが見つからない場合はどうすればよいですか?Python 3.6にピクルスファイルをロードするときに「__Builtin__」モジュールが見つからない場合はどうすればよいですか?Apr 02, 2025 am 07:12 AM

Python 3.6のピクルスファイルのロードレポートエラー:modulenotFounderror:nomodulenamed ...

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境