目錄
發(fā)送郵件
1、準(zhǔn)備工作:
2、發(fā)送純文本信息內(nèi)容:
3、發(fā)送 HTML 格式的內(nèi)容:
4、發(fā)送帶附件的郵件:
5、群發(fā)(一個郵件,發(fā)給多個人):
發(fā)送郵件
??????? 以下都 以 QQ郵箱 為發(fā)送方舉例;
?文章來源地址http://www.zghlxwxcb.cn/news/detail-707399.html
1、準(zhǔn)備工作:
???????? 使用 QQ郵箱發(fā)送郵件,需要到 “設(shè)置”=>“賬號” 中 開啟 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務(wù):
??????? 開啟服務(wù)后,點(diǎn)擊 管理服務(wù):
??????? 然后會跳轉(zhuǎn)到賬號與安全頁面,點(diǎn)擊生成授權(quán)碼以生成授權(quán)碼,并記錄下授權(quán)碼:
參考:
https://wx.mail.qq.com/list/readtemplate?name=app_intro.html#/agreement/authorizationCode
2、發(fā)送純文本信息內(nèi)容:
import smtplib
import time
from email.mime.text import MIMEText
def send_QQ_email_plain():
sender = user = 'sender@qq.com' # 發(fā)送方的郵箱賬號
passwd = 'abcdefgxxxxx' # 授權(quán)碼
receiver = 'receiver@qq.com' # 接收方的郵箱賬號,不一定是QQ郵箱
# 純文本內(nèi)容
msg = MIMEText(f'Python 郵件發(fā)送測試 {time.time()}', 'plain', 'utf-8')
# From 的內(nèi)容是有要求的,前面的abc為自己定義的 nickname,如果是ASCII格式,則可以直接寫
msg['From'] = f'abc <sender@qq.com>'
msg['To'] = receiver
msg['Subject'] = 'Python SMTP 郵件測試' # 點(diǎn)開詳情后的標(biāo)題
try:
# 建立 SMTP 、SSL 的連接,連接發(fā)送方的郵箱服務(wù)器
smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 登錄發(fā)送方的郵箱賬號
smtp.login(user, passwd)
# 發(fā)送郵件 發(fā)送方,接收方,發(fā)送的內(nèi)容
smtp.sendmail(sender, receiver, msg.as_string())
print('郵件發(fā)送成功')
smtp.quit()
except Exception as e:
print(e)
print('發(fā)送郵件失敗')
??????? 對于 msg['Form'] 的要求:
?
??????? 如果自定義的 nickname 是非 ASCII 字符,則直接寫會報錯,如:
msg['From'] = f'好 <sender@qq.com>'
?
??????? 正確的格式為:
msg['From'] = f'=?UTF-8?B?{base64.b64encode("好".encode()).decode()}?= <sender@qq.com>'
??????? 如果接收方是 QQ 郵箱,則前面的 nickname 會顯示在該位置:
??????? 如果不需要自己定義 nickname,也可以直接使用郵箱賬號:
msg['From'] = '12345@qq.com'
??????? 則會顯示郵箱賬號:
?
???????? 點(diǎn)開郵件查看詳情:
?
3、發(fā)送 HTML 格式的內(nèi)容:
import base64
import smtplib
import time
from email.mime.text import MIMEText
def send_QQ_mail_HTML():
user = 'sender@qq.com'
passwd = 'abcdefxxxx'
receiver = 'receiver@qq.com'
# 直接寫
# html_content = '''
# <h1>這個是郵件的內(nèi)容</h1>
# '''
# 讀入 html 文件的內(nèi)容
with open('./for_email.html', mode='r', encoding='utf-8') as f:
html_content = f.read()
# 指定類型是 html
msg = MIMEText(html_content, 'html', 'utf-8')
msg['From'] = user
msg['To'] = receiver
msg['Subject'] = '測試發(fā)送 HTML 內(nèi)容'
try:
smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
smtp.login(user, passwd)
smtp.sendmail(user, receiver, msg.as_string())
print('發(fā)送成功')
except:
print('發(fā)送失敗')
????????for_email.html 的內(nèi)容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
h1{
color: brown;
}
p{
margin: 5px;
color: purple;
}
</style>
</head>
<body>
<h1>這是一個郵件內(nèi)容的標(biāo)頭</h1>
<img src="https://img1.baidu.com/it/u=1890390320,3399874998&fm=253&fmt=auto&app=120&f=JPEG?w=1422&h=800">
<div>
<h3>From合法性檢查</h3>
<p>一、根據(jù)RFC5322協(xié)議,郵件標(biāo)頭中需要包含'From'信息。</p>
<p>二、根據(jù)RFC2047, RFC822協(xié)議,郵件標(biāo)頭中的'From'形式為:</p>
<p>1. 郵箱地址形式:prefix@domain, 如 'abc@qq.com'。</p>
<p>2. 昵稱+空格+<郵箱地址>形式:nickname <prefix@domain>,其中,nickname為ASCII字符集中字符組合或編碼文本:</p>
<p>(1)如果昵稱全為ASCII字符,如'ABC',郵箱地址為'abc@qq.com',則標(biāo)頭中的'From'為'ABC <abc@qq.com>'。
注意'ABC'和'<abc@qq.com>'之間用空格隔開;</p>
<p>(2)如果昵稱包含非ASCII字符,如中文,則請使用base64對昵稱進(jìn)行編碼。nickname最終的形式為
:"=?" charset "?" encoding "?" encoded-text "?="。其中,charset為字符集;
encoding為編碼方式,'B'代表base64;encoded-text為編碼后的文本。例如,昵稱為'QQ郵箱昵稱示例',
郵箱地址為'abc@qq.com',則對昵稱進(jìn)行base64編碼,字符集使用UTF-8,則
nickname為 '=?UTF-8?B?UVHpgq7nrrHmmLXnp7DnpLrkvos=?=',最終郵件標(biāo)頭中的
'From'為'"=?utf-8?B?UVHpgq7nrrHmmLXnp7DnpLrkvos=?=" <abc@qq.com>'。
注意編碼文本和郵件地址間用空格隔開。</p>
</div>
</body>
</html>
?
??????? 該html中含有引用了外鏈的img圖片,如果接收方為QQ郵箱,則默認(rèn)不會顯示圖片:
??????? 如果是其他的郵箱,圖片有可能可以顯示(如企業(yè)微信的郵箱),html 的樣式也可能會丟失不奏效。
4、發(fā)送帶附件的郵件:
import base64
import smtplib
import time
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_QQ_email_mul():
sender = user = 'sender@qq.com'
passwd = 'abcdefghijk' # 不是密碼,是生成的 授權(quán)碼
receiver = 'receiver@qq.com'
content = MIMEMultipart() # 創(chuàng)建一個包含多個部分的內(nèi)容
content['From'] = user
content['To'] = receiver
content['Subject'] = 'Test Email'
# 添加文本內(nèi)容
# text = MIMEText('this is a test email.', 'plain', 'utf-8')
# content.attach(text)
# 添加html內(nèi)容
with open('./for_email.html', mode='r', encoding='utf-8') as f:
html_content = f.read()
msg = MIMEText(html_content, 'html', 'utf-8')
content.attach(msg)
# 添加附件
with open('./data.xlsx', 'rb') as f:
attachment = MIMEApplication(f.read()) # 讀取為附件
attachment.add_header('Content-Disposition', 'attachment', filename='data.xlsx')
content.attach(attachment)
try:
smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
smtp.login(user, passwd)
smtp.sendmail(sender, receiver, content.as_string())
print('郵件發(fā)送成功')
except Exception as e:
print(e)
print('發(fā)送郵件失敗')
5、群發(fā)(一個郵件,發(fā)給多個人):
??????? 將 receiver 寫成每個人的郵箱賬號數(shù)組即可
import base64
import smtplib
import time
from email.mime.text import MIMEText
def send_QQ_mail():
sender = user = '12345@qq.com'
passwd = 'ABCD'
# 寫成數(shù)組,將發(fā)給這三者
receiver = ['abcdef@qq.com','aaa@xxx.edu.cn','abcd@gmail.com']
msg = MIMEText(f'Python 郵件發(fā)送測試 {time.time()}', 'plain', 'utf-8')
msg['From'] = f'=?UTF-8?B?{base64.b64encode("好".encode()).decode()}?= <sender@qq.com>'
msg['To'] = 'you' # 每個人都會看到這個內(nèi)容
msg['Subject'] = 'Python SMTP 郵件測試' # 點(diǎn)開詳情后的標(biāo)題
try:
# 建立 SMTP 、SSL 的連接
smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 登錄
smtp.login(user, passwd)
# 發(fā)送郵件 發(fā)送方,接收方,發(fā)送的內(nèi)容
smtp.sendmail(sender, receiver, msg.as_string())
print('郵件發(fā)送成功')
smtp.quit()
except Exception as e:
print(e)
print('發(fā)送郵件失敗')
?文章來源:http://www.zghlxwxcb.cn/news/detail-707399.html
?
到了這里,關(guān)于python 學(xué)習(xí)筆記(5)——SMTP 使用QQ郵箱發(fā)送郵件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!