Python与邮件笔记

来聊聊邮件

在很多工作场合我们都需要用到邮件,他在生产环境中,具有较高的证据地位。
而在开发的过程中,我也碰到了很多和邮件相关的东西,在这里做一个整理和记录,方便以后的不时之需。

正则匹配邮件地址

http://blog.jobbole.com/89275/

这个文章里包含了非常多的验证邮件地址的正则。我这里就放我目前比较熟悉常用的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

http://blog.csdn.net/qq_37023538/article/details/53640755

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既然可以是任意的名称,我可以把他作为一个标识,携带一些信息过去给对端去识别和分类。
例如在对端接收邮件的时候做一个“根据发件人的名称,对邮件进行分类”。

posted @ 2017-10-28 22:10  sc0T7_ly  阅读(230)  评论(0编辑  收藏  举报