Python3如何使用SMTP协议发送E-mail电子邮件的示例
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。下面这篇文章主要给大家介绍了关于Python3如何利用SMTP协议发送E-mail电子邮件的方法,需要的朋友可以参考下。
前言
本文主要给大家介绍了关于Python3用SMTP协议发送电子邮件的相关内容,在介绍如何使用python程序向指定邮箱发送邮件之前,我们需要先介绍一下有关电子邮件的相关知识。
Email的历史比Web还要久远,直到现在,Email也是互联网上应用非常广泛的服务。
几乎所有的编程语言都支持发送和接收电子邮件,但是,先等等,在我们开始编写代码之前,有必要搞清楚电子邮件是如何在互联网上运作的。
假设我们自己的电子邮件地址是me@163.com,对方的电子邮件地址是friend@sina.com,现在我们用Outlook或者Foxmail之类的软件写好邮件,填上对方的Email地址,点“发送”,电子邮件就发出去了。这些电子邮件软件被称为MUA:Mail User Agent——邮件用户代理。
Email从MUA发出去,不是直接到达对方电脑,而是发到MTA:Mail Transfer Agent——邮件传输代理,就是那些Email服务提供商,比如网易、新浪等等。由于我们自己的电子邮件是163.com,所以,Email首先被投递到网易提供的MTA,再由网易的MTA发到对方服务商,也就是新浪的MTA。这个过程中间可能还会经过别的MTA,但是我们不关心具体路线,我们只关心速度。
Email到达新浪的MTA后,由于对方使用的是@sina.com的邮箱,因此,新浪的MTA会把Email投递到邮件的最终目的地MDA:Mail Delivery Agent——邮件投递代理。Email到达MDA后,就静静地躺在新浪的某个服务器上,存放在某个文件或特殊的数据库里,我们将这个长期保存邮件的地方称之为电子邮箱。对方要取到邮件,必须通过MUA从MDA上把邮件取到自己的电脑上。
所以,一封电子邮件的旅程就是:
发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人
有了上述基本概念,要编写程序来发送和接收邮件,本质上就是:
1.编写MUA把邮件发到MTA。
2.编写MUA从MDA上收邮件。
发邮件时,MUA和MTA使用的协议就是SMTP:Simple Mail Transfer Protocol,后面的MTA到另一个MTA也是用SMTP协议。
收邮件时,MUA和MDA使用的协议有两种:POP:Post Office Protocol,目前版本是3,俗称POP3;IMAP:Internet Message Access Protocol,目前版本是4,优点是不但能取邮件,还可以直接操作MDA上存储的邮件,比如从收件箱移到垃圾箱,等等。
邮件客户端软件在发邮件时,会让你先配置SMTP服务器,也就是你要发到哪个MTA上。假设你正在使用163的邮箱,你就不能直接发到新浪的MTA上,因为它只服务新浪的用户,所以,你得填163提供的SMTP服务器地址:smtp.163.com,为了证明你是163的用户,SMTP服务器还要求你填写邮箱地址和邮箱口令,这样,MUA才能正常地把Email通过SMTP协议发送到MTA。
类似的,从MDA收邮件时,MDA服务器也要求验证你的邮箱口令,确保不会有人冒充你收取你的邮件,所以,Outlook之类的邮件客户端会要求你填写POP3或IMAP服务器地址、邮箱地址和口令,这样,MUA才能顺利地通过POP或IMAP协议从MDA取到邮件。
最后特别注意:目前大多数邮件服务商都需要手动打开SMTP发信和POP收信的功能,否则只允许在网页登录:
比如QQ邮箱
接下来,我们开始我们的正题,如何通过python发送电子邮件。
--------------------------------------------------------------------------------
发送简单文本邮件
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
首先,我们来构造一个最简单的纯文本邮件:
from email.mime.text import MIMEText msg = MIMEText('hello, this is axin...', 'plain', 'utf-8')
注意:到构造MIMEText对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入'plain'表示纯文本,最终的MIME就是'text/plain',最后一定要用utf-8编码保证多语言兼容性。
我们光有了正文内容还不可以,我们还需要给我们要发送的邮件添加头部信息。头部信息中包含发送者和接收者以及邮件主题等信息。
msg = MIMEText('hello, this is axin...', 'plain', 'utf-8') #邮件正文 msg['From'] = _format_addr('阿鑫 <%s>' % from_addr) #邮件头部,发送者信息 msg['To'] = _format_addr('aa <%s>' % to_addr) #接收者信息 msg['Subject'] = Header('test', 'utf-8').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, 'utf-8').encode(), addr)) from_addr = 'fengxinlinux@sina.com' #发送者邮箱地址 password = '******' #发送者邮箱密码,不告诉你密码=。= to_addr = '903087053@qq.com' #接收者邮箱地址 smtp_server = 'smtp.sina.com' #发送者所在的邮箱供应商的MTA地址 #from_addr = input('From: ') #password = input('Password: ') #to_addr = input('To: ') #smtp_server = input('SMTP server: ') msg = MIMEText('hello, this is axin...', 'plain', 'utf-8') #邮件正文 msg['From'] = _format_addr('阿鑫 <%s>' % from_addr) #邮件头部,发送者信息 msg['To'] = _format_addr('axin <%s>' % to_addr) #接收者信息 msg['Subject'] = Header('test', 'utf-8').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['From'] = _format_addr('阿鑫 <%s>' % from_addr) #邮件头部,发送者信息 msg['To'] = _format_addr('axin <%s>' % to_addr) #接收者信息 msg['Subject'] = Header('test', 'utf-8').encode() #邮件主题 # 邮件正文是MIMEText: msg.attach(MIMEText('hello, this is axin...', 'plain', 'utf-8')) # 添加附件就是加上一个MIMEBase,从本地读取一个图片: with open('/home/fengxin/图片/11.jpg','rb') as fhandle: mime = MIMEBase('image','jpeg',filename='11.jpg') mime.add_header('Content-Disposition', 'attachment', filename='11.jpg') mime.add_header('Content-ID', '<0>') mime.add_header('X-Attachment-Id', '0') # 把附件的内容读进来: mime.set_payload(fhandle.read()) # 用Base64编码: encoders.encode_base64(mime) # 添加到MIMEMultipart: msg.attach(mime)
然后,按正常发送流程把msg(注意类型已变为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, 'utf-8').encode(), addr)) from_addr = '你的邮箱地址' #发送者邮箱地址 password = '你的邮箱密码' #发送者邮箱密码 to_addr = '903087053@qq.com' #接收者邮箱地址 smtp_server = 'smtp.sina.com' #发送者所在的邮箱供应商的MTA地址 #from_addr = input('From: ') #password = input('Password: ') #to_addr = input('To: ') #smtp_server = input('SMTP server: ') msg= MIMEMultipart() msg['From'] = _format_addr('阿鑫 <%s>' % from_addr) #邮件头部,发送者信息 msg['To'] = _format_addr('axin <%s>' % to_addr) #接收者信息 msg['Subject'] = Header('test', 'utf-8').encode() #邮件主题 msg.attach(MIMEText('hello, this is axin...', 'plain', 'utf-8')) with open('/home/fengxin/图片/11.jpg','rb') as fhandle: mime = MIMEBase('image','jpeg',filename='11.jpg') mime.add_header('Content-Disposition', 'attachment', filename='11.jpg') mime.add_header('Content-ID', '<0>') mime.add_header('X-Attachment-Id', '0') # 把附件的内容读进来: 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
运行后。测试邮箱正确收到邮件,如图:
总结
Atas ialah kandungan terperinci Python3如何使用SMTP协议发送E-mail电子邮件的示例. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Terdapat dua protokol utama untuk pengecasan pantas vivo: 1. Protokol pengecasan pantas "QC 2.0" "QC2.0" ialah teknologi "Quick Charge 2.0" Ia adalah versi 2.0 teknologi pengecasan pantas yang dikeluarkan oleh Qualcomm. 9V, dan 12V , 20V empat kumpulan voltan; 2. Protokol pengecasan pantas PD ialah spesifikasi pengecasan pantas yang dirumuskan oleh organisasi "USB-IF" Ia adalah salah satu protokol pengecasan pantas arus perdana dan boleh menjadikan kuasa maksimum lalai semasa "5V/2A" Antara muka "jenis-c" dinaikkan kepada 100W.

Protokol pengecasan pantas PD3.0 menyokong sehingga "100W". Pada November 2015, pengecasan pantas USB PD telah membawa kemas kini versi utama dan memasuki era pengecasan pantas USB PD3.0, protokol PD3.0 menyokong output 5V3A, 9V3A, 12V3A, 15V3A dan 20V5A, dan kuasa maksimum boleh mencapai; 100W Bukan sahaja boleh digunakan untuk mengecas telefon bimbit, dan juga boleh digunakan untuk menghidupkan komputer riba atau monitor.

5 jenis protokol komunikasi industri: 1. Protokol Modbus, yang merupakan bahasa universal yang digunakan dalam pengawal elektronik; 2. Protokol RS-232, yang merupakan standard antara muka fizikal bersiri; berdasarkan; 4. Protokol HART ialah protokol komunikasi yang digunakan antara instrumen pintar di tapak dan peralatan bilik kawalan 5. Protokol MPI ialah protokol komunikasi silang bahasa yang digunakan untuk menulis komputer selari.

Dengan pembangunan berterusan teknologi Internet, semakin banyak aplikasi peringkat perusahaan perlu menyediakan antara muka kepada aplikasi lain untuk merealisasikan interaksi data dan perniagaan. Dalam kes ini, kami memerlukan protokol yang boleh dipercayai untuk menghantar data dan memastikan integriti dan keselamatan data. SOAP (Simple Object Access Protocol) ialah protokol berasaskan XML yang boleh digunakan untuk melaksanakan komunikasi antara aplikasi dalam persekitaran Web. Sebagai bahasa pengaturcaraan web yang popular, PHP

PHP是一种强大的编程语言,广泛应用于Web开发领域中,其中SMTP邮件功能也是PHP开发中的重要一环。但是,在某些情况下,您可能希望禁止SMTP邮件功能,本文将介绍如何实现。

Protokol pengecasan pantas QC4 ialah gabungan protokol USB PD PPS dan protokol pengecasan pantas QC3.0/2.0 Ia adalah teknologi pengecasan pantas berbilang fungsi. Protokol pengecasan QC4 serasi dengan USB PD3.0 (PPS) dan juga serasi ke bawah dengan USB PD2.0, QC3.0, QC2.0, BC1.2 dan protokol lain. Prasyarat pertama untuk menyokong USB PD dan QC4 ialah kedua-dua hujung mempunyai sokongan antara muka USB-C dan mesej rundingan kuasa berdasarkan CC (saluran konfigurasi) dalam antara muka USB-C.

Protokol "x.25" menggunakan teknologi pensuisan paket; protokol "x.25" ialah rangkaian komunikasi data berorientasikan komputer, yang terdiri daripada peralatan asas seperti talian penghantaran, suis paket, penumpu jauh dan terminal paket, dan menggunakan rangkaian berlapis. seni bina , rundingan, kawalan dan penghantaran maklumat pertukaran maklumat dijalankan antara lapisan rakan sebaya antara muka melalui protokol komunikasi antara lapisan rakan sebaya.

Microsoft merancang untuk melumpuhkan protokol Transport Layer Security (TLS) versi 1.0 dan 1.1 dalam Windows. Syarikat itu mengumumkan berita itu di laman web komuniti teknologinya pada 1 Mac 2023. Kedua-dua protokol ini bermula sejak 1999 (TLS1.0) dan 2006 (TLS1.1) dan sejak itu telah diatasi oleh versi yang lebih baharu TLS1.2 dan TLS1.3. Microsoft menyatakan bahawa isu keselamatan ditemui dalam versi protokol yang lebih lama, dan "Standard dan pengawal selia Internet telah menghentikan atau tidak membenarkan versi TLS 1.0 dan 1.1 sebagai tindak balas. Selama bertahun-tahun, penggunaan TLS 1.0 dan 1.1 telah merosot dengan ketara. , Microsoft percaya masa telah berlalu. datang untuk melumpuhkan kedua-dua protokol.
