• Python 发送邮件


    一、介绍

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

    Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

    二、需求分析

    有一个shell脚本,需要有发送邮件的功能。如果直接使用shell自带的mail发送

    echo 邮件正文” | mail -s 邮件主题 收件地址

    这种邮件收到后,会被邮箱服务器拦截到。可能会进入到垃圾收件箱中,可能连垃圾箱都没有(被拦截了)。

    但是又不想搭建邮箱服务器,太麻烦了!

    怎么办呢?使用Python就可以解决。

    三、Python发送邮件

    我们需要使用shell脚本来调用Python脚本,所以传参数时,需要使用命令行方式传参。

    sys.argv

    sys.argv[]是用来获取命令行输入的参数的(参数和参数之间空格区分),sys.argv[0]表示代码本身文件路径,所以从参数1开始,表示获取的参数了!

    在python3.5.2版本中,默认已经有smtplib和email两个模块,所以不需要安装了!

    正式脚本

    mail-send.py

    注意:此文件名不能是email.py

    因为email是python自带的,否则会报错

    ModuleNotFoundError: No module named 'email.utils'; 'email' is not a package

    完整内容如下:

    #!/usr/bin/env python3
    # coding:utf-8
    
    import sys
    import smtplib  # 加载smtplib模块
    from email.mime.text import MIMEText
    from email.utils import formataddr
    
    class SendMail(object):
        def __init__(self,sender,title,content):
            self.sender = sender  #发送地址
            self.title = title  # 标题
            self.content = content  # 发送内容
            self.sys_sender = '123456@163.com'  # 系统账户
            self.sys_pwd = '123456'  # 系统账户密码
    
        def send(self):
            try:
                """
                构造一个邮件对象,
                第一个参数就是邮件正文,
                第二个参数是MIME的subtype,传入'html',最终的MIME就是'text/html'。
                最后一定要用utf-8编码保证多语言兼容性。
                """
                msg = MIMEText(self.content, 'html', 'utf-8')
                # 发件人格式
                msg['From'] = formataddr(["IT事业部系统", self.sys_sender])
                # 收件人格式
                msg['To'] = formataddr(["", self.sender])
                # 邮件主题
                msg['Subject'] = self.title
                # SMTP服务器
                server = smtplib.SMTP("smtp.163.com", 25)
                # 登录账户
                server.login(self.sys_sender, self.sys_pwd)
                # 发送邮件
                server.sendmail(self.sys_sender, [self.sender, ], msg.as_string())
                # 退出账户
                server.quit()
                return True
            except Exception as e:
                print(e)
                return False
    
    if __name__ == '__main__':
        # 参数个数,由于sys.argv[0]就是脚本名,所以要减1
        num = len(sys.argv) - 1
        if num < 3 or num > 3:
            exit("参数错误,必须传3个参数!当前参数个数为%s"%num)
        
        sender = sys.argv[1]  # 发送地址
        title = sys.argv[2]  # 标题
        content = sys.argv[3]  # 发送内容
    
        # 调用send方法,发送邮件
        ret = SendMail(sender,title,content).send()
        if ret:
            print('发送成功!')
        else:
            print('发送失败!')

    注意:需要修改系统账户的邮箱和密码!

    如果是163邮箱,SMTP服务器无需修改,否则需要修改!

    如果是qq邮箱,改动如下:
    1.qq邮箱密码换成它提供的16位授权码
    2.端口号改为465
    3.smtplib.SMTP改为smtplib.SMTP_SSL

    可能有些人会有疑惑,为什么要改成smtplib.SMTP_SSL。因为腾讯的邮箱服务器,使用的是SSL加密方式。

    运行脚本

    将脚本上传到 linux服务器,先用命令行运行。

    语法如下:

    python3 mail-send.py 发送地址 标题 发送内容

    测试执行:

    python3 mail-send.py 88888888@qq.com 申请单 '账户: xiao <br>密码:123456 <br>请妥善保管好账户信息,本 邮件由系统发送,请勿回复!谢谢配合!<br>'

    这个时候,收到的邮件如下:

    使用shell调用

    使用shell脚本调用,也是同样的道理。将命令直接写进入就可以了!

    脚本如下:

    #!/bin/bash
    
    python3 mail-send.py 987334176@qq.com 申请单 '账户: xiao <br>密码:123456 <br>请妥善保管好账户信息,本 邮件由系统发送,请勿回复!谢谢配合!<br>'

    执行脚本,效果同上!

  • 相关阅读:
    今天不说技术,说说中国的十二生肖告诉了我们什么?这就是我们的祖先!
    JS函数的原型及对象,对象方法,对象属性的学习
    C#3.0特性之列表对象的赋值更容易
    读本地图像文件,在上面写一些文件,再传到WWW服务器上
    【Visual C++】vs2008/2005正确打开vs2010所创建项目的几种方法
    高级Swing容器(一)
    助你成长为优秀的程序员 杰出的软件工程师、设计师、分析师和架构师
    Root Pane Containers(一)
    【Visual C++】关于无法打开包括文件:“StdAfx.h”或者意外结尾的错误解决方案
    20年工作经验的架构师写给程序员的一封信
  • 原文地址:https://www.cnblogs.com/xiao987334176/p/10022026.html
Copyright © 2020-2023  润新知