zoukankan      html  css  js  c++  java
  • python使用smtplib和email发送腾讯企业邮箱邮件

      公司每天要发送日报,最近没事搞了一下如何自动发邮件,用的是腾讯企业邮箱,跟大家分享一下我的研究过程吧。

    以前弄的发邮件的是用qq邮箱发的,当时在网上查资料最后达到了能发图片,网页,自定义收件人展示,主题等比较简

    单的,但没想到说发送个word附件,后来才发现原来email里的MIMEText就可以,先上代码吧

    # coding:utf8
    """
    日报
    """
    import smtplib
    import os
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    
    
    class MyEmail:
        def __init__(self):
            self.user = None
            self.passwd = None
            self.to_list = []
            self.cc_list = []
            self.tag = None
            self.doc = None
    
        def send(self):
            """
            发送邮件
            """
            try:
                server = smtplib.SMTP_SSL("smtp.exmail.qq.com", port=465)
                server.login(self.user, self.passwd)
                server.sendmail("<%s>" % self.user, self.to_list, self.get_attach())
                server.close()
                print("send email successful")
            except Exception as e:
                print("send email failed %s" % e)
    
        def get_attach(self):
            """
            构造邮件内容
            """
            attach = MIMEMultipart()
            if self.tag is not None:
                # 主题,最上面的一行
                attach["Subject"] = self.tag
            if self.user is not None:
                # 显示在发件人
                attach["From"] = "发件人姓名,可以自定义<%s>" % self.user
            if self.to_list:
                # 收件人列表
                attach["To"] = ";".join(self.to_list)
            if self.cc_list:
                # 抄送列表
                attach["Cc"] = ";".join(self.cc_list)
            if self.doc:
                # 估计任何文件都可以用base64,比如rar等
                # 文件名汉字用gbk编码代替
                name = os.path.basename(self.doc).encode("gbk")
                f = open(self.doc, "rb")
                doc = MIMEText(f.read(), "base64", "gb2312")
                doc["Content-Type"] = 'application/octet-stream'
                doc["Content-Disposition"] = 'attachment; filename="' + name + '"'
                attach.attach(doc)
                f.close()
            return attach.as_string()
    
    
    if __name__ == "__main__":
        my = MyEmail()
    
        my.user = "name@name.com"
        my.passwd = "password"
        my.to_list = ["", ]
        my.cc_list = ["", ]
        my.tag = "日报"
        my.doc = u"C:Documents and SettingsAdministratorDesktop日报.doc"
        my.send()
    View Code

    首先使用腾讯企业邮箱需要使用ssl,不过在smtplib中有这个功能,一般使用SMTP,需要ssl的时候使用SMTP_SSL,在明白这个之前
    我费了好大的力气去找怎么用ssl,后来才发现原来除了换个模块外别的根本不用变化,
    在登录的时候我用的是@前面的帐号名,一直上不去,一直不知道为什么,第二天心里突然闪过一个想法:把完整邮箱地址当做帐号,一
    试,哈哈,登录成功了
    然后就是发送附件了,首先是需要发送一个word文档,找了半天才发现用
    (from email.mime.text import MIMEText)
    MIMEText就可以,本来我以为他只能处理文本的txt,原来他不仅可以处理文本,doc,rar都可以用它添加到附件里,只要在初始化的
    时候使用base64就可以,后面的参数是doc使用的字符集吧,这个没研究过,不确定
    doc["Content-Type"] = 'application/octet-stream'
    doc["Content-Disposition"] = 'attachment; filename=123.doc'

    这个指定类型和描述,在描述里可以自定义文件名貌似这个文件名是gbk编码的,
    我的附件名字是中文,先使用u""把文件名声明为unicode,再转为gbk,如果使用unicode的话好像不行,文件名会变成系统定义的文件
    名,不过文件仍然可以用,下载下来改个名字没什么区别,使用utf8会出现乱码
    好吧,发现一个漏洞,抄送的邮件没发出去

    server.sendmail("<%s>"%self.user, self.to_list, self.get_attach())
    中第二个参数表示的是想要发送到的地址,需要把抄送的地址也放在这个列表里,如下
    server.sendmail("<%s>"%self.user, self.to_list + self.cc_list, self.get_attach())
    至于在构造邮件时设置的不用变,那个只起到显示的作用,和发给谁没关系,只是在邮件内容中说明了一下发给谁,抄送给谁而已,实际
    上谁真正收到需要在sendmail里添加
  • 相关阅读:
    【BZOJ4367】[IOI2014]holiday假期 分治+主席树
    【BZOJ1264】[AHOI2006]基因匹配Match DP+树状数组
    【BZOJ4379】[POI2015]Modernizacja autostrady 树形DP
    【BZOJ4380】[POI2015]Myjnie 区间DP
    【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组
    【BZOJ4384】[POI2015]Trzy wieże 树状数组
    【BZOJ4388】JOI2012 invitation 堆+线段树+并查集(模拟Prim)
    【BZOJ4550】小奇的博弈 博弈论
    Sqlserver列出所有数据库名,表名,字段名
    聚合与组合的区别?
  • 原文地址:https://www.cnblogs.com/dyfblog/p/4294172.html
Copyright © 2011-2022 走看看