Python 利用SMTP协议,基于第三方的邮件服务器发送邮件

Python 利用SMTP协议,基于第三方的邮件服务器发送邮件

在编程时,经常会有各种数据异常或者处理失败等需要发送警示邮件的场合,目前我知道只有两种,一种是利用shell脚本,在异常情况下,发送邮件;其实吧,python自身也能够基于SMTP协议,来自定义各种发送格式的邮件,比如说,在正文写文字,在正文显示html标签,当然,也可发送图片和附件。

下面将一一给出例子,并解释:

(1)利用shell脚本发送邮件的例子:

利用shell脚本(main.sh)调用python程序,根据python函数(在test_python_shell.py中)的执行返回结果,来发送结果提示邮件

程序运行结果-提示发邮件的shell脚本:sh_main.sh,如下

#!/bin/bash
# filename: main.sh
PYTHON="/usr/local/python2.7/bin/python"
WORK_PATH=$(cd "$(dirname "$0")"; pwd)  ## 切换到当前目录,并获得当前路径
echo $WORK_PATH

mail_to="[email protected]"
function sendmail()
{
        echo $1 | mail -s "[info]项目计算结果提示,具体请查看具体logging日志和具体函数!!!" ${mail_to}
}
#!/bin/bash
function main ()
{   #echo $#  #参数个数
    #echo $1
    #echo $2
    #检查参数
    date_str=`date -d "$start_date +$i day" +%Y-%m-%d`
    echo $date_str
    ${PYTHON} test_python_shell.py $date_str
    if [ $? -ne 0 ]
    then
        echo "[main]: 项目计算失败, $date_str"
        sendmail "项目计算失败,具体请查看具体logging日志和具体函数"
        exit 1
    else
        echo "[main]: 项目计算成功, $date_str"
        sendmail "[main]: 项目计算成功,  $date_str"
    fi
}
main $@
# sh main.sh "2017-07-01" 

test_pyhton_shell.py脚本的内容如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
from datetime import timedelta
import datetime
class TestSendEmail():
    def __init__(self):
        self.target_date="00-00-00"
    def run_main(self):
        print "self.target_date: ",self.target_date
if __name__ == '__main__':
    obi_test_send_email = TestSendEmail()
    # 接收命令行参数
    target_current_date = sys.argv[1]
    print type(target_current_date),"sys.argv[1]",target_current_date
    obi_test_send_email.target_date = target_current_date
    # 调用主调函数run_main()
    obi_test_send_email.run_main()

(2)python自身利用SMTP协议,基于第三方邮件服务器发送邮件的例子:

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

常用的代理邮件服务商的 SMTP 访问(QQ、网易、Google等)


Python创建 SMTP 对象语法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
参数说明:
host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: runoob.com,这个是可选参数。
port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。
local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。
Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]
参数说明:
from_addr: 邮件发送者地址。
to_addrs: 字符串列表,邮件发送地址。
msg: 发送消息
这里要注意一下第三个参数,msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。

下面直接上代码:test_send_various_email.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart  # 发送附件时使用
from email.mime.image import MIMEImage  # 发送图片附件时使用
import sys
class SendEmail():
    def __init__(self):
        # 第三方 SMTP 邮件代理服务器的服务
        #使用其他邮件服务商的 SMTP 访问(QQ、网易、Google等)
        self.mail_host = "smtp.xxxx.com"  # 设置服务器
        self.mail_user = "your_user_name@###.com"  # 用户名
        self.mail_pass = "your_email_password"  # 口令

        # 设置邮件的发件方和收件人列表
        self.sender = '[email protected]'  # 设置邮件发件方
        self.receivers = ['[email protected]','[email protected]']  # 接收邮件列表,设置多个形如-- self.receivers = ['[email protected]','[email protected]']
        pass
    #初始化登录信息,连接邮件服务器,并发送邮件
    def login_smtp_server_and_send(self,send_content):
        try:
            smtpObj = smtplib.SMTP()
            smtpObj.connect(self.mail_host, 25)  # 25 为 SMTP 端口号
            smtpObj.login(self.mail_user, self.mail_pass)
            smtpObj.sendmail(self.sender, self.receivers, send_content.as_string())
            print "邮件发送成功"
        except smtplib.SMTPException:
            print "Error: 无法发送邮件,原因如下"
            info=sys.exc_info()
            print info
            print info[0]
            print info[1]
    # 邮件正文是文字或者html
    def send_words_content(self):
        mail_msg = """
        

Python 邮件发送测试...

这是一个链接

成绩表

项目 上课 休息
星期 星期一 星期二 星期三 星期四 星期五 星期六 星期日
上午 语文 数学 英语 英语 物理 计算机 休息
数学 数学 地理 历史 化学 计算机
政治 英语 体育 历史 地理 计算机
数学 数学 地理 历史 化学 计算机
""" message = MIMEText(mail_msg, 'html', 'utf-8') message['From'] = Header("发送文本", 'utf-8') message['To'] = Header("测试", 'utf-8') subject = 'Python SMTP 邮件测试--正文为文本或html标签' message['Subject'] = Header(subject, 'utf-8') # 登录并发送邮件 self.login_smtp_server_and_send(send_content=message) return # 发送邮件带文件附件的例子 def send_attachmentfile_content(self): # 创建一个带附件的实例 message = MIMEMultipart() message['From'] = Header("发送邮件带附件", 'utf-8') message['To'] = Header("测试", 'utf-8') subject = 'Python SMTP 邮件测试-带文件附件' message['Subject'] = Header(subject, 'utf-8') # 邮件正文内容 message.attach(MIMEText('Python SMTP 邮件测试-带文件附件 的测试……', 'plain', 'utf-8')) # 构造附件1,传送当前目录下的 test.log 文件 att1 = MIMEText(open('test.log', 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # 这里的filename可以任意写,写什么名字,邮件中显示什么名字 att1["Content-Disposition"] = 'attachment; filename="test.txt"' message.attach(att1) # 构造附件2,传送当前目录下的 runoob.txt 文件 att2 = MIMEText(open('use_common.py', 'rb').read(), 'base64', 'utf-8') att2["Content-Type"] = 'application/octet-stream' att2["Content-Disposition"] = 'attachment; filename="use_common.txt"' message.attach(att2) # 登录并发送邮件 self.login_smtp_server_and_send(send_content=message) return # 发送邮件时附件为图片的例子 def send_photo_attachment(self): msgRoot = MIMEMultipart('related') msgRoot['From'] = Header("发送邮件-附件为图片", 'utf-8') msgRoot['To'] = Header("测试", 'utf-8') subject = 'Python SMTP 邮件测试--附件为图片' msgRoot['Subject'] = Header(subject, 'utf-8') msgAlternative = MIMEMultipart('alternative') msgRoot.attach(msgAlternative) mail_msg = """

Python 邮件发送测试...

this is a url_link

图片演示:

""" msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8')) # 指定图片为当前目录 fp = open('psb.jpeg', 'rb') msgImage = MIMEImage(fp.read()) fp.close() # 定义图片 ID,在 HTML 文本中引用 msgImage.add_header('Content-ID', '') msgRoot.attach(msgImage) # 登录并发送邮件 self.login_smtp_server_and_send(send_content=msgRoot) return # 创建对象,并一一调用各函数 obj_send_email=SendEmail() obj_send_email.send_words_content() obj_send_email.send_attachmentfile_content() obj_send_email.send_photo_attachment()



(3) 注意事项:

    1)Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html

    2)发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

    3)QQ 邮箱 SMTP 服务器地址:smtp.qq.com,ssl 端口:465。以下实例你需要修改:发件人邮箱(你的QQ邮箱),密码,收件人邮箱(可发给自己)。

    4)  参考网址: http://www.runoob.com/python/python-email.html




你可能感兴趣的:(Python,新手编码习惯)