• 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 字体效果展示

  • 相关阅读:
    EdgeDB 1.0 Alpha 4 发布了
    静态文件请求路径 rewrite nginx && openresty 实现
    Giving Application Pools Event Log Access
    一张图看懂ASP.NET MVC5认证和授权过滤器的执行顺序
    git check-ignore
    What does “Challenge” term stand for?
    Implementing MVC 5 IAuthenticationFilter
    HttpContext.Current.User is null even though Windows Authentication is on
    When should the volatile keyword be used in C#?
    HttpApplicationState.Remove(String) Method
  • 原文地址:https://www.cnblogs.com/qianslup/p/12421404.html
Copyright © 2020-2023  润新知