python发送邮件

本文来源:https://www.cnblogs.com/yangguanghuayu/p/11778610.html

本文来源:https://www.cnblogs.com/insane-Mr-Li/p/10071803.html

一、说明

python发送邮件:

python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。

smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。

email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。

二、smtplib模块

import smtplib

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

login()方法用来登录SMTP服务器,

sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list

邮件正文是一个stras_string()MIMEText对象变成str

quit():用于结束SMTP会话。

 三、email模块

3.1  模块说明

email模块下有mime包,mime英文全称为“Multipurpose Internet Mail Extensions”,即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范。

该mime包下常用的有三个模块:text,image,multpart

构造一个邮件对象就是一个Message对象,

如果构造一个MIMEText对象,就表示一个文本邮件对象,

如果构造一个MIMEImage对象,就表示一个作为附件的图片,

要把多个对象组合起来,就用MIMEMultipart对象,

MIMEBase可以表示任何对象。它们的继承关系如下:

Message
+- MIMEBase
   +- MIMEMultipart
   +- MIMENonMultipart
      +- MIMEMessage
      +- MIMEText
      +- MIMEImage

3.2  text说明

邮件发送程序为了防止有些邮件阅读软件不能显示处理HTML格式的数据,通常都会用两类型分别为"text/plain"和"text/html"

构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,最后一定要用utf-8编码保证多语言兼容性。

3.3  multpart说明

常见的multipart类型有三种:multipart/alternative, multipart/related和multipart/mixed。

邮件类型为"multipart/alternative"的邮件包括纯文本正文(text/plain)和超文本正文(text/html)。

邮件类型为"multipart/related"的邮件正文中包括图片,声音等内嵌资源。

邮件类型为"multipart/mixed"的邮件包含附件。向上兼容,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型。

无脑用mix就对了。

我们必须把Subject,From,To,Cc,Date添加到MIMEText对象或者MIMEMultipart对象中,邮件中才会显示主题,发件人,收件人,抄送人,时间(若无时间,就默认一般为当前时间,该值一般不设置)。

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

msg = MIMEMultipart('mixed')
msg['Subject'] = 'Python email test'
msg['From'] = 'XXX@163.com <XXX@163.com>'
msg['To'] = 'XXX@126.com'
msg['Cc'] = 'XXX@qq.com'
msg['Date']='2012-3-16'

msg.attach(MIMEText对象或MIMEImage对象):

将MIMEText对象或MIMEImage对象添加到MIMEMultipart对象中。

MIMEMultipart对象代表邮件本身,MIMEText对象或MIMEImage对象代表邮件正文。

以上的构造的文本,超文本,附件,图片都何以添加到MIMEMultipart('mixed')中:

msg.attach(text_plain)    
msg.attach(text_html)    
msg.attach(text_att)    
msg.attach(image)

3.4 代码展示

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.header import Header


def send_mail(email_subject, file_path, new_name, to_add):
    # 设置smtplib所需的参数
    server = 'smtp.163.net'
    s_smtp = smtplib.SMTP(server, 25)
    s_smtp.connect(server)
    s_smtp.login('xxx163.com', '123456789')
    # 构造邮件对象MIMEMultipart对象
    from_add = 'xxx163.com'
    cc_add = ['xxx163.com', 'xxxx@qq.ocm']
    msg = MIMEMultipart('mixed')
    msg['Subject'] = email_subject
    msg['From'] = from_add
    msg['To'] = ','.join(to_add)
    msg['Cc'] = ','.join(cc_add)
    # msg['Date'] = '2020-03-05'
    sent_html_text(msg)
    sent_plain_text(msg)         # plain形式必须放在html形式之后,否则不显示
    sent_picture(msg)
    sent_insert_picture(msg)
    sent_attachment(msg, file_path, new_name)
    s_smtp.sendmail(from_add, msg['to'].split(',') + msg['Cc'].split(','), str(msg))
    print('{},发送完成'.format(file_path))
    s_smtp.quit()



def sent_html_text(msg):
    # 构造文字内容
    text_1 = '''<font style="font-family:宋体">宋体</font><br />'''
    text_2 = '''<font color="#0000dd">浅蓝色</font><br />'''
    text_3 = """<font size="7">7号字体</font><br />"""
    text_4 = """<i>这是斜体文字</i><br />"""
    text_5 = """<b>这是粗体文字</b><br />"""
    text_6 = """<font style="font-family:宋体", color="#0000dd", size="7"><i><b>宋体,浅蓝色,7号字体,斜体,粗体</font></i><b><br />"""
    text = text_1 + text_2+text_3+text_4+text_5+text_6
    text_html = MIMEText(text, "html", "utf-8")
    msg.attach(text_html)


def sent_plain_text(msg):
    # 构造文字内容
    text = '这是测试文字
换一行试试'
    text_plain = MIMEText(text, "plain", "utf-8")
    msg.attach(text_plain)

def sent_picture(msg):
    # 构造图片对象
    sendimagefile = open(r'E:测试ceshiexcel.png', 'rb').read()
    image = MIMEImage(sendimagefile)
    image.add_header('Content-ID', '<image1>')
    # 对图片重命名
    image["Content-Disposition"] = 'attachment; filename="testimage.png"'
    msg.attach(image)

def sent_insert_picture(msg):
    # 以内嵌的方式将图片插入
    images =  ['x.png', 'y.png', 'z.png']
    mail_msg = ''
    for i in range(len(images)):
        mail_msg += '<p><img src="cid:image%d" height="1000" width="1300"></p>' % (i + 1)
    msg.attach(MIMEText( mail_msg, 'html', 'utf-8'))

    for i, img_name in enumerate(images):
        with open(img_name, 'rb') as fp:
            img_data = fp.read()
        msg_image = MIMEImage(img_data)
        msg_image.add_header('Content-ID', '<image%d>' % (i + 1))
        msg.attach(msg_image)


def sent_attachment(msg, file_path,  new_name):
    # 构造附件
    sendfile = open(file_path, 'rb').read()
    att = MIMEText(sendfile, 'base64', 'utf-8')
    att["Content-Type"] = 'application/octet-stream'
    # 以下附件可以重命名,命名必须是英文字母和数字等,不能出现汉字
    att["Content-Disposition"] = 'attachment; filename={new_name}'.format(new_name=new_name)
    msg.attach(att)


if __name__ == '__main__':
    email_subject = '测试文件'
    file_path = r'E:测试我是测试文件.xlsx'
    new_name = 'ceshi.xlsx'
    to_add = ['xxx@qq.com', 'xxx@163.com', 'xxx@163.com']
    send_mail(email_subject, file_path, new_name, to_add)

3.5 字体效果展示

原文地址:https://www.cnblogs.com/qianslup/p/12421404.html