Python 第17關(guān)——郵件還能這樣發(fā)(QQ郵箱)!

完成一個項目的流程

1.明確項目目標(biāo)
2.分解過程、拆解項目
3.逐步執(zhí)行、代碼實現(xiàn)

  1. 目標(biāo):Python群發(fā)郵件
  2. 目標(biāo):學(xué)會學(xué)習(xí)新模塊
    掌握【學(xué)習(xí)模塊的方式】→掌握學(xué)習(xí)新知識的方式
版本1.0:學(xué)習(xí)模塊,發(fā)一封簡單郵件
  • 學(xué)習(xí)方法引導(dǎo):
    搜索關(guān)鍵詞“發(fā)送郵件 python”,找到解決方案→先縱觀搜索出來的內(nèi)容,找共同點(比如可以知道1.Python可以解決這個問題;2.方法是smtplib,email這兩個模塊。smtplib是用來發(fā)送郵件用的,email是用來構(gòu)建郵件內(nèi)容的。這兩個都是Python內(nèi)置模塊)→學(xué)習(xí)這兩個模塊

  • 學(xué)習(xí)模塊——smtplib模塊
    1.搜 ‘smtplib python’(高手使用,因為會進官方網(wǎng)站)
    2.搜 ‘smtplib 教程 ’(新手使用,比較友好)
    多比較幾個文檔,對于重復(fù)部分多的代碼,就是你要找的內(nèi)容。

    • 注意在搜索時,關(guān)鍵詞越多越準(zhǔn)確,可以使用+或空格連接或and連接關(guān)鍵詞
import smtplib    #引入smtplib模塊

server = smtplib.SMTP()    #server是一個變量,smtplib.SMTP()是變量server的值,若不知道SMTP,
#可以在本地編輯器中按住Ctrl鍵并點擊SMTP ,會看到對SMTP的解釋
server.connect(host, port)    #連接(connect)指定的服務(wù)器,host是指定連接的郵箱服務(wù)器;port 是“端口”的意思,一般情況下SMTP默認端口號為25。
#如果25行不通,你可以通過搜索或者去郵箱設(shè)置里面查看端口。比如,如果我打算用自己的企業(yè)郵箱來發(fā)郵件,登錄郵箱后,在【設(shè)置-選項-POP和IMAP】查看端口數(shù)字
#QQ 郵箱一般默認關(guān)閉SMTP服務(wù),我們得先去開啟它:登錄你的郵箱。然后點擊位于頂部的【設(shè)置】按鈕,選擇【賬戶設(shè)置】開啟
server.login(username, password)  #username:登錄郵箱的用戶 password:授權(quán)碼(在【賬戶】處獲得,用此碼登錄,而不是你的qq郵箱登錄密碼)
server.sendmail(sender, to_addr, msg.as_string()) #sendmail是“發(fā)送郵件”的意思
#是發(fā)送郵件用的,sendmail()方法需要三個參數(shù):發(fā)件人,收件人和郵件內(nèi)容
#from_addr:郵件發(fā)送地址,就是上面的username
#to_addr:郵件收件人地址
#msg.as_string():為一個字符串類型 
server.quit()   #quit是“退出”的意思,就是退出服務(wù)器
  • 學(xué)習(xí)模塊——email模塊
from email.mime.text import MIMEText  #內(nèi)容形式為純文本、HTML頁面
from email.mime.image import MIMEImage   #內(nèi)容形式為圖片
from email.mime.multipart import MIMEMultipart     #多形式組合,可包含文本和附件
MIMEText(msg,type,chartset)
# msg:文本內(nèi)容,可自定義
# type:文本類型,默認為plain(純文本)
# chartset:文本編碼,中文為“utf-8”
#文本類型和文本編碼,我們默認用'plain'和'utf-8'
  • 建議的代碼結(jié)構(gòu)
    1.導(dǎo)入模塊:smtplib模塊 和 email 模塊
    2.定義變量:包括發(fā)件人、密碼、收件人、正文內(nèi)容、服務(wù)器
    3.使用方法:連接、登錄、發(fā)送、退出
#  1.導(dǎo)入模塊

# smtplib 用于郵件的發(fā)信動作
import smtplib
from email.mime.text import MIMEText  # email 用于構(gòu)建郵件內(nèi)容

# 2.定義變量:

# 發(fā)信方的信息:發(fā)信郵箱,QQ 郵箱授權(quán)碼
from_addr = 'xxx@qq.com'
password = '你的授權(quán)碼數(shù)字'

# 收信方郵箱
to_addr = 'xxx@qq.com'

# 發(fā)信服務(wù)器
smtp_server = 'smtp.qq.com'

# 郵箱正文內(nèi)容,第一個參數(shù)為內(nèi)容,第二個參數(shù)為格式(plain 為純文本),第三個參數(shù)為編碼
msg = MIMEText('send by python','plain','utf-8')


# 3.使用方法:

# 開啟發(fā)信服務(wù),這里使用的是加密傳輸
server = smtplib.SMTP_SSL()
server.connect(smtp_server,465)
# 登錄發(fā)信郵箱
server.login(from_addr, password)
# 發(fā)送郵件
server.sendmail(from_addr, to_addr, msg.as_string())
# 關(guān)閉服務(wù)器
server.quit()

常見報錯信息:ValueError: server_hostname cannot be an empty string or start with a leading dot.
解決辦法:server = smtplib.SMTP_SSL()改成server = smtplib.SMTP_SSL(smtp_server)

版本2.0:給自己發(fā)一封完整郵件

1.豐富文件頭

  • 包括主題、發(fā)件人、收件人等信息
    方法:搜索“發(fā)郵件 Python”,看別人的代碼是怎么樣寫的
from email.header import Header

msg['From'] = Header('xxx')    #發(fā)件人郵箱地址/也可自定義其他內(nèi)容
msg['To'] = Header('xxx')         #收件人郵箱地址/也可自定義其他內(nèi)容
msg['Subject'] = Header('xxx')    #郵件主題

2.豐富正文內(nèi)容

  • 如果你想要寫很長的內(nèi)容,建議先設(shè)置一個變量text用來放正文內(nèi)容,
  • 正文需要換行,這時用到了三引號的用法啦
    例如:
text = '''親愛的學(xué)員,你好!
?    我是吳楓老師,能遇見你很開心。
?    希望學(xué)習(xí)Python對你不是一件困難的事情!

人生苦短,我用Python
'''
msg = MIMEText(text,'plain','utf-8')
版本3.0:群發(fā)完整郵件
  • 設(shè)置一個列表形式的變量
    1.將收件人信箱的變量設(shè)置成一個可以裝多個內(nèi)容的列表
    例如:
to_addrs = ['wufeng@qq.com','kaxi@qq.com']

2.然而列表不能解碼,只能變成字符串形式(使用join()函數(shù)

msg['to'] = Header(",".join(to_addrs)) 

join()的用法是str.join(sequence),str代表在這些字符串之中你要用什么字符串來連接,你可以用逗號,空格,下劃線等等,sequence可以是列表等

  • 使用while循環(huán)
    1.定義一個空列表to_addrs,用來存放收件人郵箱地址
    2.輸入郵箱地址的時候,地址會被追加寫進列表
to_addrs = []
while True:
    a=input('請輸入收件人郵箱:')
    #輸入收件人郵箱
    to_addrs.append(a)
    #寫入列表
    b=input('是否繼續(xù)輸入,n退出,任意鍵繼續(xù):')
    #詢問是否繼續(xù)輸入
    if b == 'n':
        break

print(to_addrs)
  • while True: 只要不遇到break,就會一直循環(huán)下去。
  • 寫入csv模塊
    步驟:1.引入csv模塊;2.提供需要寫入csv文件的數(shù)據(jù),3.建文件并寫入。
import csv     # 引用csv模塊,用于讀取郵箱信息
data = [['wufeng ', 'wufeng@qq.com'],['kaxi', 'kaxi@qq.com']] # 待寫入csv文件的收件人數(shù)據(jù):人名+郵箱 

with open('to_addrs.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    for row in data:
        writer.writerow(row)

# 讀取收件人數(shù)據(jù),并啟動寫信和發(fā)信流程
with open('to_addrs.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader: 
        to_addrs=row[1]
        msg = MIMEText(text,'plain','utf-8')      #這些要都寫到for循環(huán)下
        msg['From'] = Header(from_addr)
        msg['To'] = Header(to_addrs)
        msg['Subject'] = Header('python test')
        server = smtplib.SMTP_SSL()
        server.connect(smtp_server,465)
        server.login(from_addr, password)
        server.sendmail(from_addr, to_addrs, msg.as_string())

# 關(guān)閉服務(wù)器
server.quit()



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容