前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 基于Python实现邮件发送

Python 基于Python实现邮件发送

作者头像
授客
发布2019-09-11 14:19:30
5820
发布2019-09-11 14:19:30
举报
文章被收录于专栏:授客的专栏

测试环境:

Python版本:Python 2.7

注:需要修改mimetypes.py文件(该文件可通过文章底部的网盘分享连接获取),否则会报错,类似如下

mimetypes.guess_type 'ascii' codec can't decode byte 0xb0 in position 1: ord

实现功能:

邮件发送,支持文字,音频文件,文本文件,图形文件,应用程序及其它类型文件的发送;

支持不同的邮箱;

支持一次性往多个邮箱发送;

支持一次性发送n个附件;

支持中文命名的附件发送;

效果:

mail.conf配置:

代码语言:javascript
复制
[SMTP]
代码语言:javascript
复制
login_user = laiyuhenshuai@163.com
代码语言:javascript
复制
login_pwd = xxxxx
代码语言:javascript
复制
from_addr =  laiyuhenshuai@163.com
代码语言:javascript
复制
to_addrs = ['mrxxx@163.com','1033553122@qq.com']
代码语言:javascript
复制
host = smtp.163.com
代码语言:javascript
复制
port = 25
代码语言:javascript
复制

说明:不同类型的邮箱(发件人邮箱),需要修改配置文件为对应的host和端口

smtp.163.com:25

smtp.qq.com:465

实践代码:

代码语言:javascript
复制
#!/usr/bin/env python
代码语言:javascript
复制
# -*- coding:GBK -*-
代码语言:javascript
复制
__author__ = 'shouke'
代码语言:javascript
复制
代码语言:javascript
复制
import ConfigParser
代码语言:javascript
复制
import smtplib
代码语言:javascript
复制
from email.mime.multipart import MIMEMultipart
代码语言:javascript
复制
from email.mime.text import MIMEText
代码语言:javascript
复制
from email.mime.image import MIMEImage
代码语言:javascript
复制
from email.mime.audio import MIMEAudio
代码语言:javascript
复制
from email.mime.application import MIMEApplication
代码语言:javascript
复制
import mimetypes
代码语言:javascript
复制
import os
代码语言:javascript
复制
代码语言:javascript
复制
class MyMail:
代码语言:javascript
复制
    def __init__(self, mail_config_file):
代码语言:javascript
复制
        config = ConfigParser.ConfigParser()
代码语言:javascript
复制
        config.read(mail_config_file)
代码语言:javascript
复制
代码语言:javascript
复制
        self.smtp = smtplib.SMTP()
代码语言:javascript
复制
        self.login_user = config.get('SMTP', 'login_user')
代码语言:javascript
复制
        self.login_pwd = config.get('SMTP', 'login_pwd')
代码语言:javascript
复制
        self.from_addr = config.get('SMTP', 'from_addr')
代码语言:javascript
复制
        self.to_addrs = config.get('SMTP', 'to_addrs')
代码语言:javascript
复制
        self.host = config.get('SMTP', 'host')
代码语言:javascript
复制
        self.port = config.get('SMTP', 'port')
代码语言:javascript
复制
代码语言:javascript
复制
    # 连接到服务器
代码语言:javascript
复制
    def connect(self):
代码语言:javascript
复制
        self.smtp.connect(self.host, self.port)
代码语言:javascript
复制
代码语言:javascript
复制
    # 登陆邮件服务器
代码语言:javascript
复制
    def login(self):
代码语言:javascript
复制
        try:
代码语言:javascript
复制
            self.smtp.login(self.login_user, self.login_pwd)
代码语言:javascript
复制
        except Exception as e:
代码语言:javascript
复制
            print('%s' % e)
代码语言:javascript
复制
代码语言:javascript
复制
    # 发送邮件
代码语言:javascript
复制
    def send_mail(self, mail_subject, mail_content, attachment_path_set):
代码语言:javascript
复制
         # 构造MIMEMultipart对象做为根容器
代码语言:javascript
复制
        msg = MIMEMultipart()
代码语言:javascript
复制
        msg['From'] = self.from_addr
代码语言:javascript
复制
        # msg['To'] = self.to_addrs        

    msg['To'] = ','.join(eval_r(self.to_addrs))
代码语言:javascript
复制
        msg['Subject'] = mail_subject
代码语言:javascript
复制
代码语言:javascript
复制
        # 添加邮件内容
代码语言:javascript
复制
        content = MIMEText(mail_content, _charset='gbk')
代码语言:javascript
复制
        msg.attach(content)
代码语言:javascript
复制
代码语言:javascript
复制
        for attachment_path in attachment_path_set:
代码语言:javascript
复制
            if os.path.isfile(attachment_path): # 如果附件存在
代码语言:javascript
复制
                type, coding = mimetypes.guess_type(attachment_path)
代码语言:javascript
复制
                if type == None:
代码语言:javascript
复制
                    type = 'application/octet-stream'
代码语言:javascript
复制
代码语言:javascript
复制
                major_type, minor_type = type.split('/', 1)
代码语言:javascript
复制
                with open(attachment_path, 'rb') as file:
代码语言:javascript
复制
                    if major_type == 'text':
代码语言:javascript
复制
                        attachment = MIMEText(file.read(), _subtype=minor_type)
代码语言:javascript
复制
                    elif major_type == 'image':
代码语言:javascript
复制
                        attachment = MIMEImage(file.read(),  _subtype=minor_type)
代码语言:javascript
复制
                    elif major_type == 'application':
代码语言:javascript
复制
                        attachment = MIMEApplication(file.read(), _subtype=minor_type)
代码语言:javascript
复制
                    elif major_type == 'audio':
代码语言:javascript
复制
                        attachment = MIMEAudio(file.read(), _subtype=minor_type)
代码语言:javascript
复制
代码语言:javascript
复制
                # 修改附件名称
代码语言:javascript
复制
                attachment_name = os.path.basename(attachment_path)
代码语言:javascript
复制
                attachment.add_header('Content-Disposition', 'attachment', filename = ('gbk', '', attachment_name))
代码语言:javascript
复制
代码语言:javascript
复制
                msg.attach(attachment)
代码语言:javascript
复制
代码语言:javascript
复制
        # 得到格式化后的完整文本
代码语言:javascript
复制
        full_text = msg.as_string()
代码语言:javascript
复制
代码语言:javascript
复制
        # 发送邮件
代码语言:javascript
复制
        self.smtp.sendmail(self.from_addr, eval_r(self.to_addrs), full_text)
代码语言:javascript
复制
代码语言:javascript
复制
    # 退出
代码语言:javascript
复制
    def quit(self):
代码语言:javascript
复制
        self.smtp.quit()
代码语言:javascript
复制
代码语言:javascript
复制
if __name__ == '__main__':
代码语言:javascript
复制
    mymail = MyMail('./mail.conf')
代码语言:javascript
复制
    mymail.connect()
代码语言:javascript
复制
    mymail.login()
代码语言:javascript
复制
    mail_content = 'hello,亲,这是一封测试邮件,收到请回复^^ 2014'
代码语言:javascript
复制
    mymail.send_mail('邮件标题--亲,收到一份邮件,请及时查收', mail_content, {'d:\\shouke.csv', 'd:\\2345haoya_3.1.1.9229.exe',
代码语言:javascript
复制
                                              'd:\\shouke.ini','d:\\shouke.ini', 'd:\\test.mp3', 'd:\\test.png', 'd:\\report20150507204645.html',
代码语言:javascript
复制
                                              'd:\\1 - 副本.sql'})
代码语言:javascript
复制
    mymail.quit()

pdf版本及mimetypes.py下载地址: http://pan.baidu.com/s/1P3C3W

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-12-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档