Python調用工具包實現發(fā)送郵件服務
1.概述
這篇文章主要介紹python調用工具包實現發(fā)送郵件服務。在第二篇文章中介紹封裝郵件服務工具類,該工具類將可以應用到其他的項目中。
2.郵件模塊介紹
python內置了發(fā)送郵件的模塊,因此不需要單獨安裝。
- smtplib 模塊負責發(fā)送郵件
- email 模塊負責格式化郵件內容樣式
2.1. 建立連接類型
當使用smtplib模塊建立發(fā)送郵件連接時可以分為非安全和安全連接兩種方式。
安全連接: 當python使用smtplib模塊調用郵箱服務端發(fā)送郵件過程,傳輸層使用了SSL加密,避免了明文傳遞郵件內容,通過攔截請求獲取郵件內容和登錄賬號密碼。
非安全連接:郵箱服務端采用明文發(fā)送郵件,通過連接請求可以獲取郵件內容和登錄賬號密碼。
3.發(fā)送郵件
使用python發(fā)送郵件之前,需要登錄郵箱開啟SMTP服務才可以發(fā)送郵件。每家的郵箱開啟入口不同,開啟方式搜索具體產品的郵箱。
3.1.發(fā)送非安全連接郵件
建立非安全連接郵箱服務端默認使用25端口發(fā)送郵件。
import smtplib from email.mime.text import MIMEText #設置服務器所需信息 #郵箱服務器地址 mail_host = 'mail.******.com' #郵箱登錄用戶名 mail_user = '******@qq.com' #密碼(部分郵箱為授權碼) mail_pass = '123456' #郵件發(fā)送方郵箱地址 sender = '******@qq.com' #郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發(fā) receivers = ['32321232@qq.com'] #設置email信息 #郵件內容設置 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) #登錄到服務器 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ā)送安全連接郵件
建立非安全連接郵箱服務端默認使用465端口發(fā)送郵件。
import smtplib from email.mime.text import MIMEText #設置服務器所需信息 #郵箱服務器地址 mail_host = 'mail.******.com' #郵箱登錄用戶名 mail_user = '******@qq.com' #密碼(部分郵箱為授權碼) mail_pass = '123456' #郵件發(fā)送方郵箱地址 sender = '******@qq.com' #郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發(fā) receivers = ['32321232@qq.com'] #設置email信息 #郵件內容設置 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: # 登錄到服務器 smtpObj.login(mail_user, mail_pass) # 發(fā)送 smtpObj.sendmail( sender, receivers, message.as_string()) print('success') except Exception as e: print(e)
在使用安全連接發(fā)送郵件時可能會拋出下面的異常,這個異常的含義是Python端與郵箱服務端建立連接SSL版本號不對。
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:997)
這個異常出現的原因:
發(fā)送郵件的郵箱服務端沒有開啟SSL或者不支持,這種清空可以登錄郵箱服務端確認,如果不支持只能使用非安全建立連接。
端口號錯誤造成,郵箱服務端模式使用465端口號連接SSL連接,如果python端設置的端口號與郵箱服務端端口號不一致建立連接也會報上面的異常。
4.設置郵件內容格式
python內置的email模塊負責設置郵件內容格式,它包含三個模塊對應郵件三種類型的格式。下面具體介紹他們的區(qū)別。
from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart
4.1.郵件文本三種類型
1.MIMEText文本類型
發(fā)送普通的文本郵件內容,MIMEText對象中有三個需要我們設置的參數,一個是正文內容,一個是正文內容的類型,例如:”text/plain”和”text/html”,一個是正文內容的編碼。
plain構造普通文本
# 文本內容 text_info = 'hello world ' # 構造普通文本對象,包含三個參數,郵件內容,類型,編碼 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) # 構建郵件內容模板 def email_content(): # 郵件內容設置 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__': # 設置服務器所需信息 # 163郵箱服務器地址 mail_host = 'smtp.163.com' # 163用戶名 mail_user = '******@163.com' # 密碼(部分郵箱為授權碼) mail_pass = '******' # 郵件發(fā)送方郵箱地址 sender_account = '******@163.com' # 郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發(fā) receivers_account = ['******@qq.com'] sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account)
構造html文本
# 郵件內容 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 # 構建郵件類型html對象 html_sub = MIMEText(html_info, 'html', 'utf-8') # 如果不加下邊這行代碼的話,上邊的文本是不會正常顯示的,會把超文本的內容當做文本顯示 html_sub["Content-Disposition"] = 'attachment; filename="email.html"'
構造base64數據流,用于發(fā)送文件的時候使用,構造附件代碼
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圖片類型
構造圖片類型對象
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) # 構建郵件內容模板 def email_content(): # 郵件內容設置 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__': # 設置服務器所需信息 # 163郵箱服務器地址 mail_host = 'smtp.163.com' # 163用戶名 mail_user = '******@163.com' # 密碼(部分郵箱為授權碼) 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方法把上邊構造的內容傳入到郵件的整體內容中
郵件類型為”multipart/alternative”的郵件正文中包括純文本正文(text/plain)和超文本正文(text/html)。
郵件類型為”multipart/related”的郵件正文中包括圖片,聲音等內嵌資源。
郵件類型為”multipart/mixed”的郵件包含附件,圖片,文本等都可以添加,所以發(fā)的內容多的話一般是用這個的,選擇mixed類型,什么內容都可以發(fā)。
MIMEMultipart使用方法
MIMEMultipart(‘mixed’).attach(MIMEText或者MIMEImage對象),因為MIMEMultipart對象代表郵件本身,把其他的構造內容添加到MIMEMultipart對象中就可以把文本,html,附件等一起發(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) # 構建郵件內容模板 def email_content(): # 郵件內容設置 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__': # 設置服務器所需信息 # 163郵箱服務器地址 mail_host = 'smtp.163.com' # 163用戶名 mail_user = '******@163.com' # 密碼(部分郵箱為授權碼) mail_pass = '******' # 郵件發(fā)送方郵箱地址 sender_account = '******@163.com' # 郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發(fā) receivers_account = ['******@qq.com'] sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account)
構造普通類型發(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) # 構建郵件內容模板 def email_content(): # 郵件內容設置 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') # 構建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__': # 設置服務器所需信息 # 163郵箱服務器地址 mail_host = 'smtp.163.com' # 163用戶名 mail_user = '******@163.com' # 密碼(部分郵箱為授權碼) mail_pass = '******' # 郵件發(fā)送方郵箱地址 sender_account = '******@163.com' # 郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發(fā) receivers_account = ['******@qq.com'] sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account)
到此這篇關于Python調用工具包實現發(fā)送郵件服務的文章就介紹到這了,更多相關Python發(fā)送郵件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python使用plt庫實現繪制動態(tài)曲線圖并導出為GIF或MP4
這篇文章主要為大家詳細介紹了Python如何使用plt庫實現繪制動態(tài)曲線圖并導出為GIF或MP4,文中的示例代碼講解詳細,需要的可以了解一下2024-03-03pycharm 使用tab跳出正在編輯的括號(){}{}等問題
這篇文章主要介紹了pycharm 使用tab跳出正在編輯的括號(){}{}等問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02