个人博客,记录知识防止遗忘
python 编写一个邮件发送函数
python 编写一个邮件发送函数

python 编写一个邮件发送函数

python 编写一个邮件发送函数

centos 7 中发邮件很简单,只需要配置好参数,使用mail 命令就可以了,但是在python中发邮件还是比较麻烦的;
为了解决这个问题,本文编写了一个简单实用的python邮件发送函数,用法类似linux中的mail命令,支持添加各种类型的附件,支持抄送,正文支持html页面。

本文主要使用python 的email.mime模块中的一些功能来实现,email是个功能很强大的模块,此处不展开说明,只利用其编写一个简单的发邮件函数
详细代码如下图

def SendMail(to_receivers=[],cc_receivers=[], subject='', file_name=[], content='正文无内容'):
    '''
    用来发送邮件,没有做异常判断,需要的可以自己优化
    :parm to_receivers   收件人的邮箱,最少1个人,可填多个,类型为list
    :parm cc_receivers   抄送人的邮箱,可不填,也可填多个,类型为list
    :subject  			 邮件主题,必填,类型为字符串
    :file_name			 附件的名称,可不填,类型为list
    :content			 邮件正文,必填,可以是html代码,类型为字符串
    '''
    
    import smtplib
    from email.mime.application import MIMEApplication
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText

    ##################################################
    # 发邮件账号相关配置
    sender = '****此处填写发件账号'
    password = '***此处填写密码***'
    smtp_address = 'smtp.exmail.qq.com'  # 此处填写自己账号对应的smtp服务器
    smtp_port = '465' 					 # 填写端口
    ##################################################

    receivers = to_receivers + cc_receivers  # 全部人

    # 定义邮件正文
    textApart = MIMEText(content, 'html', 'utf-8')

    # 添加附件:    任何资源都可以添加
    # 第1行使用 MIMEApplication 这个类读取资源文件,结果赋值给动态变量expandApart
    # 第2行将已读取的资源(动态变量expandApart)添加到头部
    if len(file_name) >= 1:
        for i in range(len(file_name)):
            exec("expandApart_{0}=MIMEApplication(open(r'{1}', 'rb').read())".format(i, file_name[i]))
            exec("expandApart_{0}.add_header('Content-Disposition', 'attachment', filename=r'{1}')".format(i, file_name[i]))

    # 将定义的正文和附件添加到主题中
    msg = MIMEMultipart()
    msg.attach(textApart)                                   # 添加正文
    if len(file_name) >= 1:
        for i in range(len(file_name)):
            exec("msg.attach(expandApart_{0})".format(i))    # 逐个添加附件

    # 定义邮件主题等
    msg['Subject'] = subject            # 主题
    msg['From'] = sender                # 发件人

    # 收件人,此处必须是字符串,要用join转化 ; 但是sendmail 中必须用数组
    msg['TO'] = ','.join(to_receivers)

    if len(cc_receivers) > 0:                  # 若抄送人未被定义,则不添加进邮件
        msg['Cc'] = ",".join(cc_receivers)
    msg['Accept-Language'] = 'zh-CN'
    msg['Accept-Charset'] = 'ISO-8859-1,utf-8'

    try:
        s = smtplib.SMTP_SSL(smtp_address, smtp_port)
        s.login(sender, password)
        s.sendmail(sender, receivers, msg.as_string())
        s.quit()
        return 'success'
    except smtplib.SMTPException as e:
        return e


    
if __name__ == "__main__":

 #使用举例

	import os
    # 指定目录,就可以不用带绝对路径
    os.chdir(r"C:\Users\good\Desktop")
    filename = [r'aaaa.doc', r'test.xlsx', r'11111.png']
    
    # 也可以使用绝对路径,但是文件名也会包含该路径
    filename += [r'C:\Users\good\Desktop\无标题.xlsx']

    cc = ['cyj_xian@163.com', '845653004@qq.com']   # 抄送人
    to = ['admin@caojie.blog']						# 收件人
    subject = '测试1'								  # 主题
    
    # 正文
    content = '''
            <!DOCTYPE html>
            <html lang="zh-CN">
            <head>
            <meta charset="UTF-8">
            <title>测试</title>
            </head>
            <body>
            <h1>欢迎访问草结笔记  https://caojie.blog </h1>
            <h2>邮件测试</h2>
            </body>
            '''

    status = SendMail(to_receivers=to, cc_receivers=cc,
                      subject=subject,  content=content)
    print(status)

代码执行后,查看邮箱,已经成功收到邮件。
收件人、抄送、附件 都正常。

需要注意的是,当使用绝对路径添加附件后,附件名亦为绝对路径,且不同的邮件客户端显示的名称都不一样。
所以一般不推荐这么用。

image.png

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注