笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人,欢迎直筒们关注我的公众号,大家一起讨论数据中的那些有趣的事情。
我的公众号为:livandata
写这篇文章遇到了不小的问题,首先smptlib包不知道怎么导入,纠结了好一会,学会用pip search查找该导什么样的包:
python3 -m pip search smptlib
经查找发现了smptlib在gymail中,只需要安装gymail包,就可以使用smptlib了。
1、如何发送邮件:
#!/usr/bin/env python
# _*_ UTF-8 _*_
from email.utils import formataddr
import smtplib
from email.mime.text import MIMEText
my_sender='[email protected]' #发件人邮箱账号,为了后面易于维护,所以写成了变量
my_user='[email protected]' #收件人邮箱账号,为了后面易于维护,所以写成了变量
def mail():
ret=True
try:
msg=MIMEText('填写邮件内容','plain','utf-8')
msg['From']=formataddr(["shuijing",my_sender]) #括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To']=formataddr(["yeti",my_user]) #括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject']="主题" #邮件的主题,也可以说是标题
server=smtplib.SMTP("smtp.163.com",25) #发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender,"*********") #括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender,[my_user,],msg.as_string()) #括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() #这句是关闭连接的意思
except Exception: #如果try中的语句没有执行,则会执行下面的ret=False
ret=False
return ret
ret=mail()
if ret:
print("ok") #如果发送成功则会返回ok,稍等20秒左右就可以收到邮件
else:
print("filed") #如果发送失败则会返回filed
2、如何发送带附件的邮件:
如果只写内容,不带附件,除了上面的写法外,还有下面的通过MIMEMultipart()编写,而且,通过这种方式可以添加附件。
#!/usr/bin/env python
# _*_ UTF-8 _*_
from email.utils import formataddr
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
my_sender='[email protected]' #发件人邮箱账号,为了后面易于维护,所以写成了变量
my_user='[email protected]' #收件人邮箱账号,为了后面易于维护,所以写成了变量
def mail():
msg = MIMEMultipart()
msg['From']=formataddr(["shuijing",my_sender]) #括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To']=formataddr(["yeti",my_user]) #括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject']="主题" #邮件的主题,也可以说是标题
msg.attach(MIMEText('填写邮件内容', 'plain', 'utf-8'))
# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
msg.attach(att1)
server=smtplib.SMTP("smtp.163.com",25) #发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender,"****************") #括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender, [my_user,], msg.as_string()) #括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() #这句是关闭连接的意思
ret=mail()
3、如何接收解析邮件:
#!/usr/bin/env python
# _*_ UTF-8 _*_
import poplib
import base64
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
# 获取邮件中的内容
def get_email_content():
useraccount = '[email protected]'
password = 'xujingboyy0502'
# 邮件服务器地址,以下为网易邮箱
pop3_server = 'pop.163.com'
# 开始连接到服务器
server = poplib.POP3(pop3_server)
# 打开或者关闭调试信息,为打开,会在控制台打印客户端与服务器的交互信息
server.set_debuglevel(1)
# 打印POP3服务器的欢迎文字,验证是否正确连接到了邮件服务器
print(server.getwelcome().decode('utf8'))
# 开始进行身份验证
server.user(useraccount)
server.pass_(password)
# 返回邮件总数目和占用服务器的空间大小(字节数), 通过stat()方法即可
email_num, email_size = server.stat()
print("消息的数量: {0}, 消息的总大小: {1}".format(email_num, email_size))
# 使用list()返回所有邮件的编号,默认为字节类型的串
rsp, msg_list, rsp_siz = server.list()
print("服务器的响应: {0},\n : {1},\n返回消息的大小: {2}".format(rsp, msg_list, rsp_siz))
print('邮件总数: {}'.format(len(msg_list)))
# 下面单纯获取最新的一封邮件
total_mail_numbers = len(msg_list)
# retr方法可以获取指定编号的邮件的全部内容,total_mail_numbers为最新邮件的编号,如果要
# 获取多封邮件,只需要循环这个编号就可以了。
rsp, msglines, msgsiz = server.retr(total_mail_numbers)
# print("服务器的响应: {0},\n原始邮件内容: {1},\n该封邮件所占字节大小: {2}".format(rsp, msglines, msgsiz))
msg_content = b'\r\n'.join(msglines).decode('gbk')
msg = Parser().parsestr(text=msg_content)
print('解码后的邮件信息:\n{}'.format(msg))
# 关闭与服务器的连接,释放资源
server.close()
return msg
# 获取指定时间的邮件
def getTimeStamp(cn):
messages=mailServer.retr(cn)[1]
mail = email.message_from_bytes('\n'.encode('utf-8').join(messages))
date=email.header.decode_header(mail.get('date'))
utcstr = date[0][0].replace('+00:00','')
global utcdatetime
try:
utcdatetime = datetime.datetime.strptime(utcstr, '%a, %d %b %Y %H:%M:%S +0000 (GMT)')
localdatetime = utcdatetime + datetime.timedelta(hours=+8)
localtimestamp = localdatetime.timestamp()
except:
utcdatetime = datetime.datetime.strptime(utcstr, '%a, %d %b %Y %H:%M:%S +0800')
localtimestamp = utcdatetime.timestamp()
return localtimestamp
# 用来解析邮件主题
from email.header import decode_header
def parser_subject(msg):
subject = msg['Subject']
value, charset = decode_header(subject)[0]
if charset:
value = value.decode(charset)
print('邮件主题: {0}'.format(value))
return value
# 用来解析邮件来源
from email.utils import parseaddr
def parser_address(msg):
hdr, addr = parseaddr(msg['From'])
# name 发送人邮箱名称, addr 发送人邮箱地址
name, charset = decode_header(hdr)[0]
if charset:
name = name.decode(charset)
print('发送人邮箱名称: {0},发送人邮箱地址: {1}'.format(name, addr))
# 解析邮件内容
def parser_content(msg):
content = msg.get_payload()
# 文本信息
content_charset = content[0].get_content_charset() # 获取编码格式
text = content[0].as_string().split('base64')[-1]
text_content = base64.b64decode(text).decode(content_charset) # base64解码
# 添加了HTML代码的信息
content_charset = content[1].get_content_charset()
text = content[1].as_string().split('base64')[-1]
html_content = base64.b64decode(text).decode(content_charset)
print('文本信息: {0}\n添加了HTML代码的信息: {1}'.format(text_content, html_content))
if __name__ == '__main__':
# 返回解码的邮件详情
msg = get_email_content()
# 解析邮件主题
parser_subject(msg)
# 解析发件人详情
parser_address(msg)
# 解析内容
parser_content(msg)
参考文件:
https://blog.csdn.net/qq_33304418/article/details/82384090
https://blog.csdn.net/u010103202/article/details/78045523
后面如果有比较好玩的功能,希望大家能交流,谢谢……