精华内容
下载资源
问答
  • python3批量发送邮件

    千次阅读 2018-04-29 10:00:20
    这次介绍运用python3批量发送邮件。使用这个功能,我们可以在爬虫中将程序遇到的问题发送到指定邮件,以便及时处理断掉的爬虫。在python中对发送邮件协议STMP的支持有两个模块:smtplib和email两个模块,前者负责...

    这次介绍运用python3批量发送邮件。使用这个功能,我们可以在爬虫中将程序遇到的问题发送到指定邮件,以便及时处理断掉的爬虫。在python中对发送邮件协议STMP的支持有两个模块:smtplib和email两个模块,前者负责发送邮件,后者负责构造邮件。为实现这个功能,我们首先需要两个邮箱,笔者使用网易163邮箱发送,qq邮箱接收。

    开始之前需要先对网易邮箱进行设置,开通SMTP服务,具体操作见下图


    按照图中的1,2,3以及提示进行操作并设置授权码,此授权码用于第三方登录,也就是我们用第三方软件比如手机“电子邮箱”app进行登录163邮箱时输入的密码不是登录密码,而是授权码。


    设置成功后的状态。

    设置好之后,进行编写代码

    from email.header import Header #处理邮件主题
    from email.mime.text import MIMEText # 处理邮件内容
    from email.utils import parseaddr, formataddr #用于构造特定格式的收发邮件地址
    import smtplib #用于发送邮件
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    from_addr = '******@163.com'
    password = '授权码'
    to_addr = 'QQ号@qq.com'
    smtp_server = 'smtp.163.com'
    msg = MIMEText('Python 爬虫爬取', 'plain','utf-8')
    msg['From'] = _format_addr('发送<%s>'%from_addr)
    msg['To'] = _format_addr('接收<%s>'%to_addr)
    msg['Subject'] = Header('这是邮件主题:一号爬虫运行','utf-8').encode()
    server = smtplib.SMTP(smtp_server,25)
    server.login(from_addr, password)
    server.sendmail(from_addr, to_addr, msg.as_string())
    server.quit()

    运行程序会在qq邮箱收到下面的邮件信息:


    如果我们想将相同的邮件内容发给不同的人,我们只需构造一个for循环,依次拿去收件人地址发送即可:

    from email.header import Header #处理邮件主题
    from email.mime.text import MIMEText # 处理邮件内容
    from email.utils import parseaddr, formataddr #用于构造特定格式的收发邮件地址
    import smtplib #用于发送邮件
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    from_addr = '******@163.com'
    password = '授权码'
    to_addrs = ['QQ号@qq.com','***@163.com',……]#这里存放批量的邮件地址,或者我们也可以从本地存放邮件地址的文件中读取
    smtp_server = 'smtp.163.com'
    msg = MIMEText('Python 爬虫爬取', 'plain','utf-8')
    msg['From'] = _format_addr('发送<%s>'%from_addr)
    msg['Subject'] = Header('这是邮件主题:一号爬虫运行','utf-8').encode()
    server = smtplib.SMTP(smtp_server,25)
    server.login(from_addr, password)
    for to_addr in to_addrs:
        msg['To'] = _format_addr('接收<%s>'%to_addr)
        try:
            server.sendmail(from_addr, to_addr, msg.as_string())
        except:
            print('发送失败,再次尝试')
            server.sendmail(from_addr, to_addr, msg.as_string())
        print('发送邮件到'+to_addr)
    server.quit()

    运行改程序后,收件邮箱会收到相应的邮件。

    上图是笔者在notebook中运行的结果。

    这就是本篇博客的全部内容,欢迎大家批评指正,留言交流。


    展开全文
  • Python-邮件批量处理-已读状态或移动

    千次阅读 2018-12-31 01:08:07
    通常,我们会碰到想批量邮件处理的情况,例如: 1. 把邮箱INBOX中的所有邮件置为已读 2. 把邮箱INBOX中的邮件全部移入到一个备份目录中,例如bak 但是可能客户端支持的不是很好,这时,我们可以使用python库来...

    (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

    通常,我们会碰到想批量把邮件处理的情况,例如:

    1. 把邮箱INBOX中的所有邮件置为已读
    2. 把邮箱INBOX中的邮件全部移入到一个备份目录中,例如bak

    但是可能客户端支持的不是很好,这时,我们可以使用python库来轻松处理
    通过参考python库中的IMAP4_SSL的用法,以及rfc3501文档中FLAGS支持的标记位,我们可以知道怎么来处理。

    参考rfc3501中的 2.3.2 Flags Message Attribute,我们可以找出一个邮件的状态位有那些:
    \Seen  Message has been read
    \Answered Message has been answered
    \Flagged Message is "flagged" for urgent/special attention
    \Deleted Message is "deleted" for removal by later EXPUNGE
    \Draft  Message has not completed composition (marked as a draft).
    \Recent  Message is "recently" arrived in this mailbox.
    其中,我们重点关注\Seen---已读标记,\Deleted---删除标记,该标记在后续执行expunge后会确定删除。

    IMAP4_SSL库提供了对rfc3501中使用的支持:
    login(user, password) login to sever
    create(mailbox) Create new mailbox named mailbox.
    select(mailbox='INBOX', readonly=False)  Select a mailbox.
    copy(message_set, new_mailbox) Copy message_set messages onto end of new_mailbox.
    fetch(message_set, message_parts)  Fetch (parts of) messages.
    search(charset, criterion[, ...]) Search mailbox for matching messages. charset may be None
    recent() Prompt server for an update.
    store(message_set, command, flag_list) Alters flag dispositions for messages in mailbox.
    expunge() Permanently remove deleted items from selected mailbox.
    close() Close currently selected mailbox.Deleted messages are removed from writable mailbox.
    shutdown() Close connection established in open
    其中,我们重点关注store方法,store方法可以用于对邮件FLAGS的置位

    例子1如下:是置位为已读的处理例子,适用与处理sohu邮箱的INBOX中邮件:
    主要借助store方法,把所有INBOX中的邮件,都添加\Seen标记

    #!/usr/bin/python
    from imaplib import IMAP4_SSL
    import sys
    if (len(sys.argv) != 3):
        print("Useage: {} user passowrd".format(sys.argv[0]))
        sys.exit(1)
    
    user=sys.argv[1]
    userpass=sys.argv[2]
    
    #set all mail in INBOX seen 
    s=IMAP4_SSL('imap.sohu.com', 993)
    s.login(user, userpass)
    rsp, msgs=s.select('INBOX')
    seq='1:{}'.format(eval(msgs[0]))
    s.store((seq), '+FLAGS', '(\\Seen)')
    s.close()
    s.logout()
    print('IMAP: set {} mails to \Seen flag '.format(eval(msgs[0])))

    例子2如下,是把INBOX中邮件都移入到bak中,并删除掉INBOX中邮件:
    主要借助copy方法把邮件复制到bak中,并借助store方法置位\\Deleted标记

    #!/usr/bin/python
    from imaplib import IMAP4_SSL
    import sys
    if (len(sys.argv) != 4):
        print("Useage: {} user passowrd destmailbox".format(sys.argv[0]))
        sys.exit(1)
    
    user=sys.argv[1]
    userpass=sys.argv[2]
    destmailbox=sys.argv[3]
    
    #login 
    s=IMAP4_SSL('imap.sohu.com', 993)
    s.login(user, userpass)
    
    #move mail to bak
    rsp, msgs=s.select(destmailbox)
    if (rsp == 'NO'):
        s.create(destmailbox)
        print('IMAP: create mail box ' + destmailbox)
    rsp, msgs=s.select('INBOX')
    if (eval(msgs[0]) == 0):
        print('INBOX is empty, no need to move')
        sys.exit()
    seq='1:{}'.format(eval(msgs[0]))
    s.copy((seq), destmailbox)
    s.store((seq), '+FLAGS', '(\\Deleted)')
    s.close()
    s.logout()
    print('IMAP: move {} mails to {}'.format(eval(msgs[0]), destmailbox))

    除了上面两个例子中常用的情况,也能通过IMAP提供的方法做一些其它定制处理:
    例如批量把含有某关键字的信息的邮件找出来,移入到特定信箱等。

    (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

    参考:https://docs.python.org/3/library/imaplib.html
    参考:https://tools.ietf.org/html/rfc3501#section-6.4.6
    参考:https://stackoverflow.com/questions/3527933/move-an-email-in-gmail-with-python-and-imaplib
     

    展开全文
  • python处理电子邮件

    千次阅读 2011-04-29 11:50:00
    如果你有大量邮箱要批量处理他们的邮件 如果有手工处理一定会很慢 下面用python提供的邮件库处理, 通过这个库可以方便的发送和接收电子邮件 代码很短 直接上代码 发送代码  #!...

    如果你有大量邮箱要批量处理他们的邮件 如果有手工处理一定会很慢

    下面用python提供的邮件库处理,

    通过这个库可以方便的发送和接收电子邮件 代码很短

    直接上代码

    发送代码

     

     

    接收邮件 根据发件人并提取出指定邮件

    展开全文
  • 网上查群发邮件源码大概Python最多(没有验证过,要较真请绕道!),有很多是写得不错的,但是用得还不是特别顺手,所以请人按我的要求写了一个,经过多次修改成了现在的样子,还蛮好用;这个推送程序的亮点是操作...

    虽然现在邮件用得越来越少,但跟即时通讯相比,邮件还是有它一些独有的特质,因此某些事务中还是会用到它。
    SuiteCRM有群发邮件功能,但因为目前国家相关部门的规定限制,通常一个邮箱每天只能发1000个邮件,而且有一定的节奏要求,所以无法使用SuiteCRM来群发邮件,为了完成相应的业务,必须有另外招数。
    通常的分享只考虑发或收,在此两个方向都考虑到了,而且结合CRM就可以把相关信息更有针对性地保留下来,并且分配给相关人员。

    在此分享一个群发2万份邮件具体思路
    Python是眼下最简单有效解决小问题的编程语言,所以选择Python。在网上可以找到很多Python收发邮件的例子,也不需要很长代码。
    整体思路:
    这是一个从成本角度无法全自动的项目,只能分段进行自动化。

    1. 从SuiteCRM导出相关的邮箱地址,进行删选,然后生成Python可读地址文件;
    2. 用Python写一个推送程序,大概200行足矣,账号、密码、发送节奏,循环次数都存放在一个设置文件里,以便随时修改,发送日志;
    3. 用Python回信处理程序,账号、密码存放在一个设置文件里,以便随时修改,收邮件清单,以便批量处理,特别针对无效邮箱。

    具体做法:
    在此同各位分享一下具体步骤中的一些细节

    1. 因为在SuiteCRM的界面上总是有些绊手绊脚的,所以这里笔者直接进入数据库,下面是用SuiteCRM原始潜在客户leads表格写的一句SQL命令,包括的数据项有:邮箱地址、人名加称谓、数据唯一标识码(简称ID)、 数据最后修改日期、所在城市,按修改日期排序;这是一个最基本选择,实际应用场景可以非常多的细分,在此就此略过;在这基础上把数据导入Excel就可以交给任何一个熟练白领根据具体情况进行对数据分组等一系列群发邮件前的准备工作,可以任意发挥,技术上没有什么难度,几乎想怎么样就可以怎么样,效率也是很高的。
    SELECT c.email_address, CONCAT(a.last_name, if(a.salutation='Mr.','先生',if(a.salutation='Ms.','女士','先生/女士'))) as name, a.id, a.date_modified, a.primary_address_city FROM leads a INNER JOIN email_addr_bean_rel b ON a.id = b.bean_id INNER JOIN email_addresses c ON b.email_address_id = c.id WHERE a.deleted=0 AND b.deleted=0 AND LENGTH(a.last_name) <10 AND c.invalid_email = 0 ORDER BY a.date_modified
    
    1. 在上面的邮箱、人名及分组准备好以后,就可以进行布置群发了;群发需要有几样东西:
      a. 要有一个有邮箱,包括邮箱imap地址,用户名,密码
      b. 邮件内容包括个性化变量,一般为html格式
      c. 收件人邮箱地址和人名清单,在此还有ID,以便把最终结果导入CRM
      d. 要有推送程序,在此是在网上参考了许多帖子后自己写的Python 3程序,程序本身包括python源码(mailsender.py)、控制部分(config.txt)、邮件内容(message.txt)、邮箱人名清单(addresses.txt) 四部分,推送程序还会写一个发送成功清单(logs.txt)和一个发送失败清单(failed.txt)用于核对和检查
      e. 推送的节奏是有讲究的,太快了会被邮箱服务商挡住,太慢了会来不及,这个需要花时间摸索,一般销售的信息也不是很准,网易企业邮箱每天每个账号只能发一千个邮件(这样相对也出不了大事,避免被封),间隔最好大于10s,其他的说法都不可靠;有的销售会给你一个比较明确的信息,而有的却吾哩嘛里如阿里云的一个销售不给相关信息,来来回回浪费了好几天,具体需要自己花时间挖掘。
    # Python 3
    import time
    import datetime
    import os
    import smtplib
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    
    sleeptime = 1
    pausetime = 0
    numMails = 10
    numRounds = 1
    SMTPUsername = ''
    SMTPPassword = ''
    SMTPServer = 'smtp.gmail.com'
    SMTPPort = 587
    sender = ''
    confirmationEmail = ''
    
    j = 0
    count = 0
    failed = 0
    
    def configuration(resume=""):
        global sleeptime
        global pausetime
        global numMails
        global numRounds
        global SMTPUsername
        global SMTPPassword
        global SMTPServer
        global SMTPPort
        global sender
        global j
        global confirmationEmail
    
        # resume from last sent mail according to logfile
        if resume == "" and os.path.isfile("logs.txt"):
            resume = input("Resume from last position?(Y/N)\n")
        elif resume == "":
            resume = "No"
        print("resuming from logs: ", resume)
        if resume[0].upper() == "Y":
            log = open("logs.txt", encoding='utf-8').read().split("\n")
            j = int(log[len(log) - 2].split("\t")[0]) + 1
    
        # load configuration from file
        with open("config.txt") as conf:
            config = conf.read()
        config = config.split("\n")
    
        for line in config:
            if len(line) == 0:
                continue
            if line[0] == "#":
                continue
            option = line.split(" = ")
            if option[0] == "sleeptime":
                sleeptime = float(option[1])
            elif option[0] == "pausetime":
                pausetime = float(option[1]) * 60
            elif option[0] == "numMails":
                numMails = int(option[1])
            elif option[0] == "numRounds":
                numRounds = int(option[1])
            elif option[0] == "SMTPUsername":
                SMTPUsername = option[1]
            elif option[0] == "SMTPPassword":
                SMTPPassword = option[1]
            elif option[0] == "SMTPServer":
                SMTPServer = option[1]
            elif option[0] == "sender":
                sender = option[1]
            elif option[0] == "SMTPPort":
                SMTPPort = int(option[1])
            elif option[0] == "confirmationEmail":
                confirmationEmail = option[1]
            else:
                print("invalid option: ")
                print(option)
    
            if sender == "":
                sender = SMTPUsername
            if confirmationEmail == "":
                confirmationEmail = sender
        print("configuration finished")
    
    
    def send():
        global sleeptime
        global pausetime
        global numMails
        global numRounds
        global SMTPUsername
        global SMTPPassword
        global SMTPServer
        global SMTPPort
        global sender
        global j
        global count
        global failed
    
        # connect to mailserver
        # server = smtplib.SMTP(SMTPServer, SMTPPort)
        # server.starttls()
    
        addresses = (open("addresses.txt", encoding='utf-8').read() + "\n").split("\n")
    
        # if not specified, send all mails
        if numMails == 0:
            numMails = int((len(addresses) // numRounds) + 1)
        for k in range(numRounds):
            # connect to mailserver
            server = smtplib.SMTP(SMTPServer, SMTPPort)
            server.starttls()
            # login
            try:
                server.login(SMTPUsername, SMTPPassword)
            except Exception as e:
                print("login failed")
                print(e)
            # assemble individual messages
            for i in range(numMails):
                sent = False
    
                # find next email reciever
                while len(addresses[k * numMails + i + j]) <= 1:
                    print("skip empty line")
                    j += 1
                    if k * numMails + i + j >= len(addresses):
                        break
                index = k * numMails + i + j
                if index >= len(addresses):
                    print("end reached")
                    break
                reciever = addresses[index].split(";")
    
                msg = MIMEMultipart('alternative')
                msg['From'] = sender
                msg['To'] = reciever[0]
                html = ""
                try:
                    with open("message.txt", encoding='utf-8')as f:
                        subject = f.readline()
                        html = f.read()
                except Exception as e:
                    print("could not read message")
                    print(e)
    
                msg['Subject'] = subject
                if len(html) < 1:
                    print("message could be empty")
                html = html.replace('placeholder', reciever[1])
    
                part2 = MIMEText(html, 'html')
    
                msg.attach(part2)
                try:
                    server.send_message(msg)
                    count += 1
                    sent = True
    
                except Exception as e:
                    print("message could not be sent")
                    print(e)
    
                print("messages sent:", count)
                # write logs
                with open("logs" + ".txt", "a+", encoding='utf-8') as log:
                    log.write(
                        str(index) + "\t" + reciever[0] + "\t" + reciever[1] + "\t" + reciever[2] + "\t" + "sent: " + str(
                            sent) + "\t" + str(
                            datetime.datetime.now()) + "\n")
                if not sent:
                    failed += 1
                    with open("failed" + ".txt", "a+", encoding='utf-8') as fail:
                        fail.write(reciever[0] + ";" + reciever[1] + ";" + reciever[2] + "\n")
    
                print("sleeping", sleeptime, "s")
                time.sleep(sleeptime)
            if index + 1 >= len(addresses):
                print("end reached")
                break
            print("paused", pausetime, "s")
            time.sleep(pausetime)
    
    
    def confirm():
        server = smtplib.SMTP(SMTPServer, SMTPPort)
        server.starttls()
        server.login(SMTPUsername, SMTPPassword)
        msg = MIMEMultipart()
        msg['From'] = sender
        msg['To'] = confirmationEmail
        msg['Subject'] = "Emails sent"
        message = "successfully sent " + str(count) + " messages\n" + str(failed) + " messages could not be sent\n" + str(
            datetime.datetime.now())
        msg.attach(MIMEText(message))
        server.send_message(msg)
    
    configuration()
    send()
    confirm()
    

    这个推送程序的亮点是操作简单,邮箱、节奏、每次群发多少邮件个数,每次群发间的停顿时间,每天群发次数,都在config.txt里定义,可以根据邮件服务器的反馈马上调整,极其方便;可以在一般windows里运行,也可以到服务器上运行;不同账号可以用不同文件夹来同时群发邮件,以便节省时间;有两种日志方便找出问题所在。
    同时跑三个群发上图为在三个文件夹里用网易企业邮箱同时跑三个群发

    # filename: config.txt
    # SMTP Login Data for Email Service
    SMTPServer = smtphm.qiye.163.com (例子网易企业邮箱)
    SMTPPort = 587
    SMTPUsername = 你的邮箱地址
    SMTPPassword = 你的邮箱密码
    
    # optional, accepts SMTPUsername if not specified
    sender = 你的邮箱地址
    
    # optional, accepts SMTPUsername if not specified
    confirmationEmail = 你的邮箱地址
    
    # Waiting time between emails in seconds
    sleeptime = 3
    # Waiting time between rounds min
    pausetime = 10
    # Number of emails to be sent per round, 0 for all mails
    numMails = 100
    # Number of rounds
    numRounds = 9
    
    1. 在大量推送以后免不了有很多回复邮件,除了自动回复以外,还有许多退信,日积月累将让人几乎无法招架,面对一大堆没有实际意义的退信谁都会头大,大部分人可能就选择视而不见了,但这会给后人带来更大的负担,在此用Python3写了100行代码,得到下面的结果,这个文件用来批处理就非常有效,自动答复可以忽略,退信只要写个SQL命令交给CRM,下次就不会出现在群发清单里了,剩下的人工处理只是很小很小部分;在导入CRM前,必须要人工检查一下,虽然程序已经让此事已经可行了,程序还是没有那么智慧。
    Sat, 13 Jul 2019 03:51:34 +0800	<postmaster@hktdc.org>	Undeliverable: 上海浦东第11期“XXXXXXXX创新创业研习班”邀请函   	pansy.y@hktdc.org
    Sat, 13 Jul 2019 03:41:45 +0800	b'"'光伟b'" <123456@qq.com>'	自动回复:上海浦东第11期“XXXXXXXX创新创业研习班”邀请函
    12 Jul 2019 18:08:17 +0800 (CST)	MAILER-DAEMON@mx-14-110.mail.sina.com.cn	系统退信	gxqw999@sina.cn	
    12 Jul 2019 18:34:44 +0800 (CST)	MAILER-DAEMON@mx-14-109.mail.sina.com.cn	系统退信	nake98@sina.com	
    12 Jul 2019 18:39:35 +0800 (CST)	MAILER-DAEMON@mx-14-106.mail.sina.com.cn	系统退信	yy7759@sina.com	
    Thu, 11 Jul 2019 22:39:19 +0000	Anne <anne@hsbc.com.cn>	Automatic reply: EXTERNAL: 上海浦东第11期“XXXXXXXX创新创业研习班”邀请函
    Thu, 11 Jul 2019 22:29:15 +0800 (CST)	<postmaster@usst.edu.cn>	系统退信/Systems bounce	ymzh@usst.edu.cn	
    Thu, 11 Jul 2019 22:12:17 +0000	<postmaster@innovators.net>	Undeliverable: geib@ndmneb5.com
    Thu, 11 Jul 2019 19:53:25 +0800 (CST)	Postmaster@126.com	系统退信	julia_july@126.com
    

    退信处理原则上有两种方法,看上去比较智慧是上直接在服务器上读邮件,但技术难度比较大,因为要读懂邮件的具体中文内容是一件非常棘手的事情;另一种技术难度比较小的就是把服务器上的邮件用客户端全部下载下来再来分析内容,就容易操作了,用thunderbird客户端下载的文件可读性非常好,但如果有很多年积攒起来的邮件,数据量也是很惊人的,所以感觉上这个方法有点low。

    最后,因为所有这些都是在SuiteCRM外面操作的,因此为了CRM信息的完整性,还要把相关的信息从数据库层面导入到SuiteCRM。

    1. 要在SuiteCRM把无效邮箱注释掉,以免下次再发;
    2. 把这次群发成功的也导入到相关的潜在客户;
    3. 把有人工回信的也导入到相关的潜在客户。
    展开全文
  • 在进行一次培训后,需要收到学员提交的邮件信息,但是由于人员较多,而且每次点开文件保存到当地步骤较为繁琐,人为操作浪费时间还存在着操作失误的可能性,这样就产生进行批量邮件附件的提取并保存在本地的需求...
  • 批量下载邮箱中的附件 可用、完善程序 比如使用邮箱收作业、收调查表之类。 加入了很多处理和筛选功能,还有解决一些编码问题,可用性肯定比网上几十行的最简单的脚本要好很多。曾经当助教时用Python写了个程序,...
  • 大家好,我是早起。在之前的Python办公自动化专题系列文章中,我们已经讲解了如何使用Python读取、收发邮件等多个邮件管理操作,有关Python处理Excel和Word相关的理论与实战...
  • 使用python发送邮件

    2019-03-04 01:38:31
    总之我觉得邮件通知非常适合那些处理批量、大量任务,你可以不用守在电脑前等待处理结果,在程序里配置好邮件通知后,只需留意邮箱通知就好了。 下面我们一起来看看如何使用 python 来实现邮件发送,邮件一般分为纯...
  • 前言 本文的文字及图片来源于网络,...批量发送邮件,并且各邮件可以不同 高度自定义的定时发送 更有效地管理收件箱 基本概念 有关邮件的基本概念,可以查看下图 代码操作前的配置 以网易163邮箱为例,邮箱需
  • 输出格式(需要注意备选项为单元格内换行):首先考虑了使用python对题目进行处理(输出csv格式文件),再从excel向word复制的方式。 将原题库保存为csv格式,代码如下: def tiankong(): import re original = ...
  • python在自动化办公领域越来越受欢迎,批量处理简直是加班族的福音。自动化办公无非是excel、ppt、word、邮件、文件处理、数据分析处理、爬虫这些,这次我就来理一理python自动化办公的那些知识点。python基础excel...
  • - 他们需要从邮箱中批量取出每一封邮件,放到一个excel文件中。 这些对python来说,真是小菜一碟。(事后证明,还是有些小坑,让我头疼了好一会儿。) 因为是初学者,没有必要从python2起步,我直接...
  • 他们每天发布实习信息,而且数量比较多,适合使用python处理 import requests url = "https://mp.weixin.qq.com/s/sw3zrQuqR9667PYnxw98oQ" from selenium import webdriver #需要驱动文件 import re xpath_all = '...
  • 1.最近经理被邮件烦到了,可能是太多了,想着批量读取并将需要的数据处理好,传到他的接口去,无奈腾讯的js又多,又难,又绕~看不懂看不懂,手动狗头。于是准备使用selenium模拟浏览器的方式 2.由于需要每天定时爬取...
  • python在自动化办公领域越来越受欢迎,批量处理简直是加班族的福音。自动化办公无非是excel、ppt、word、邮件、文件处理、数据分析处理、爬虫这些,这次就来理一理python自动化办公的那些知识点。python基础excel...
  • awesome-python 是 vinta 发起维护的 Python 资源列表,内容包括:Web 框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。由「开源前哨...
  • 有多个xls数据源需要邮件合并,通过word一个一个来手动合并明显效率很低,Python有相应的docx-mailmerge库来实现合并,但在实际处理中,当doc模板的域处于文本框时,docx-mailmerge合并的速度能让人崩溃,几百条数据...
  • python在自动化办公领域越来越受欢迎,批量处理简直是加班族的福音。自动化办公无非是excel、ppt、word、邮件、文件处理、数据分析处理、爬虫这些,这次我就来理一理python自动化办公的那些知识点。python基础excel...
  • python在自动化办公领域越来越受欢迎,批量处理简直是加班族的福音。自动化办公无非是excel、ppt、word、邮件、文件处理、数据分析处理、爬虫这些,这次就来理一理python自动化办公的那些知识点。python基础excel...
  • python在自动化办公领域越来越受欢迎,批量处理简直是加班族的福音。自动化办公无非是excel、ppt、word、邮件、文件处理、数据分析处理、爬虫这些,这次我就来理一理python自动化办公的那些知识点。python基础excel...
  • 编程实践(Python办公自动化) 论坛版块: ...了解通过python进行word、excel、pdf的相关操作,了解通过python进行文件批量处理、电子邮件收发、数据爬取;熟悉自动化办公的相关流程,力求在平时的工
  • python在自动化办公领域越来越受欢迎,批量处理简直是加班族的福音。自动化办公无非是excel、ppt、word、邮件、文件处理、数据分析处理、爬虫这些,这次就来理一理python自动化办公的那些知识点。python基础excel...

空空如也

空空如也

1 2 3 4
收藏数 78
精华内容 31
关键字:

python批量处理邮件

python 订阅