Python調(diào)用工具包實現(xiàn)發(fā)送郵件服務(wù)
1.概述
這篇文章主要介紹python調(diào)用工具包實現(xiàn)發(fā)送郵件服務(wù)。在第二篇文章中介紹封裝郵件服務(wù)工具類,該工具類將可以應(yīng)用到其他的項目中。
2.郵件模塊介紹
python內(nèi)置了發(fā)送郵件的模塊,因此不需要單獨安裝。
- smtplib 模塊負責(zé)發(fā)送郵件
- email 模塊負責(zé)格式化郵件內(nèi)容樣式
2.1. 建立連接類型
當(dāng)使用smtplib模塊建立發(fā)送郵件連接時可以分為非安全和安全連接兩種方式。
安全連接: 當(dāng)python使用smtplib模塊調(diào)用郵箱服務(wù)端發(fā)送郵件過程,傳輸層使用了SSL加密,避免了明文傳遞郵件內(nèi)容,通過攔截請求獲取郵件內(nèi)容和登錄賬號密碼。
非安全連接:郵箱服務(wù)端采用明文發(fā)送郵件,通過連接請求可以獲取郵件內(nèi)容和登錄賬號密碼。
3.發(fā)送郵件
使用python發(fā)送郵件之前,需要登錄郵箱開啟SMTP服務(wù)才可以發(fā)送郵件。每家的郵箱開啟入口不同,開啟方式搜索具體產(chǎn)品的郵箱。
3.1.發(fā)送非安全連接郵件
建立非安全連接郵箱服務(wù)端默認使用25端口發(fā)送郵件。
import smtplib
from email.mime.text import MIMEText
#設(shè)置服務(wù)器所需信息
#郵箱服務(wù)器地址
mail_host = 'mail.******.com'
#郵箱登錄用戶名
mail_user = '******@qq.com'
#密碼(部分郵箱為授權(quán)碼)
mail_pass = '123456'
#郵件發(fā)送方郵箱地址
sender = '******@qq.com'
#郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發(fā)
receivers = ['32321232@qq.com']
#設(shè)置email信息
#郵件內(nèi)容設(shè)置
message = MIMEText('content','plain','utf-8')
#郵件主題
message['Subject'] = 'title'
#發(fā)送方信息
message['From'] = sender
#接受方信息
message['To'] = receivers[0]
#登錄并發(fā)送郵件
try:
# 建立非安全連接smtplib.SMTP()
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host,25)
#登錄到服務(wù)器
smtpObj.login(mail_user,mail_pass)
#發(fā)送
smtpObj.sendmail(
sender,receivers,message.as_string())
#退出
smtpObj.quit()
print('success')
except smtplib.SMTPException as e:
print('error',e) #打印錯誤3.2.發(fā)送安全連接郵件
建立非安全連接郵箱服務(wù)端默認使用465端口發(fā)送郵件。
import smtplib
from email.mime.text import MIMEText
#設(shè)置服務(wù)器所需信息
#郵箱服務(wù)器地址
mail_host = 'mail.******.com'
#郵箱登錄用戶名
mail_user = '******@qq.com'
#密碼(部分郵箱為授權(quán)碼)
mail_pass = '123456'
#郵件發(fā)送方郵箱地址
sender = '******@qq.com'
#郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發(fā)
receivers = ['32321232@qq.com']
#設(shè)置email信息
#郵件內(nèi)容設(shè)置
message = MIMEText('content','plain','utf-8')
#郵件主題
message['Subject'] = 'title'
#發(fā)送方信息
message['From'] = sender
#接受方信息
message['To'] = receivers[0]
# 登錄并發(fā)送郵件
# 建立安全連接SMTP_SSL,注意端口號默認使用465
with smtplib.SMTP_SSL(mail_host, timeout=10, port=465) as smtpObj:
try:
# 登錄到服務(wù)器
smtpObj.login(mail_user, mail_pass)
# 發(fā)送
smtpObj.sendmail(
sender, receivers, message.as_string())
print('success')
except Exception as e:
print(e)在使用安全連接發(fā)送郵件時可能會拋出下面的異常,這個異常的含義是Python端與郵箱服務(wù)端建立連接SSL版本號不對。
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:997)
這個異常出現(xiàn)的原因:
發(fā)送郵件的郵箱服務(wù)端沒有開啟SSL或者不支持,這種清空可以登錄郵箱服務(wù)端確認,如果不支持只能使用非安全建立連接。
端口號錯誤造成,郵箱服務(wù)端模式使用465端口號連接SSL連接,如果python端設(shè)置的端口號與郵箱服務(wù)端端口號不一致建立連接也會報上面的異常。
4.設(shè)置郵件內(nèi)容格式
python內(nèi)置的email模塊負責(zé)設(shè)置郵件內(nèi)容格式,它包含三個模塊對應(yīng)郵件三種類型的格式。下面具體介紹他們的區(qū)別。
from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart
4.1.郵件文本三種類型
1.MIMEText文本類型
發(fā)送普通的文本郵件內(nèi)容,MIMEText對象中有三個需要我們設(shè)置的參數(shù),一個是正文內(nèi)容,一個是正文內(nèi)容的類型,例如:”text/plain”和”text/html”,一個是正文內(nèi)容的編碼。
plain構(gòu)造普通文本
# 文本內(nèi)容 text_info = 'hello world ' # 構(gòu)造普通文本對象,包含三個參數(shù),郵件內(nèi)容,類型,編碼 text_sub = MIMEText(text_info,'plain', 'utf-8')
完整代碼
import smtplib
from email.mime.text import MIMEText
# 創(chuàng)建郵件連接
def create_email_connect(mail_host, timeout, port):
try:
return smtplib.SMTP_SSL(host=mail_host, timeout=timeout, port=port)
except Exception as e:
print(e)
# 構(gòu)建郵件內(nèi)容模板
def email_content():
# 郵件內(nèi)容設(shè)置
text_info = 'hello world '
message = MIMEText(text_info, 'plain', 'utf-8')
# 郵件主題
message['Subject'] = 'title'
# 發(fā)送方信息
message['From'] = sender_account
# 接受方信息
message['To'] = receivers_account[0]
return message
def sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account, timeout=10, port=465):
with create_email_connect(mail_host, timeout, port) as smtpObj:
try:
smtpObj.login(mail_user, mail_pass)
# 發(fā)送郵件
smtpObj.sendmail(
sender_account, receivers_account, email_content().as_string())
print('scusses')
except Exception as e:
print(e)
if __name__ == '__main__':
# 設(shè)置服務(wù)器所需信息
# 163郵箱服務(wù)器地址
mail_host = 'smtp.163.com'
# 163用戶名
mail_user = '******@163.com'
# 密碼(部分郵箱為授權(quán)碼)
mail_pass = '******'
# 郵件發(fā)送方郵箱地址
sender_account = '******@163.com'
# 郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發(fā)
receivers_account = ['******@qq.com']
sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account)構(gòu)造html文本
# 郵件內(nèi)容
url = "https://xxxxx.com"
html_info = """
<p>點擊以下鏈接,查看郵件詳情</p>
<p><a href="%s">click me</a></p>
<p>i am very glasses for you</p>
""" % url
# 構(gòu)建郵件類型html對象
html_sub = MIMEText(html_info, 'html', 'utf-8')
# 如果不加下邊這行代碼的話,上邊的文本是不會正常顯示的,會把超文本的內(nèi)容當(dāng)做文本顯示
html_sub["Content-Disposition"] = 'attachment; filename="email.html"'構(gòu)造base64數(shù)據(jù)流,用于發(fā)送文件的時候使用,構(gòu)造附件代碼
txt_file = open(r'D:\python_files\files\hello_world.txt', 'rb').read()
txt = MIMEText(txt_file, 'base64', 'utf-8')
txt["Content-Type"] = 'application/octet-stream'
# 命名發(fā)送的附件
txt.add_header('Content-Disposition', 'attachment', filename='hello_world.txt')2.MIMEImage圖片類型
構(gòu)造圖片類型對象
image_file = open(r'D:\python_files\images\test.png', 'rb').read()
image = MIMEImage(image_file)
image.add_header('Content-ID', '<image1>')
# 命名發(fā)送的圖片
image["Content-Disposition"] = 'attachment; filename="red_people.png"'完整代碼
import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
# 創(chuàng)建郵件連接
def create_email_connect(mail_host, timeout, port):
try:
return smtplib.SMTP_SSL(host=mail_host, timeout=timeout, port=port)
except Exception as e:
print(e)
# 構(gòu)建郵件內(nèi)容模板
def email_content():
# 郵件內(nèi)容設(shè)置
image_file = open(r'./白玉堂.jpg', 'rb').read()
message = MIMEImage(image_file)
# 命名發(fā)送的圖片
message["Content-Disposition"] = 'attachment; filename="red_people.png"'
# 郵件主題
message['Subject'] = 'title'
# 發(fā)送方信息
message['From'] = sender_account
# 接受方信息
message['To'] = receivers_account[0]
return message
def sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account, timeout=10, port=465):
with create_email_connect(mail_host, timeout, port) as smtpObj:
try:
smtpObj.login(mail_user, mail_pass)
# 發(fā)送郵件
smtpObj.sendmail(
sender_account, receivers_account, email_content().as_string())
print('scusses')
except Exception as e:
print(e)
if __name__ == '__main__':
# 設(shè)置服務(wù)器所需信息
# 163郵箱服務(wù)器地址
mail_host = 'smtp.163.com'
# 163用戶名
mail_user = '******@163.com'
# 密碼(部分郵箱為授權(quán)碼)
mail_pass = '******'
# 郵件發(fā)送方郵箱地址
sender_account = '******@163.com'
# 郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發(fā)
receivers_account = ['******@qq.com']
sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account)3.MIMEMultipart
對象創(chuàng)建的類型有三種,此模塊主要是通過attach方法把上邊構(gòu)造的內(nèi)容傳入到郵件的整體內(nèi)容中
郵件類型為”multipart/alternative”的郵件正文中包括純文本正文(text/plain)和超文本正文(text/html)。
郵件類型為”multipart/related”的郵件正文中包括圖片,聲音等內(nèi)嵌資源。
郵件類型為”multipart/mixed”的郵件包含附件,圖片,文本等都可以添加,所以發(fā)的內(nèi)容多的話一般是用這個的,選擇mixed類型,什么內(nèi)容都可以發(fā)。
MIMEMultipart使用方法
MIMEMultipart(‘mixed’).attach(MIMEText或者MIMEImage對象),因為MIMEMultipart對象代表郵件本身,把其他的構(gòu)造內(nèi)容添加到MIMEMultipart對象中就可以把文本,html,附件等一起發(fā)送。
構(gòu)造圖片類型內(nèi)容
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# 創(chuàng)建郵件連接
def create_email_connect(mail_host, timeout, port):
try:
return smtplib.SMTP_SSL(host=mail_host, timeout=timeout, port=port)
except Exception as e:
print(e)
# 構(gòu)建郵件內(nèi)容模板
def email_content():
# 郵件內(nèi)容設(shè)置
image_file = open(r'./白玉堂.jpg', 'rb').read()
# 創(chuàng)建MIMEImage類型對象
mimei_image = MIMEImage(image_file)
message = MIMEMultipart('mixed')
# attach包裝MIMEImage對象
message.attach(mimei_image)
# 命名發(fā)送的圖片
message["Content-Disposition"] = 'attachment; filename="red_people.png"'
# 郵件主題
message['Subject'] = 'title'
# 發(fā)送方信息
message['From'] = sender_account
# 接受方信息
message['To'] = receivers_account[0]
return message
def sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account, timeout=10, port=465):
with create_email_connect(mail_host, timeout, port) as smtpObj:
try:
smtpObj.login(mail_user, mail_pass)
# 發(fā)送郵件
smtpObj.sendmail(
sender_account, receivers_account, email_content().as_string())
print('scusses')
except Exception as e:
print(e)
if __name__ == '__main__':
# 設(shè)置服務(wù)器所需信息
# 163郵箱服務(wù)器地址
mail_host = 'smtp.163.com'
# 163用戶名
mail_user = '******@163.com'
# 密碼(部分郵箱為授權(quán)碼)
mail_pass = '******'
# 郵件發(fā)送方郵箱地址
sender_account = '******@163.com'
# 郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發(fā)
receivers_account = ['******@qq.com']
sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account)構(gòu)造普通類型發(fā)送附件郵件
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# 創(chuàng)建郵件連接
def create_email_connect(mail_host, timeout, port):
try:
return smtplib.SMTP_SSL(host=mail_host, timeout=timeout, port=port)
except Exception as e:
print(e)
# 構(gòu)建郵件內(nèi)容模板
def email_content():
# 郵件內(nèi)容設(shè)置
text_file = open(r'./白玉堂.jpg', 'rb').read()
# 創(chuàng)建MIMEImage類型對象
mime_obj = MIMEText(text_file, 'base64', 'utf-8')
# 命名發(fā)送的圖片
mime_obj.add_header('Content-Disposition', 'attachment', filename='red_people.jpg')
mime_obj.add_header('Content-Type', 'application/octet-stream')
# 構(gòu)建mime對象
message = MIMEMultipart('mixed')
# attach包裝MIMEImage對象
message.attach(mime_obj)
# 郵件主題
message['Subject'] = '測試郵件'
# 發(fā)送方信息
message['From'] = sender_account
# 接受方信息
message['To'] = receivers_account[0]
return message
def sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account, timeout=10, port=465):
with create_email_connect(mail_host, timeout, port) as smtpObj:
try:
smtpObj.login(mail_user, mail_pass)
# 發(fā)送郵件
smtpObj.sendmail(
sender_account, receivers_account, email_content().as_string())
print('scusses')
except Exception as e:
print(e)
if __name__ == '__main__':
# 設(shè)置服務(wù)器所需信息
# 163郵箱服務(wù)器地址
mail_host = 'smtp.163.com'
# 163用戶名
mail_user = '******@163.com'
# 密碼(部分郵箱為授權(quán)碼)
mail_pass = '******'
# 郵件發(fā)送方郵箱地址
sender_account = '******@163.com'
# 郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發(fā)
receivers_account = ['******@qq.com']
sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account)到此這篇關(guān)于Python調(diào)用工具包實現(xiàn)發(fā)送郵件服務(wù)的文章就介紹到這了,更多相關(guān)Python發(fā)送郵件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Elasticsearch映射字段數(shù)據(jù)類型及管理
這篇文章主要介紹了Elasticsearch映射字段數(shù)據(jù)類型及管理的講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04
Python使用plt庫實現(xiàn)繪制動態(tài)曲線圖并導(dǎo)出為GIF或MP4
這篇文章主要為大家詳細介紹了Python如何使用plt庫實現(xiàn)繪制動態(tài)曲線圖并導(dǎo)出為GIF或MP4,文中的示例代碼講解詳細,需要的可以了解一下2024-03-03
pycharm 使用tab跳出正在編輯的括號(){}{}等問題
這篇文章主要介紹了pycharm 使用tab跳出正在編輯的括號(){}{}等問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02

