使用Python发送邮件, 抄送多个收信人以及添加附件

在豆瓣主题 "python发送带附件的gmail邮件" 看到的可以发送附件的Python代码.
自己根据需求增加了抄送和暗抄多个收信人的功能.
抄送部分整理自Python发送邮件时的抄送问题
另外在原有的发送 *.txt, *.jpg, *.MP3类型附件的基础上, 还增加了另一个添加附件的方法附件, 允许发送 pdf, word文档 和excel 等办公文档.

##完整代码使用gmail实现
##如果是其他邮箱发信,比如126, 只需修改服务器极其端口
    mail_server = 'smtp.126.com' 
    mail_server_port = 25 
#coding: utf-8
## define encironment
                ##1 邮箱登录信息
                ##2 发件人和收件人信息
                ##3 邮件主题及内容编辑
                ##4 定义收信人以及抄送和暗抄对象
                ##5 添加附件
                ##6 登录服务器
                ##7 发送邮件

    ##完整代码使用gmail实现
    ##如果是其他邮箱发信,比如126, 只需修改服务器极其端口以及用户名密码
    ##  mail_server = 'smtp.126.com' 
    ##  mail_server_port = 25 

## define encironment
import smtplib 
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.application import MIMEApplication
import os, mimetypes


## 添加附件: 可以发送包括英文txt, jpg , mp3, 注意不能发送pdf doc excel ppt
def add_attachment(filepath):
    ctype, encoding = mimetypes.guess_type(filepath)
    if ctype is None or encoding is not None: 
        ctype = "application/octet-stream"
    maintype, subtype = ctype.split("/", 1)

    if maintype == 'text':
        fp = open(filepath)
        attachment = MIMEText(fp.read(), _subtype=subtype)
        fp.close()
    elif maintype == 'image':
        fp = open(filepath, 'rb')
        attachment = MIMEImage(fp.read(), _subtype=subtype)
        fp.close()
    elif maintype == 'audio':
        fp = open(filepath, 'rb')
        attachment = MIMEAudio(fp.read(), _subtype=subtype)
        fp.close()
    else:
        fp = open(filepath, 'rb')
        attachment = MIMEBase(maintype, subtype)
        attachment.set_payload(fp.read())
        fp.close()
        encoders.encode_base64(attachment)

    baseName = os.path.basename(filepath)
    attachment.add_header('Content-Disposition', 'attachment', filepath=filepath,  filename=baseName)
    msg.attach(attachment)
    print(filepath, 'added')

## 邮箱登录信息
username = '[email protected]' ## 用户名 
password = 'password' ## 密码 

##发件人和收件人信息
sender = '[email protected]' ## 发件人邮箱, 多人逗号分开
receiver = '[email protected],[email protected]' ## 收件人邮箱, 多人逗号分开
cc='[email protected],[email protected]'  # #抄送邮箱, 多人逗号分开
bcc='[email protected],[email protected]' # 暗抄邮箱, 多人逗号分开

##邮件内容编辑
##邮件主题
subject = 'Python gmail test'
########### email内容, html有格式的文档 ##############
mail_content = '

Python gmail测试

' ############# ## 所有收信人以及抄送和暗抄对象都一样, ##放在都一样 server.sendmail(sender, toaddrs, msg.as_string()) 第二个参数toaddrs里面 ##具体区别收信人以及抄送和暗抄对象, ##都由server.sendmail(sender, toaddrs, msg.as_string()) 第三个参数里面msg里面的关键词决定 ############# msg = MIMEMultipart() msg.add_header('From',username) msg.add_header('To',receiver) msg.add_header('Cc',cc) msg.add_header('BCc',bcc) msg.add_header('Subject',subject) msg.add_header('Date',subject) msg.attach(MIMEText(mail_content, 'html')) ##所有收信人信息 toaddrs = [receiver] + [cc] + [bcc] ##########################添加附件 ## 有两种方法添加附件 ##filepath ="D:\\test.jpg" ##绝对路径 ##方法一 #可发送英文txt, jpg , mp3, 不能发送pdf doc excel ppt ##方法二 #可发送中英文txt, 中英文docx,jpg , pdf, excel 和ppt, 但是不能发送mp3 ##这里把所有附件放到一个列表里面, jpg , mp3 文件方法一添加, 其他文件类型都用第二种方法添加 ########################## Files=['temp.txt','test.jpg', 'song.mp3','file.pdf'] for filepath in Files: ctype, encoding = mimetypes.guess_type(filepath) if ctype is None or encoding is not None: ctype = "application/octet-stream" maintype, subtype = ctype.split("/", 1) if maintype in['image','audio']: add_attachment(filepath) else: baseName = os.path.basename(filepath) att = MIMEApplication(open(filepath,'rb').read()) att.add_header('Content-Disposition', 'attachment', filename=baseName) msg.attach(att) print(filepath, 'added') #############发送 mail_server = 'smtp.gmail.com' mail_server_port = 587 server = smtplib.SMTP(mail_server, mail_server_port) # server.set_debuglevel(1) # 调试模式 server.ehlo() server.starttls() server.login(username, password) server.sendmail(sender, toaddrs, msg.as_string()) server.quit()

你可能感兴趣的:(使用Python发送邮件, 抄送多个收信人以及添加附件)