些項目可能需要我們通過代碼的方式來發送郵件,比如在后臺給客戶批量發送郵件,或者,我們也可以通過代碼給自己發送提醒郵件,比如觸發了某些事件需要我們親自去操作的時候,就可以使用代碼直接給自己發送一封預警郵件等等。
那么,如何使用 Python 來發送郵件呢?
在此之前,我們先來簡單的了解一下:
我們知道在互聯網中常用的協議是 HTTP,這樣我們的瀏覽器才能獲取到服務器的網頁內容,同樣的 SMTP 也是一種常見的互聯網應用層傳輸協議,不同的是,這種類型是專門用來處理郵件的。
一般情況下,你在發送郵件的時候,并不是直接就把你寫的內容發送到對方的收件箱中,它會先發送給 smtp 服務器進行處理,然后發送到對應的服務器中,比如 Gmail,然后 Gmail 就會下載郵件,把它放到收件人的郵箱里面去。
在 Python 中有一個 smtpd 模塊,我們可以使用它在本地開啟一個 SMTP 服務,像這樣:
python -m smtpd -c DebuggingServer -n localhost:1088
這樣我們就可以在本地測試郵件的發送了。
當然,我們并不需要自己創建 SMTP 服務,不同的郵件廠商都有提供它們的 STMP 服務地址,比如 Gmail 的就是 smtp.gmail.com:
知道了什么是 smtp 之后,我們就可以使用 Python 來發送郵件了。
在 Python 中有一個內置的 smtplib 庫,你可以使用它來連接 smtp 服務器,像剛剛小帥b給你看到的本地測試,發送信息給 stmp 服務就是這樣操作的:
smtpObj=smtplib.SMTP(host='localhost',port=1088
smtpObj.sendmail(sender_mail,receivers_mail, message)
我們在發送郵件的時候,是有一定的標準的,它怎么去區分要發的內容是純文本,還是含有 HTML,或者是附件呢,所以有一個 MIME 的標準,通過這個標準我們可以指定發送不同的郵件類型。
在 Python 里面有一個 email 庫,我們可以使用它來構造 MIME massgae,然后通過 smtplib 來發送。
from email.mime.multipart
import MIMEMultipart
from email.mime.text import MIMEText
接下來,我們來使用 Python 在 Gmail 給別人發送一個「帥b老仙來啦」的純文本郵件試試吧。
因為我們要使用的是 Gmail ,所以有兩個點需要先注意一下,第一個你懂的,需要做一下代理,你可以先安裝一波 PySocks,然后這樣來讓 smtp 使用 socks 代理:
import socks
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 1080)
socks.wrapmodule(smtplib)
第二個是 Google 為了你的安全,不會輕易讓你在別的地方登陸你的 Gmail 賬號,所以你需要在設置那里,把低安全性應用訪問權限打開。
好了,導入相關的庫并開啟代理:
定義好你的收發郵件地址,以及你要發的內容:
構造 MIME:
連接 Gamil 的 smtp 服務,開啟 tls 加密,登陸然后發送一波:
運行一波,沒什么問題的話對方就會收到你發的郵件啦:
剛剛,我們這里 「MIMEText(content, 'plain', 'utf-8')」中指定的是 plain,說明郵件是純文本,那么如果我們要發送的郵件內容是 HTML 呢?
我們只需要定義 HTML 語言,然后在 MIMEText 傳入 html 就可以了,像這樣:
這樣收到的郵件就是 HTML 的內容了:
如果你和我一樣用的是 Gmail,那我還要告訴你一個不錯的東西,有一個第三方庫封裝好了的 Python 郵件發送,你甚至可以一行代碼實現郵件的發送。
安裝:
pip install yagmail
發送:
yagmail.SMTP(me,password).send(to, '帥b來啦!!', '來了來了')
結果:
你還可以使用它快速實現批量發送,像這樣:
ok,以上就是小帥b今天給你帶來的分享,希望對你有幫助,那么我們下回見,peace
我以前在通過Python實現自動化郵件功能的時候是這樣的:
import smtplib from email.mime.text import MIMEText from email.header import Header # 發送郵箱服務器 smtpserver='smtp.sina.com' # 發送郵箱用戶/密碼 user='username@sina.com' password='123456' # 發送郵箱 sender='username@sina.com' # 接收郵箱 receiver='receive@126.com' # 發送郵件主題 subject='Python email test' # 編寫HTML類型的郵件正文 msg=MIMEText('<html><h1>你好!</h1></html>','html','utf-8') msg['Subject']=Header(subject, 'utf-8') # 連接發送郵件 smtp=smtplib.SMTP() smtp.connect(smtpserver) smtp.login(user, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()
其實,這段代碼也并不復雜,只要你理解使用過郵箱發送郵件,那么以下問題是你必須要考慮的:
github項目地址: https://github.com/kootenpv/yagmail
pip install yagmail
import yagmail #鏈接郵箱服務器 yag=yagmail.SMTP( user="user@126.com", password="1234", host='smtp.126.com') # 郵箱正文 contents=['This is the body, and here is just text http://somedomain/image.png', 'You can find an audio file attached.', '/local/path/song.mp3'] # 發送郵件 yag.send('taaa@126.com', 'subject', contents)
總共四行代碼搞定,是不是比上面的例子簡單太多了。
yag.send(['aa@126.com','bb@qq.com','cc@gmail.com'], 'subject', contents)
本文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。
作者:星安果
PS:如有需要Python學習資料的小伙伴可以加點擊下方鏈接自行獲取
http://t.cn/A6Zvjdun
郵件,作為最正式規范的溝通方式,在日常辦公過程中經常被用到
我們都知道 Python內置了對 SMTP 的支持,可以發送純文本、富文本、HTML 等格式的郵件
本文將聊聊利用 Python 發送郵件的 3 種方式
以 126 郵箱為例,在編碼之前,我們需要開啟 SMTP 服務
然后,手動新增一個授權碼
其中,賬號、授權碼和服務器地址用于連接登錄郵箱服務器
smtplib是 Python 自帶的依賴庫,可以直接導入使用首先,通過郵箱賬號、授權碼、郵箱服務器地址初始化一個 SMTP 實例,然后進行連接
def __init__(self):
# 初始化
self.smtp=smtplib.SMTP()
# 連接郵箱服務器地址
self.smtp.connect('smtp.126.com')
# 加入主題和附件,郵件體
self.email_body=MIMEMultipart('mixed')
# 發件人地址及授權碼
self.email_from_username='**@126.com'
self.email_from_password='授權碼'
# 登錄
self.smtp.login(self.email_from_username, self.email_from_password)
然后,將收件人列表、郵件標題、郵件正文內容、附件路徑及附件文件名加入到上面定義的郵件體中
def generate_email_body(self, email_to_list, email_title, email_content, attchment_path, files):
"""
組成郵件體
:param email_to_list:收件人列表
:param email_title:郵件標題
:param email_content:郵件正文內容
:param attchment_path:附件的路徑
:param files:附件文件名列表
:return:
"""
self.email_body['Subject']=email_title
self.email_body['From']=self.email_from_username
self.email_body['To']=",".join(email_to_list)
for file in files:
file_path=attchment_path + '/' + file
if os.path.isfile(file_path):
# 構建一個附件對象
att=MIMEText(open(file_path, 'rb').read(), 'base64', 'utf-8')
att["Content-Type"]='application/octet-stream'
att.add_header("Content-Disposition", "attachment", filename=("gbk", "", file))
self.email_body.attach(att)
text_plain=MIMEText(email_content, 'plain', 'utf-8')
self.email_body.attach(text_plain)
接著,就可以使用 SMTP 實例對象,將郵件發送出去
# 收件人列表
email_to_list=['收件人1地址','收件人2地址']
# 發送郵件
# 注意:此處必須同時指定發件人與收件人,否則會當作垃圾郵件處理掉
self.smtp.sendmail(self.email_from_username, email_to_list, self.email_body.as_string())
郵件發送完畢之后,退出服務即可
def exit(self):
"""
退出服務
:return:
"""
self.smtp.quit()
Zmail 項目創建目的是,使郵件處理變得更簡單
使用 Zmail 發送接收郵件方便快捷,不需要手動添加服務器地址、端口以及適合的協議,可以輕松創建 MIME 對象和頭文件
注意:Zmail 僅支持 Python3,不支持 Python2
首先,安裝依賴庫
# 安裝依賴庫
pip3 install zmail
然后,使用郵箱賬號、授權碼創建一個郵箱服務對象
class ZMailObject(object):
def __init__(self):
# 郵箱賬號
self.username='**@126.com'
# 郵箱授權碼
self.authorization_code='授權碼'
# 構建一個郵箱服務對象
self.server=zmail.server(self.username, self.authorization_code)
接著,將郵件主題、郵件內容、包含的附件路徑加入到一個字典中,組成郵件主體
# 郵件主體
mail_body={
'subject': '測試報告',
'content_text': '這是一個測試報告', # 純文本或者HTML內容
'attachments': ['./attachments/report.png'],
}
最后,將調用send_mail()函數,將郵件發送出去即可
# 收件人
# 可以指定一個人,字符串;也可以是多個人,列表
mail_to="收件人1"
# 發送郵件
self.server.send_mail(mail_to, mail_body)
yagmail 只需要幾行代碼,就能實現發送郵件的功能
相比 zmail,yagmail 實現發送郵件的方式更加簡潔優雅
首先,安裝依賴庫
# 安裝依賴庫
pip3 install yagmail
然后,通過賬號、授權碼和服務器地址連接郵箱服務器,返回一個服務對象
import yagmail
# 連接服務器
# 用戶名、授權碼、服務器地址
yag_server=yagmail.SMTP(user='**@126.com', password='授權碼', host='smtp.126.com')
接著,通過 send() 函數,將郵件發送出去
# 發送對象列表
email_to=['**@qq.com', ]
email_title='測試報告'
email_content="這是測試報告的具體內容"
# 附件列表
email_attachments=['./attachments/report.png', ]
# 發送郵件
郵件發送完畢之后,關閉連接即可
# 關閉連接
yag_server.close()
email_by_zmail.py
import zmail
class ZMailObject(object):
def __init__(self):
# 郵箱賬號
self.username='**@126.com'
# 郵箱授權碼
self.authorization_code='授權碼'
# 構建一個郵箱服務對象
self.server=zmail.server(self.username, self.authorization_code)
def send_email(self, mail_to, mail_body):
"""
發送郵件
:param mail_to 發送對象
:param mail: 發送主題、內容及附件
:return:
"""
if self.__check_pop_enable() and self.__check_smtp_enable():
self.server.send_mail(mail_to, mail_body)
else:
pass
def receive_email(self):
"""
接受郵件
:return:
"""
try:
# 接受郵件
last_mail=self.server.get_latest()
# last_mail=self.server.get_mail(2)
# zmail.show(last_mail)
for k, v in last_mail.items():
print(k, v)
except Exception as e:
# 收件箱為空,則會報錯
print('接受異常異常')
def __check_smtp_enable(self):
"""
檢查smtp是否正常
:return:
"""
return self.server.smtp_able()
def __check_pop_enable(self):
"""
檢查pop功能是否正常
:return:
"""
return self.server.pop_able()
if __name__=='__main__':
zmail_obj=ZMailObject()
# 發送內容及附件
mail_to='**@qq.com'
# 郵件主體
mail_body={
'subject': '測試報告',
'content_text': '這是一個測試報告', # 純文本或者HTML內容
'attachments': ['./attachments/report.png'],
}
# 發送郵件
zmail_obj.send_email(mail_to, mail_body)
# 接受郵件
# zmail_obj.receive_email()
email_by_yagmail.py
import yagmail
# 連接服務器
# 用戶名、授權碼、服務器地址
yag_server=yagmail.SMTP(user='**@126.com', password='授權碼', host='smtp.126.com')
# 發送郵件
# 發送對象列表
email_to=['**@qq.com', ]
email_title='測試報告'
email_content="這是測試報告的具體內容"
# 附件列表
email_attachments=['./attachments/report.png', ]
yag_server.send(email_to, email_title, email_content, email_attachments)
# 關閉連接
yag_server.close()
email_by_smtplib.py
*請認真填寫需求信息,我們會在24小時內與您取得聯系。