計算機網(wǎng)絡(luò)-套接字編程作業(yè)(3)-郵件客戶端

背景知識

1)梳理邏輯(摘自SMTP的連接和發(fā)送過程):
(a)建立TCP連接(使用Socket)
(b)客戶端發(fā)送HELO/EHLO命令以標識發(fā)件人自己的身份缸兔, 接受 服務(wù)器端響應(yīng)蚓挤;
(c)客戶端發(fā)送AUTH LOGIN登錄請求允坚,接著發(fā)送用戶名和密碼;
(d)客戶端發(fā)送RCPT命令胎食,以標識該電子郵件的計劃接收人,可以有多個RCPT行肴颊;
(e)協(xié)商結(jié)束奸例,發(fā)送郵件,用命令DATA發(fā)送
(f)以.表示結(jié)束輸入內(nèi)容一起發(fā)送出去
(g)結(jié)束此次發(fā)送赡模,用QUIT命令退出

2)每個命令都以\r\n結(jié)尾田炭,特定格式命令:
HELO:HELO <domain> <CRLF>
RCPT TO:<forward-path> <CRLF>——<forward-path>
3)選擇郵箱服務(wù)器
gmail還要翻墻,棄用(? 漓柑。?)
我是使用網(wǎng)易郵箱作為郵箱服務(wù)器教硫,公司郵箱作為目標賬戶叨吮。
網(wǎng)易郵箱需要提前進行一些設(shè)置,開啟STMP功能瞬矩,方法如下:

  1. 登錄郵箱 -- 設(shè)置 -- 進入POP3/SMTP/IMAP界面茶鉴,可以看最下面提示有SMTP服務(wù)器: smtp.163.com
  2. 勾選 IMAP/SMTP服務(wù),會彈出提示設(shè)置授權(quán)碼
  3. 進入設(shè)置授權(quán)碼丧鸯,開啟服務(wù)蛤铜,這里需要手機號碼驗證(如果你和我一樣,關(guān)聯(lián)的手機號碼已經(jīng)不知道丟哪里了丛肢,可以換一個綁定當前手機的網(wǎng)易郵箱围肥,(^ ^)),總之蜂怎,設(shè)置好授權(quán)碼后穆刻,這個授權(quán)碼就是代碼里的password

下面是最終代碼展示:

from socket import *
import base64
msg = 'I love computer networks!'
endmsg = '\r\n.\r\n'
# 郵件服務(wù)器,端口 25 
mailserver = 'smtp.163.com'

fromaddr = 'z****@163.com' # 填寫自己的郵箱
toaddr = 'z***@***.com' # 填寫目標郵箱
username = 'z****@163.com'
password = 'a*****6' # 網(wǎng)易郵箱授權(quán)碼

# Create socket called clientSocket and establish a TCP connection with mailserver
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((mailserver, 25))
recv = clientSocket.recv(1024).decode()
print(recv)
if recv[:3] != '220':
    print('220 reply not received from server.')

# Send HELO command and print server response.
heloCommand = 'HELO Alice\r\n'
clientSocket.send(heloCommand.encode())
recv1 = clientSocket.recv(1024).decode()
print(recv1)
if recv1[:3] != '250':
    print('250 reply not received from server.')

# send AUTH LOGIN command
base64_str = ('\x00' + username + '\x00' + password).encode()
base64_str = base64.b64encode(base64_str)
authCommand = 'AUTH PLAIN '.encode() + base64_str + '\r\n'.encode()
clientSocket.send(authCommand)
recv_auth = clientSocket.recv(1024)
print(recv_auth.decode())

# Send MAIL FROM command and print server response.
mailCommand = 'MAIL FROM: <' + fromaddr + '>\r\n'
clientSocket.send(mailCommand.encode())
recv_from = clientSocket.recv(1024).decode()
print(recv_from)
if recv_from[:3] != '250':
    print('250 reply not received from server.')

# Send RCPT TO command and print server response.
rcptCommand = 'RCPT TO: <' + toaddr + '>\r\n'
clientSocket.send(rcptCommand.encode())
recv_rcpt = clientSocket.recv(1024).decode()
print(recv_rcpt)
if recv_rcpt[:3] != '250':
    print('250 reply not received from server.')

# Send DATA command and print server response.
clientSocket.send('DATA\r\n'.encode())
recv_data = clientSocket.recv(1024).decode()
print(recv_data)
if (recv_data[:3] != '354'):
    print('354 reply not received from server')

# Send message data.
send_msg = 'from: ' + fromaddr + '\r\n'
send_msg += 'to: ' + toaddr + '\r\n'
send_msg += 'subject: ' + msg + '\r\n'
send_msg += 'content-type: text/plain\t\n'
send_msg += '\r\n' + msg
clientSocket.send(send_msg.encode())

# Message ends with a single period.
clientSocket.send(endmsg.encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '250'):
    print('250 reply not received from server')

# Send QUIT command and get server response.
clientSocket.send('QUIT\r\n'.encode())

# close
clientSocket.close()

結(jié)果:


bb.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杠步,一起剝皮案震驚了整個濱河市氢伟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幽歼,老刑警劉巖朵锣,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異甸私,居然都是意外死亡诚些,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門皇型,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诬烹,“玉大人,你說我怎么就攤上這事弃鸦〗视酰” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵唬格,是天一觀的道長家破。 經(jīng)常有香客問我,道長西轩,這世上最難降的妖魔是什么员舵? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮藕畔,結(jié)果婚禮上马僻,老公的妹妹穿的比我還像新娘。我一直安慰自己注服,他們只是感情好韭邓,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布措近。 她就那樣靜靜地躺著,像睡著了一般女淑。 火紅的嫁衣襯著肌膚如雪瞭郑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天鸭你,我揣著相機與錄音屈张,去河邊找鬼。 笑死袱巨,一個胖子當著我的面吹牛阁谆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播愉老,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼场绿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嫉入?” 一聲冷哼從身側(cè)響起焰盗,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咒林,沒想到半個月后熬拒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡垫竞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年梦湘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片件甥。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哼拔,靈堂內(nèi)的尸體忽然破棺而出引有,到底是詐尸還是另有隱情,我是刑警寧澤倦逐,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布譬正,位于F島的核電站,受9級特大地震影響檬姥,放射性物質(zhì)發(fā)生泄漏曾我。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一健民、第九天 我趴在偏房一處隱蔽的房頂上張望抒巢。 院中可真熱鬧,春花似錦秉犹、人聲如沸蛉谜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽型诚。三九已至客燕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狰贯,已是汗流浹背也搓。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留傍妒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓栖袋,卻偏偏與公主長得像拍顷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子塘幅,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容