python核心编程(十四)—邮件

本文介绍如何使用Python通过SMTP服务器发送不同格式的电子邮件,包括纯文本、HTML及带有附件的邮件,并提供了一个测试脚本来验证发送过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

邮件

目录结构

|- FTP
|- - smtp
|- - - config.py
|- - - sendEmailHtml.py
|- - - sendEmailText.py
|- - - sendEmailFile.py
|- - - test.py

代码

我的配置文件 config.py

__author__ = 'junpeng.yang'

file_config = {
    'from_addr': 'wsywno1@126.com',
    'password': 'XXXXXX',
    'to_addr': '',
    'msg': '',
    'smtp_server': 'smtp.126.com'
}

text_config = {
    'from_addr': 'wsywno1@126.com',
    'password': 'XXXXXX',
    'to_addr': '',
    'msg': '',
    'smtp_server': 'smtp.126.com'
}

html_config = {
    'from_addr': 'wsywno1@126.com',
    'password': 'XXXXXX',
    'to_addr': '',
    'msg': '',
    'smtp_server': 'smtp.126.com'
}

将上面的from_addr和password换成自己的邮箱账户和密码。smtp_server换成自己服务商的配置。

发送html格式的邮件 sendEmailHtml.py

# coding:utf-8

import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

from FTP.smtp.config import html_config

config = html_config


def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr(( \
        Header(name, 'utf-8').encode(), \
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))


def __doSendHtml(from_addr=config['from_addr'], password=config['password'], to_addr='', msg='',
               smtp_server=config['smtp_server']):

    msg = MIMEText(msg, 'html', 'utf-8')
    msg['From'] = _format_addr(u'Python爱好者 <%s>' % from_addr)
    msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
    msg['Subject'] = Header(u'来自SMTP的问候……', 'utf-8').encode()

    server = smtplib.SMTP(smtp_server, 25)
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()


def sendHtml(from_addr, password, to_addr, msg, smtp_server):
    if len(to_addr) == 0:
        return

    if len(from_addr) == 0 and len(password) == 0 and len(smtp_server) == 0:
        from_addr = config['from_addr']
        password = config['password']
        smtp_server = config['smtp_server']

    if len(from_addr) != 0 and len(password) != 0 and len(smtp_server) != 0:
        __doSendHtml(from_addr, password, to_addr, msg, smtp_server)

发送文本 sendEmailText.py

# coding:utf-8

import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

from FTP.smtp.config import text_config

config = text_config


def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr(( \
        Header(name, 'utf-8').encode(), \
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))


def __doSendText(from_addr=config['from_addr'], password=config['password'], to_addr='', msg='',
               smtp_server=config['smtp_server']):

    msg = MIMEText(msg, 'plain', 'utf-8')
    msg['From'] = _format_addr(u'Python爱好者 <%s>' % from_addr)
    msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
    msg['Subject'] = Header(u'来自SMTP的问候……', 'utf-8').encode()

    server = smtplib.SMTP(smtp_server, 25)
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()


def sendHtml(from_addr, password, to_addr, msg, smtp_server):
    if len(to_addr) == 0:
        return

    if len(from_addr) == 0 and len(password) == 0 and len(smtp_server) == 0:
        from_addr = config['from_addr']
        password = config['password']
        smtp_server = config['smtp_server']

    if len(from_addr) != 0 and len(password) != 0 and len(smtp_server) != 0:
        __doSendText(from_addr, password, to_addr, msg, smtp_server)

发送各类型的文件 sendEmailFile.py

# coding=utf-8

import mimetypes
import re
import smtplib
from email import encoders
from email.header import Header
from email.mime.multipart import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

from FTP.smtp.config import file_config

from FTP.smtp.Utils import getName

config = file_config


def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((
        Header(name, 'utf-8').encode(),
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))




def __doSendFile(from_addr=config['from_addr'], password=config['password'], to_addr='', message='',
               smtp_server=config['smtp_server'], path=''):
    # 构造MIMEMultipart对象做为根容器
    # 邮件对象:
    msg = MIMEMultipart()
    msg['From'] = _format_addr(u'Python爱好者 <%s>' % from_addr)
    msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
    msg['Subject'] = Header(u'来自SMTP的问候……', 'utf-8').encode()

    # 邮件正文是MIMEText:
    # 构造MIMEText对象做为邮件显示内容并附加到根容器
    msg.attach(MIMEText(message, 'plain', 'utf-8'))

    # 添加附件就是加上一个MIMEBase,从本地读取一个图片:
    with open(path, 'rb') as f:
        # 设置附件的MIME和文件名,这里是png类型:
        names = getName(path)
        if names is not None:
            # name = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
            # name = name + names[len(names) - 2] + '.' + names[len(names) - 1]

            guessType = mimetypes.guess_type(names)
            myType = guessType[0]
            if myType is not None:
                # 测试识别文件类型:mimetypes.guess_type(file_name)
                # ctype,encoding值:
                # rar 文件  None None(ini文件、csv文件、apk文件)
                # txt text/plain None
                # py  text/x-python None
                # gif image/gif None
                # png image/x-png None
                # jpg image/pjpeg None
                # pdf application/pdf None
                # doc application/msword None
                # zip application/x-zip-compressed None
                myTypes = re.split('/', myType)

                mime = MIMEBase(myTypes[0], myTypes[1], filename=names)
                # 加上必要的头信息:
                mime.add_header('Content-Disposition', 'attachment', filename=names)
                mime.add_header('Content-ID', '<0>')
                mime.add_header('X-Attachment-Id', '0')
                # 把附件的内容读进来:
                mime.set_payload(f.read())
                # 用Base64编码:
                encoders.encode_base64(mime)
                # 添加到MIMEMultipart:
                msg.attach(mime)
                server = smtplib.SMTP(smtp_server, 25)
                server.set_debuglevel(1)
                server.login(from_addr, password)
                server.sendmail(from_addr, [to_addr], msg.as_string())
                server.quit()


def sendFile(from_addr, password, to_addr, msg, smtp_server, path):
    if len(to_addr) == 0 or len(path) == 0:
        return

    if len(from_addr) == 0 and len(password) == 0 and len(smtp_server) == 0:
        from_addr = config['from_addr']
        password = config['password']
        smtp_server = config['smtp_server']

    if len(from_addr) != 0 and len(password) != 0 and len(smtp_server) != 0:
        __doSendFile(from_addr, password, to_addr, msg, smtp_server, path)

测试用例 test.py

# coding=utf-8

from FTP.smtp.sendEmailFile import sendFile
from FTP.smtp.SendEmailText import sendText
from FTP.smtp.SendEmailHtml import sendHtml


def run():
    from_addr = raw_input('From: ')
    password = raw_input('Password: ')
    to_addr = raw_input('To: ')
    smtp_server = raw_input('SMTP server: ')
    msg = raw_input('msg: ')
    path = raw_input('path: ')

    # sendHtml(from_addr, password, to_addr, msg, smtp_server)
    sendFile(from_addr, password, to_addr, msg, smtp_server, path)

if __name__ == '__main__':
    run()

参考资料:
Python核心编程
备注:
转载请注明出处:http://blog.youkuaiyun.com/wsyw126/article/details/54613256
作者:WSYW126

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值