Python与邮件笔记
来聊聊邮件
在很多工作场合我们都需要用到邮件,他在生产环境中,具有较高的证据地位。
而在开发的过程中,我也碰到了很多和邮件相关的东西,在这里做一个整理和记录,方便以后的不时之需。
正则匹配邮件地址
这个文章里包含了非常多的验证邮件地址的正则。我这里就放我目前比较熟悉常用的Python、shell、MySQL的版本,以及符合RFC 5322标准的版本
- python版本
r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"
- grep版本
$ grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" filename.txt
- MySQL版本
SELECT * FROM `users` WHERE `email` NOT REGEXP '^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$';
- RFC 5322
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\<p style='text-align:center;'><span class='MathJax_Preview'>\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\]</span></p>!(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\<p style='text-align:center;'><span class='MathJax_Preview'>\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]</span></p>)
SQL server邮件通知功能
http://blog.jobbole.com/87077/
暂时没有需求使用过,仅作记录
Python SMTP发送邮件
SMTP(simple mail transfer protocol)简单邮件传输协议。用于由原地址到目的地址传送邮件的规则,由他来控制信件的中转方式
Python中的smtplib提供了一种很方便的途径发送电子邮件,他对SMTP协议进行了简单的封装。
先放上一段,已经成功完成发送,但是并不推荐使用的利用第三方SMTP的QQ邮箱发送代码:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 第三方SMTP服务
mail_host='smtp.qq.com'
# 这里不用写端口号,在下文启动smtp连接的时候填写端口号
mail_user='476355383@qq.com'
# 这里的密码并不是自己的QQ密码,说实话这点还是挺好的,这仅仅是一个“邮箱授权码”,并且看QQmail的解释是,这个授权码并不唯一,可以支持多台终端发送
mail_pwd='nrplngnnptflbjbe'
sender='476355383@qq.com'
receivers=['scott062793@yeah.net']
mesg=MIMEText('python 邮件发送测试','plain','utf-8')
mesg['From']=Header('scott','utf-8')
mesg['To']=Header('lv','utf-8')
subject='python SMTP 邮件测试'
mesg['Subproject']=Header(subject,'utf-8')
try:
smtp_obj=smtplib.SMTP_SSL(mail_host,465)
# smtp_obj.connect(mail_host,465)
smtp_obj.login(mail_user,mail_pwd)
smtp_obj.sendmail(sender,receivers,mesg.as_string())
smtp_obj.quit()
print('send success')
except Exception as e:
print('----------faild----------')
print(e)
但是在发送的过程中,这封邮件可能由于因为我长久不使用QQ邮箱的缘故,被退回了,需要验证码才能重新发送,所以生产环境还是推荐安装一个sendmail
Python-sendmail发送邮件
为了避免发送邮件的时候需要登录一些不太舒适的邮件服务商,规避一些密码修改,或者是登录频率限制发送的问题,我们可以通过linux 本身的sendmail服务发送邮件。不需要登录,发送邮件名可以是任意名字,没有限制。
安装sendmail服务
- 安装
yum install -y sendmail
- 启动服务
service sendmail start
Python调用sendmail发送邮件
from email.mime.text import MIMEText
from subprocess import Popen, PIPE
import commands
def send_mail(sender, recevier, subject, html_content):
msg = MIMEText(html_content, 'html', 'utf-8')
msg["From"] = sender
msg["To"] = recevier
msg["Subject"] = subject
p = Popen(["/usr/sbin/sendmail", "-t"], stdin=PIPE)
p.communicate(msg.as_string())
send_mail("sender@xxxx.com","receive1@xxxx.com,receive2@xxxx.com","title", “mail_text”)
这时候msg['From']
这个关键参数就不用携带用户名和密码了。换一种思维来说,这个from
既然可以是任意的名称,我可以把他作为一个标识,携带一些信息过去给对端去识别和分类。
例如在对端接收邮件的时候做一个“根据发件人的名称,对邮件进行分类”。