我们经常需要用到邮箱的就是检测邮箱有效性,发送邮件,接收邮件(邮件信息的提取),简单记录一下这三种操作。
一、检测邮箱有效性。
检测邮箱的有效性,这里我们是检测邮箱是否能登录,所以不能只验证邮箱格式(邮箱正则最简单的就是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)')
删除好像是彻底删除,小心不要误删有用的邮件