python,smtplib模块的一些操作小记-2

python3-smptlib2


0x01

smtplib-显示主题,发送人等...

更新:

发现一个尴尬的事实
我是用qq邮件测试的,就算我没写主题和发送人这些话,如果你是对方的好友也会自动显示(哭),但如果是一个的邮箱服务器发送到另一个邮箱服务器就可以出现

这次直接上代码吧,稍微写一下笔记,原谅我的懒惰(嘿嘿)
一个完整的邮件,要有主题和发送人,收件人等信息,smtplib同样提供这样的功能,功能实现如下。

/usr/bin/env python

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr,formataddr
import smtplib

#格式化邮箱地址
def format_addr(s):
        name,addr = parseaddr(s)
        return formataddr((Header(name,'utf-8').encode(),addr))

'''
这个设置就不用多说了吧,和上次一样,都是用户,授权码,发送地址和接受地址。
'''
user = input('User:')
password = input('Password:')
send = input('Send:')
receivers = list(input('Receivers:'))
smtp_server = input('SMTP server:')


#构造邮件
msg = MIMEText('test python smtp','plain','utf-8')
#构造发件人的头部信息
msg['From'] = format_addr('python lover'%user)
#构造收件人的头部信息
msg['To']=format_addr('administrator<%s>'%receivers)
#构造邮件主题头部信息
msg['Subject'] = (Header('from smtp....','utf-8').encode())

#发送邮件
server = smtplib.SMTP(smtp_server,465)
server.set_debuglevel(1)
server.login(user,password)
server.sendmail(send,[receivers],msg.as_string())
server.quit

def format_addr(s)是照网上写的,作用是格式化邮件地址,没看懂parseaddr()和formataddr。等理解再补上
(补充内容:
format_addrs函数接受到邮件地址后,使用parseaddr()方法将user和send的值,分为(name,addr)格式的元组,再将分解后的值分别赋予给name和addr两个变量,如果这个地址连接错误或者不存在,就相当于解析失败,这会返回("","")形式的一个元组信息。formataddr()与parseaddr()的方法相反,需要元组的信息,然后返回适合与smtp协议的To和Cc的字符串值,所以使用这个对象的前提条件是,name和addr为元组,所以这个函数使用了parseaddr()方法,将user转换一下可以适用于formataddr()对象可以接受的值,再由formataddr()进行转换。

不能简单的传入一个nameaddr@example.com格式,因为如果包含中文,要使用Header对象。Header()对象可以进行编码,msg['To']接受的是字符串而不是list

['From']和['To']和['Subject']是标准邮件的三个头部信息。这是smtp协议中定义的格式。

发送格式部分与上次并无差别
这个程序的与上个程序的差别,基本就在于显示smtp标准协议中三个头部信息

剩下的明日更新~