专题06-python操作email

笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人,欢迎直筒们关注我的公众号,大家一起讨论数据中的那些有趣的事情。

我的公众号为: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

后面如果有比较好玩的功能,希望大家能交流,谢谢……

发布了137 篇原创文章 · 获赞 93 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/livan1234/article/details/86727202
今日推荐