Python 【收發郵件】

發郵件
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))python

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()
相關文章
相關標籤/搜索