python - 如何通过GMail发送邮件:smtplib的使用

神马事SMTP?

百科名片

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。


SMTP类似于HTTP,在应用层是文本形式的。在UNIX编程艺术里讲过,要提倡明文的协议,这样从肉眼就很容易分析,这样就不需要编写对应的可视编辑器即可实现调试。


但可惜,当使用GMail的时候,通过WireShark分析,除了最初的握手协议外,具体传输内容是无法得到的(如下图)


1.建立TCP三路握手

2.SMTP自己的握手

3.客户端启动SSL握手 - 服务器等待握手 - 开始SSL握手了

4.从这里开始,所有内容是加密的了。


所以这里只好打开smtp的debug模式:smtp.set_debuglevel(1)。

这样能够在控制台详细地打印出交互过程:

所有交互都是客户端‘SEND:****’开始,服务器返回'reply:***'结束,是不是很像HTTP.


1.通过连接SMTP.gmail.com:25,然后服务器返回服务器相关信息,并要求开启SSL:‘STARTTLS’



2.开启TLS,Gmail要求授权才能继续操作:AUTH LOGIN PLAIN XOAUTO,当然TLS开启后的所有内容无法通过WireShark等抓包工具捕获的,所以不用担心第三方会截取这部分内容,这就是为什么网页也要提倡HTTPS的理由,无法被第三方截取。



3.授权请求 - 返回授权成功哦。



4.授权成功后就可以开始发送内容了:



5.最后记得要退出哦。。



每当我看多周边人重新写SMTP处理逻辑的时候,都想告诉他一声:Python已经有相关库了,为什么不用它,而重新造轮子呢?是要学习这个协议的精髓么?如果这样,我还是建议你去读HTTP吧,现在很多网络应用都依赖于HTTP,深入研究SMTP或者重新造轮子都是不可取的。


 如果不会Python怎么办?

能读懂下面的代码就会了。


import smtplib
import sys
import email.mime.text
# my test mail
mail_username='[email protected]'
mail_password='harktest'
from_addr = mail_username
to_addrs=('[email protected]')

# HOST & PORT
HOST = 'smtp.gmail.com'
PORT = 25

# Create SMTP Object
smtp = smtplib.SMTP()
print 'connecting ...'

# show the debug log
smtp.set_debuglevel(1)

# connet
try:
    print smtp.connect(HOST,PORT)
except:
    print 'CONNECT ERROR ****'
# gmail uses ssl
smtp.starttls()
# login with username & password
try:
    print 'loginning ...'
    smtp.login(mail_username,mail_password)
except:
    print 'LOGIN ERROR ****'
# fill content with MIMEText's object 
msg = email.mime.text.MIMEText('Hi ,I am leehark')
msg['From'] = from_addr
msg['To'] = ';'.join(to_addrs)
msg['Subject']='hello , today is a special day'
print msg.as_string()
smtp.sendmail(from_addr,to_addrs,msg.as_string())
smtp.quit()


你可能感兴趣的:(HTTP)