發郵件
smtplib模塊主要負責發送郵件
email模塊主要負責構造郵件。這兩個都是Python內置模塊
smtplib.SMTP.方法
#按住Ctrl鍵並點擊SMTP ,會看到對SMTP的解釋(vscode編輯器)

import smtplib
server = smtplib.SMTP()
#server = smtplib.SMTP_SSL()
#如果端口是用SSL加密,請這樣寫代碼。其中server是變量名
server.connect(host, port)
#如果出現編碼錯誤UnicodeDecodeError,你可以這樣寫:server.connect('smtp.qq.com', 465,'utf-8')
server.login(username, password)
server.sendmail(from_addr, to_addr, msg.as_string())
#from_addr:郵件發送地址,就是上面的username
#to_addr:郵件收件人地址
#msg.as_string():為一個字符串類型
server.quit()
email模塊

導入形式
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
“模塊”和“包”的區別,
模塊(module)一般是一個文件,
包(package)是一個目錄,一個包中可以包含很多個模塊
Python中的包都必須默認包含一個init.py的文件。
init.py控制着包的導入行為。
假如這個文件為空,那么我們僅僅導入包的話,就什么都做不了。
所以直接import email是行不通的。
使用from … import …語句,從email包目錄下的【某個文件】引入【需要的對象】
from email.mime.text import MIMEText
email包下的text文件中引入MIMEText方法
MIMEText(msg,type,chartset)
三個參數
# msg:文本內容,可自定義
# type:文本類型,默認為plain(純文本)
# chartset:文本編碼,中文為“utf-8”
++++++++++++++++++++++++++++++++++++++++
郵件頭 包括主題、發件人、收件人等信息
email包引入Header()方法。Header()是用來構建郵件頭
from email.header import Header
#郵件頭可自定義
1 msg['From'] = Header('xxx') #from收件人郵箱地址 msg['From'] = Header('cool') 2 msg['To'] = Header('xxx') #to發件人郵箱地址 msg['To'] = Header('小可愛') 3 msg['Subject'] = Header('xxx') #主題 msg['Subject'] = Header('來自cool的問候')
郵件內容
先設置一個變量text用來放正文內容
1 text = 'send by python' 2 msg = MIMEText(text,'plain','utf-8')
群發郵件

A 設置一個列表形式的變量
將收件人信箱的變量設置成一個可以裝多個內容的列表
1 to_addrs = ['wu@qq.com','kaxi@qq.com'] 2 msg['To'] = Header(to_addrs) 3 #直接運行程序的話,這里就會發生錯誤:AttributeError: 'list' object has no attribute 'decode'。 4 #因為Header接受的第一個參數的數據類型必須要是字符串或者字節,列表不能解碼 5 6 #使用join()函數,它的功能是把字符串合並 7 print(type(['wu@qq.com','kaxi@qq.com'])) 8 print(type(",".join(to_addrs))) 9 <class 'list'> 10 <class 'str'>
msg['to'] = Header(",".join(to_addrs))
B while 群發郵件
1 to_addrs = [] 2 while True: 3 a=input('請輸入收件人郵箱:') 4 #輸入收件人郵箱 5 to_addrs.append(a) 6 #寫入列表 7 b=input('是否繼續輸入,n退出,任意鍵繼續:') 8 #詢問是否繼續輸入 9 if b == 'n': 10 break 11 #print(to_addrs)
C 調用csv模塊
將收件人郵箱寫入csv文件,在發郵件時讀取csv文件
1.引入csv模塊;2.提供需要寫入csv文件的數據,3.建文件並寫入
1 import csv 2 #引用csv模塊。 3 4 data = [['wu ', 'wu@qq.com'],['kaxi', 'kaxi@qq.com']] 5 #待寫入csv文件的內容 6 7 with open('to_addrs.csv', 'w', newline='') as f: 8 writer = csv.writer(f) 9 for row in data: 10 writer.writerow(row)
讀取
1.引入csv模塊;2.打開csv文件;3.讀取需要的數據
1 import csv 2 #引用csv模塊。 3 4 with open('to_addrs.csv', 'r') as f: 5 reader = csv.reader(f) 6 for row in reader: 7 to_addrs=row[1]
列子:


1 import smtplib 2 # smtplib 用於郵件的發信動作 3 from email.mime.text import MIMEText 4 # email 用於構建郵件內容 5 from email.header import Header 6 # 用於構建郵件頭 7 import csv 8 # 引用csv模塊,用於讀取郵箱信息 9 10 # 發信方的信息:發信郵箱,QQ郵箱授權碼 11 # 方便起見,你也可以直接賦值 12 from_addr = input('請輸入登錄郵箱:') 13 password = input('請輸入郵箱授權碼或者密碼:') 14 15 # 發信服務器 16 smtp_server = 'smtp.exmail.qq.com' 17 18 # 郵件內容 19 text='''親愛的學員,你好! 20 我是吳老師,能遇見你很開心。 21 希望學習python對你不是一件困難的事情! 22 23 人生苦短,我用Python 24 ''' 25 26 # 待寫入csv文件的收件人數據:人名+郵箱 27 # 記得替換成你要發送的名字和郵箱 28 data = [['qy ', '123456@qq.com'],['lxz_jy', '654321@qq.com']] 29 30 # 寫入收件人數據 31 with open('to_addrs.csv', 'w', newline='') as f: 32 writer = csv.writer(f) 33 for row in data: 34 writer.writerow(row) 35 36 # 讀取收件人數據,並啟動寫信和發信流程 37 with open('to_addrs.csv', 'r') as f: 38 reader = csv.reader(f) 39 for row in reader: 40 to_addrs=row[1] 41 msg = MIMEText(text,'plain','utf-8') 42 msg['From'] = Header(from_addr) 43 msg['To'] = Header(to_addrs) 44 msg['Subject'] = Header('python test') 45 server = smtplib.SMTP_SSL(smtp_server) 46 server.connect(smtp_server,465) 47 server.login(from_addr, password) 48 try: 49 server.sendmail(from_addr, to_addrs, msg.as_string()) 50 print('success') 51 except: 52 print('failed') 53 54 # 關閉服務器 55 server.quit()
報錯信息
ValueError: server_hostname cannot be an empty string or start with a leading dot.
因為Python 3.7修改了ssl.py,導致smtplib.SMTP_SSL也連帶產生了問題
# 改動這句代碼
server = smtplib.SMTP_SSL()
# 在括號內加入host參數
server = smtplib.SMTP_SSL(smtp_server)
#############################################################
擴展:abs() 函數返回數字的絕對值
1 import math 2 num =float(input('pls input a number:')) 3 # 方法1,關鍵詞:條件判斷 4 def abs_value1(): 5 if num >= 0: 6 print('該數字的絕對值為:{}'.format(num)) 7 else: 8 print('該數字的絕對值為:{}'.format(-num)) 9 10 11 # 方法2,關鍵詞:內置函數 12 def abs_value2(): 13 num1 = abs(num) 14 print('該數字的絕對值為:{}'.format(num1)) 15 16 17 18 # 方法3,關鍵詞:內置模塊 19 def abs_value3(): 20 num1 = math.fabs(num) 21 print('絕對值為{}'.format(num1)) 22 23 24 # 寫完3種方法后,驗證一下吧。 25 abs_value1() 26 abs_value2() 27 abs_value3()