什么是POP3、SMTP和MAP?
POP3是Post Office Protocol 3的簡稱,即郵局協議的第三個版本,他是規定怎樣將個人計算機連接到Internet的郵件服務器和下載電子郵件的協議。它是因特網電子郵件的第一個離線協議的標準。POP3允許用戶從服務器上把郵件存儲到本地計算機上,同時刪除保存在郵件服務器上的郵件,而POP3服務器則是遵循POP3協議的接受郵件服務器,用來接受電子郵件。
SMTP的全稱是Simple Mail Transfer Protocol,即簡單的郵件傳輸協議。它是一組用于從源地址到目的地的地址傳輸郵件的規范,通過它控制郵件的中轉方式。SMTP協議屬于TCP/IP協議簇,它幫助每臺計算機在發送或者中轉信件時找到下個目的地。SMTP服務器就是遵循SMTP協議的發送郵件服務器。
SMTP認證,簡單來說就是要求必須在提供了賬戶名和密碼之后才能登陸SMTP服務器。
IMAP全稱是Iternet Mail Access Protocol,即交互式郵件存取協議,它是跟POP3類似的郵件訪問標準協議之一。不同的是,開啟了IMAP后,你在電子郵件客戶端收取的郵件仍然保存在服務器上,同時在客戶端上的操作都會反饋到服務器上,如:刪除郵件、標記郵件等,服務器上的郵件也會做相應的動作。無論從瀏覽器登陸還是客戶端登陸郵箱看到的郵件以及狀態都是一致的。
我們使用網易的163郵箱來發送郵件,所以我們需要先將163郵箱的POP3/SMTP/IMAP都給打開。
具體步驟是:設置->POP3/SMTP/IMAP->設置POP3/SMTP/IMAP,點擊復選框時郵箱會要求你設置授權碼,設置授權碼,然后一定要將授權碼給記住,后面會用到。郵箱設置好后我們就開始編寫代碼發送郵件。
首先引入我們需要導入的庫及包
1
2
3
4
5
6
|
import smtplib import email # MIME 多郵件擴充協議 from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart |
然后設置郵箱的域名,端口,發送者郵箱,接收者郵箱
1
2
3
4
5
|
host = 'smtp.163.com' # 使用163郵箱 port = '465' # 163郵箱服務器的端口號 password = 'xxxxxx' # 授權碼 receiver = 'xxxxxx' # 接收者的郵箱,可以為其他類型的郵箱,如果是多個接收者請傳入列表 |
接下來構建文本郵箱的主體
1
2
3
4
5
6
7
8
|
?body = 'xxx' # 你要發送的郵件的內容 subject = 'xxx' # 你要發送的郵件的標題 # plain表示郵件內容的類型,文本類型默認是plain。utf-8表示內容的編碼格式。 message = MIMEText(body, 'plain' , 'utf-8' ) message[ 'From' ] = sender # 發送者 message[ 'To' ] = receiver # 接收者 message[ 'Subject' ] = subject # 郵件標題 |
接下來我們獲取SMTP協議的證書,登陸我們的郵箱發送郵件
1
2
3
4
5
6
7
8
|
# 獲取SMTP協議證書 email_clint = smtplib.SMTP_SSL(host, port) # 登陸郵箱,這里也是用授權碼登陸郵箱的 login_result = email_clint.login(sender, password) # 發送郵件 email_clent.sendmail(from_addr = sender, to_addrs = receiver, msg = message.as_string()) # 關閉郵件發送客戶端 email_client.close() |
其實這里我們可以打印login_result,如果返回的狀態碼是235則證明郵件發送成功。
下面是發送文本郵件的全部代碼。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import email import smtplib from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart class SendEmail( object ): def __init__( self ): self .host = 'smtp.163.com' self .port = '465' self .password = 'xxxxxx' def send_email( self , receiver, subject = ' ', body=' '): message = MIMEText(body, 'plain' , 'utf-8' ) message[ 'From' ] = self .sender message[ 'To' ] = receiver message[ 'Subject' ] = subject try : email_clint = smtplib.SMTP_SSL( self .host, self .port) print ( '獲取證書成功' ) login_result = email_clint.login( self .sender, self .password) print ( '開始登陸' ) if login_result[ 0 ] = = 235 : print ( '登陸成功' ) email_clint.sendmail( self .sender, receiver, message.as_string()) print ( '郵件發送成功' ) else : print ( '登陸失敗' ) except Exception as e: print ( '發生錯誤' , e) |
下面介紹發送HTML格式內容的郵件以及向郵件內容中添加圖片。
其實發送HTML格式內容的郵件很簡單,只需將發送郵件的內容格式改為html就行了,像這樣
1
|
message = MIMEText('< h2 style = "color" >學習使我快樂</ h2 >', 'html', 'utf-8') |
還有使用內嵌的方法向郵件內容中加入文本或者圖片
1
2
|
# related 表示使用內嵌資源的形式,將郵件發送給對方 message = MIMEMultipart( 'related' ) |
然后向郵件中添加內容,如果把圖片嵌入到郵件正文中只需在HTML中通過引用src="cid:x"即可。x代表圖片的編號可以是數字也可是是字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# ---------------發送文本----------------- message_html = MIMEText( '<h2 style="color:red;font-size:100px">學習使我快樂</h2><img src="cid:small">' , 'html' , 'utf-8' ) # 將郵件內容 裝入到郵件信息當中去 message.attach(message_html) # ---------------發送圖片----------------- # rb 讀取二進制文件(圖片是二進制文件) image_data = open( '1.gif' , 'rb' ) # 設置讀取獲取的二進制數據 message_image = MIMEImage(image_data.read()) # 關閉剛才打開的文件 image_data.close() message_image.add_header( 'Content-ID' , 'small' ) # 添加圖片文件到郵件信息當中去 message.attach(message_image) |
然后構建郵件的主體,發送郵件即可
1
2
3
4
5
6
7
8
|
message[ 'From' ] = sender # 發送者 message[ 'To' ] = receiver # 接收者 message[ 'Subject' ] = subject # 郵件標題 ? email_clint = smtplib.SMTP_SSL(host, port) login_result = email_clint.login(sender, password) email_clent.sendmail(from_addr=sender, to_addrs=receiver, msg=message.as_string()) email_client.close() |
我們經常會向郵件中添加附件,下面介紹添加附件的方式
添加附件也是使用內嵌的方式添加的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 對二進制文件需要設置默認的編碼形式 # 對于MIMEText()來說 默認的編碼形式就是base64 # 如果對于二進制文件來說 沒有設置base64進行編碼 則附件的就會呈現亂碼 # --------------------添加圖片附件---------------------- message_image = MIMEText(open( '1.gif' , 'rb' ).read(), 'base64' , 'utf-8' ) # 設置附件在郵件中的名字 message_image[ 'Content-disposition' ] = 'attachment;filename="happy.gif"' message.attach(message_image) # --------------------添加xlsx表格附件--------------- message_xlsx = MIMEText(open( 'table.xlsx' , 'rb' ).read(), 'base64' , 'utf-8' ) # 設置附件在郵件當中的名字 message_xlsx[ 'Content-Disposition' ] = 'attachment;filename="test.xlsx"' message.attach(message_xlsx) |
然后發送郵件即可。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_38684419/article/details/81569019