python3 有关邮件的基本操作

我们经常需要用到邮箱的就是检测邮箱有效性,发送邮件,接收邮件(邮件信息的提取),简单记录一下这三种操作。

一、检测邮箱有效性。

检测邮箱的有效性,这里我们是检测邮箱是否能登录,所以不能只验证邮箱格式(邮箱正则最简单的就是re.search('.+@.+\..+')) 就是邮箱中间有@,并且后面部分的中间还要有.。这里我们需要登录一下他。然后通过登录返回状态判断邮箱是否正确。

import time
import smtplib

emailname = '123456789@qq.com'
passcode = 'abcdefghijklmn'   # QQ邮箱的这个密码不是我们QQ密码,是需要登录邮箱服务里面去打开服务,然后他会生成一个密匙
t1 = time.clock()
conn = smtplib.SMTP_SSL('smtp.qq.com', 465)  # 邮箱服务商加端口
try:
    res = conn.login(emailname , passcode)  # 邮箱不存在会直接报错
except:
    res = ""

print('时间:'+str(time.clock() - t1))
print('结果:'+res)

# 上面执行的结果
时间:0.19354549999999998
结果:(235, b'Authentication successful')  # 结果是一个元组,我们只需要判断res[1] 是不是有认证成功。就可以知道能不能登录了

二、发送邮件

登录成功后。构造一个email对象,然后通过smtp.sendmail()发送

#encoding:utf-8
import time
import smtplib
from email.header import Header
from email.mime.text import MIMEText
 
# subject 邮件主题,text 邮件内容   
def sendemail(subject, text, email_from, email_to, emailname='123456789@qq.com', passcode='abcdefghijklmn'):
    smtp = smtplib.SMTP_SSL('smtp.qq.com', 465) # 邮箱服务商加端口
    smtp.login(emailname, passcode)
    msg = MIMEText(text, "plain", "utf-8")  # 构造邮件信息
    msg["Subject"] = Header(subject, "utf-8")  # 邮件主题
    msg["from"] = email_from  # 从哪里寄出
    msg["to"] = ''.join(email_to)  # 寄到哪里  email_to 可以是多个邮箱['123456789@qq.com', '987654321@qq.com']

    smtp.sendmail(email_from, email_to, msg.as_string())  # 发送邮件
    smtp.quit()
    print("The email has been sent.")

sendemail('验证码', '您的验证码为123456,请注意查收', '123456789@qq.com', ['123456789@qq.com'])

如果需要发送html代码,只要把text写成html,并且修改MIMEtext()第二个参数为html就行,比如发个链接<a href = "http://www.baidu.com">,如要发送附件就查看python3 smtp邮件

三、接收邮件并且提取信息,一般在邮箱注册账号的时候用得多(比如登录验证码,辅助登录确认的链接,修改密码的链接)

把邮件读取出来,然后通过正则匹配我们的验证码

import re
import email
import imaplib

def getcaptcha(servername, username, password):
    if servername == 'att.net':
        servername = 'imap.mail.att.net'
    elif servername == 'roadrunner.com':
        servername = 'mail.twc.com'
    else:
        servername = 'imap.'+servername  # 一般服务器都长这样

    try:
        i = 0
        while i <= 3:
            i += 1
            # time.sleep(10)  # 给邮件接收一点点时间
            conn = imaplib.IMAP4_SSL(servername, 993)  # ssl端口993  默认方式端口143
            conn.login(username, password)  # 登录

            conn.select()  # 选择文件 默认 'inbox'
            tpy, data = conn.search(None, 'All')  # 选择邮件类型

            # 读取邮件
            n = 5
            for num in data[0].split()[::-1]:  # 列表反转  从id最大  也就是时间最近的开始读取
                if n < 1:
                    break
                n -= 1
                tpy, data_f = conn.fetch(num, '(RFC822)')
                message = email.message_from_string(data_f[0][1].decode('utf-8'))  # 邮件对象
                
                #邮件主题
                subject = message.get('subject')
                subject, encoding = email.header.decode_header(subject)[0]
                subject = subject.decode(encoding)

                # 发信人
                sub_from = email.utils.parseaddr(message.get("from"))[1]

                #收信人
                sub_to = email.utils.parseaddr(message.get("to"))[1]

                # 读取邮件内容
                for par in message.walk():
                    if not par.is_multipart():
                        name = par.get_param('name')  # 附件名
                        if name:
                            h = email.header.Header(name)
                            dh = email.header.header.decode_header(h)
                            fname = dh[0][0]
                        else:
                            pass
                        email_data = par.get_payload(decode=True)

                        email_content = email_data.decode("utf-8")  #邮件内容
                        # 匹配验证码
                        try:
                            captcha = re.search('验证码为(\d{6})', email_content).group(1)
                            conn.store(num, '+FLAGS', r'(\Deleted)')  # 可以把当前邮件删除
                            conn.close()
                            return captcha
                        except Exception as e:
                            print(e)
                            continue
                break
            conn.close()
    except:
        pass
    return False

captcha = getcaptcha('qq.com', '123456789@qq.com', 'abcdefghijklmn')
print(captcha)    #  captcha = 123456    验证码查找成功

PS:需要注意这个conn.store(num, '+FLAGS', r'(\Deleted)')删除好像是彻底删除,小心不要误删有用的邮件

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值