乐趣区

关于python:利用py实现邮件群发功能办公必备利器

小编目前还是一个在惨遭社会践踏的低级码农,随随便便的一个高难度技术问题,好像就成了压死我的最初那根稻草,好在这个时代还是有太多的人有着贡献和开源的精力,真的是实属不易的一种情怀。

感激有很多开源的好我的项目可能让像我这种的小菜鸟搬搬砖,混口饭吃,开源不易,感激那些奋斗在一线的开源大佬,致以最深的敬意。

明天给大家分享的是邮件群发的代码程序,非常适合业务员或者是一些常常和邮件打交道的办公人员。之所以有后面的那席话就是因为这程序就是在码云下面搜寻的,而后本人简略的改了下应用的。附开源地址:
https://gitee.com/IT_CTO/mass…

我只是在原有的根底上简略的解决了下,顺便做了些正文,不便大家的查看,代码如下:


# -*- coding: utf-8 -*-
from email import encoders
import os
import traceback
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import time




# 中文解决
def _format_addr(s):
    #.parseaddr(address) 是模块中专门用来解析邮件地址的函数, 返回一个 tuple
    name, addr = parseaddr(s)
    #元组拆包  name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))
    #formataddr(pair) 和 parseaddr 函数相同,formataddr 函数是构建邮件地址的,传入一个 tuple,返回 str


def send_email(to_addr_in, filepath_in, userId, user):
    # 邮件发送和接管人配置
    i = 0
    from_addr = ''password =''  # 这是你邮箱的第三方受权客户端明码,并非你的登录明码
    for user,pwd in user.items():
        if i == userId:
            from_addr = user.replace('\r', '').replace('\n','').replace('\t', '')
            password = pwd.replace('\r', '').replace('\n','').replace('\t', '')
            break
        i+=1
    smtp_server = 'smtp.163.com'
    to_addr = to_addr_in
    to_addrs = to_addr.split(',')
    msg = MIMEMultipart()
    msg['From'] = _format_addr('群发测试题目 <%s>' % from_addr)  # 显示的发件人
    msg['To'] = ",".join(to_addrs)  # 多个显示的收件人
    msg['Subject'] = Header('群发邮件测试 -- 形容', 'utf-8').encode()  # 显示的邮件题目
    # 须要传入的门路
    # filepath = r'D:\test'
    filepath = filepath_in
    r = os.path.exists(filepath)
    if r is False:
        msg.attach(MIMEText('Hello world, 邮件测试!!!\r\n', 'plain', 'utf-8'))
    else:
        # 邮件注释是 MIMEText:
        msg.attach(MIMEText('这里是邮件的注释内容!!!\n 请查收附件...    \n', 'plain', 'utf-8'))
        # 遍历指定目录,显示目录下的所有文件名
        pathDir = os.listdir(filepath)
        for allDir in pathDir:
            child = os.path.join(filepath, allDir)
            #print(child.encode('utf-8').decode('gbk'))  # .decode('gbk') 是解决中文显示乱码问题
            # 增加附件就是加上一个 MIMEBase,从本地读取一个文件
            with open(child, 'rb') as f:
                # 设置附件的 MIME 和文件名,这里是 txt 类型:
                mime = MIMEBase('file', 'xls', filename=allDir)
                # 加上必要的头信息:
                mime.add_header('Content-Disposition', 'attachment', filename=allDir)
                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)
    try:
        server = smtplib.SMTP(smtp_server, 25)
        # server.starttls()
        server.set_debuglevel(1)  # 用于显示邮件发送的执行步骤
        server.login(from_addr, password)
        #print(to_addrs)
        server.sendmail(from_addr, to_addrs, msg.as_string())
        server.quit()
        return 1
    except Exception:
        return -1




def read_user(user):
    f = open("mail_user.txt")  # 返回一个文件对象
    line = f.readline()  # 调用文件的 readline() 办法
    i=1
    username = ''pwd =''
    while line:
        line = line.replace('\r', '').replace('\n','').replace('\t', '')
        if i%2 != 0:
            username = line
            #print("username=",username)
        else:
            pwd = line
            #print("pwd=", pwd)
            user[username] = pwd
        line = f.readline()
        i+=1
    f.close()
    #print("\n")
    #print(user)

if __name__ == '__main__':
    # 账号密码寄存
    user = {}
    read_user(user)
    i = 0
    userId = 0
    f = open("to_user.txt")  # 返回一个文件对象
    line = f.readline()  # 调用文件的 readline() 办法
    while line:
        i+=1
        line = line.replace('\r','').replace('\n','').replace('\t','')
        if send_email(line, 'test',userId, user) == -1:
            print(i)
            break
        userId += 1  #应用哪个用户 ID 发送邮件。if userId >= len(user):
            userId = 0
        time.sleep(3) #不提早的话,发送 100 以上账号就会被停用。line = f.readline()
    f.close()

在 Pycharm 中右击运行 email1.py,能够看到如下图的操作,即代表程序运行胜利。

mail_user.txt 放的是你邮箱的 STMP 受权账号,to_user,放的是你想要发送的邮件地址。

以上就是明天给大家分享的内容,邮件群发程序获取获取请在后盾回复:邮件群发。

退出移动版