精华内容
下载资源
问答
  • 怎么把邮件全部下载
    千次阅读
    2018-08-16 00:56:00

    今天遇到个需求,当然这次需求跟代码无关。公司用的是腾讯企业邮箱,我用的是本地的foxmail,然后新建文件夹的时候报错。

    image.png

    后来网上参考了一些资料发现,邮件服务器有两种类型,我选择的是IMAP
    image.png

    IMAP与pop3的区别:imap是可以在本地新建文件夹跟服务器同步,也就是说本地的操作会直接影响邮件服务器。pop3是本地在怎么操作不影响邮件服务器,不过新建以后下载的邮件只会从收件箱里下载.
    foxmail邮箱怎么在收件箱里新建子文件夹?
    上述链接描述很完整。
    好了,现在邮件文件夹可以新建了,但是只能下载最近半个月的邮件,然后打开web页面的邮件设置了下,如图:
    image.png

    image.png

    在设置-客户端设置-收取选项-收取全部即可。
    然后就可以下载所有邮件了。
    这里在讲下如何创建规则,只需要在邮件上邮件更多操作-创建过滤器即可


    image.png
    更多相关内容
  • 批量下载邮箱中的附件 可用、完善程序 比如使用邮箱收作业、收调查表之类。 加入了很多处理和筛选功能,还有解决一些编码问题,可用性肯定比网上几十行的最简单的脚本要好很多。曾经当助教时用Python写了个程序,...

    批量下载邮箱中的附件 可用、完善程序 支持IMAP和POP3

    (注:Office Outlook作为专业邮箱软件可以提供更强大的筛选、下载功能,这个脚本肯定并不上Outlook。)

    比如使用邮箱收作业、收调查表之类。

    加入了很多处理和筛选功能,还有解决一些编码问题,可用性肯定比网上几十行的最简单的脚本要好很多。曾经当助教时用Python写了个程序,后来无聊就把它写得更完善了,很多细节都是查阅RFC文档的。

    很多邮件数据并没不规范,所以得做各种兼容处理。

    自己测了一个有2000封邮件的帐号基本不会有问题。

    肯定不止我需要,分享给大家,直接丢个Github地址。

    GitHub - Li-Jiajie/BatchAttachmentDownloader: 邮箱邮件附件批量下载 v1.3 多种保存模式、支持筛选 支持IMAP与POP3

    可批量下载邮件中的附件,包含筛选功能,多种保存方式,比如按邮箱地址、按发件人之类的保存。

    支持POP3和IMAP两种协议。

    当然水平有限,要是不满足需求修改也是蛮方便的,里面注释和封装的都蛮全。

    把下面信息替换掉就可以跑了。

    有些邮箱(比如QQ邮箱)只允许访问最近一个月的邮件,在邮箱设置里可以调整,不是程序的问题。

    超大附件暂不支持,有需求的人可以在基础上改改代码。

    这里也放下代码,两个文件,一个main.py,一个email_helper.py。可移步Github获取最新版。

    main.py

    """
    https://github.com/Li-Jiajie/BatchAttachmentDownloader
    
    BatchAttachmentDownloader   v1.3.0
    邮件附件批量下载
    Python 3开发,支持IMAP4与POP3协议
    
    支持多种附件保存模式、筛选模式
    
    使用场景:通过邮箱收作业、调查等,批量下载附件    等
    
    2020.10.22
    Jiajie Li
    """
    
    import email_helper
    
    # ************************请设置以下参数************************
    
    # 邮箱地址  (必填)
    EMAIL_ADDRESS = '*****your email address*****'
    # 邮箱密码  (必填)
    EMAIL_PASSWORD = '*****your email password*****'
    
    # 邮件协议  (必填,POP3或IMAP)
    EMAIL_PROTOCOL = 'POP3'
    # 服务器地址(SSL)    (必填,请根据协议填入合适的地址)
    SERVER_ADDRESS = 'pop.qq.com'
    
    # 附件保存位置
    SAVE_PATH = 'F:\\Email-Attachments'
    # 筛选起止时间    yyyy-MM-dd HH:mm:ss
    DATE_BEGIN, DATE_END = '2020-10-20 00:00', '2020-11-5 18:00'  # 筛选起止时间(包含此时间)
    # 时区 默认东八区北京时间,如需更改请按如下格式更改
    TIME_ZONE = '+0800'
    # 筛选包含此内容的邮件地址,''表示全部邮件地址
    FROM_ADDRESS = ''
    # 筛选包含此内容的发件人昵称,''表示全部发件人昵称
    FROM_NAME = ''
    # 筛选包含此内容的邮件主题,''表示全部邮件主题
    SUBJECT = ''
    """
        保存模式    SAVE_MODE
    【0:所有附件存入一个文件夹】
    【1:每个邮箱地址一个文件夹】
    【2:每个邮件主题一个文件夹】
    【3:每个发件人的每个邮件主题一个文件夹】
    【4:每个发件人昵称一个文件夹】
    """
    SAVE_MODE = 1
    
    # ************************请设置以上参数************************
    
    
    if __name__ == '__main__':
        # 服务器连接与邮箱登录
        downloader = email_helper.BatchEmail(EMAIL_PROTOCOL, SERVER_ADDRESS, EMAIL_ADDRESS, EMAIL_PASSWORD)
    
        # 选项设置
        downloader.set_save_mode(SAVE_MODE)
        downloader.save_path = SAVE_PATH
        downloader.date_begin = DATE_BEGIN
        downloader.date_end = DATE_END
        downloader.time_zone = TIME_ZONE
        downloader.from_name = FROM_NAME
        downloader.from_address = FROM_ADDRESS
        downloader.subject = SUBJECT
    
        # 下载附件
        downloader.download_attachments()
        downloader.close()
    

    email_helper.py

    import abc
    import os
    import re
    from email.parser import Parser
    from email.header import decode_header
    from email.utils import parseaddr
    from email.message import Message
    import poplib
    import datetime
    import imaplib
    import email
    
    
    # 邮件信息类
    class EmailInfo(object):
        def __init__(self):
            self.date = None
            self.subject = None
            self.from_address = None
            self.from_name = None
            self.size = None
            self.attachments_name = []
    
        # 返回易阅读的文件大小字符串(两位小数),如 12345678 bytes返回'11.77MB'
        @staticmethod
        def bytes_to_readable(bytes_size: int):
            size_unit = [' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB']
            unit_index = 0
            easy_read_size = bytes_size
            while easy_read_size >= 1024:
                easy_read_size /= 1024
                unit_index += 1
            if unit_index == 0:
                return str(easy_read_size) + size_unit[unit_index]
            else:
                return '{:.2f}'.format(easy_read_size) + size_unit[min(len(size_unit), unit_index)]
    
        def print_info(self):
            print('subject:', self.subject)
            print('from_address:', self.from_address)
            print('from_name:', self.from_name)
            print('date:', self.date)
            print('attachments:', self.attachments_name)
            print('total size:', self.bytes_to_readable(self.size))
            print('-----------------------------')
    
        def add_attachment_name(self, attachment_name):
            self.attachments_name.append(attachment_name)
    
    
    # 附件储存类_基类
    class Saver(metaclass=abc.ABCMeta):
        __SUBJECT_MAX_LENGTH = 51
    
        @abc.abstractmethod
        def __init__(self, root_path, file_name, file_data):
            self._root_path = root_path
            self._file_name = file_name
            self._file_data = file_data
    
        def _save_file(self, directory_path):
            # 储存文件,directory_path是绝对路径,不包含文件名
            if not os.path.exists(directory_path):
                os.makedirs(directory_path)
            self._file_name = Saver.file_name_check_and_update(directory_path, self._file_name)
            file = open(os.path.join(directory_path, self._file_name), 'wb')
            file.write(self._file_data)
            file.close()
    
        @staticmethod
        # 检查文件名,如果相同则自动递增编号。返回文件名,不包含路径。
        def file_name_check_and_update(path, file_name):
            file_number = 2
            exist_file_list = os.listdir(path)
            pure_name, extension = os.path.splitext(file_name)
            while file_name in exist_file_list:
                file_name = pure_name + '_' + str(file_number) + extension
                file_number += 1
            return file_name
    
        @staticmethod
        # 检查文件夹名词,去除非法字符并控制长度
        def normalize_directory_name(directory_name):
            normalized_name = re.sub('[*"/:?|<>\n]', '', directory_name, 0)
            normalized_name = normalized_name[0:min(Saver.__SUBJECT_MAX_LENGTH, len(normalized_name))].strip()
            return normalized_name
    
        @abc.abstractmethod
        def save(self):
            pass
    
    
    # 模式0:所有附件存入一个文件夹
    class MergeSaver(Saver):
        def __init__(self, root_path, file_name, file_data):
            super().__init__(root_path, file_name, file_data)
    
        def save(self):
            self._save_file(self._root_path)
    
    
    # 模式1:每个邮箱地址一个文件夹
    class AddressClassifySaver(Saver):
        def __init__(self, root_path, file_name, file_data, email_address):
            super().__init__(root_path, file_name, file_data)
            self._email_address = self.normalize_directory_name(email_address)
    
        def save(self):
            self._save_file(os.path.join(self._root_path, self._email_address))
    
    
    # 模式2:每个邮件主题一个文件夹
    class SubjectClassifySaver(Saver):
        def __init__(self, root_path, file_name, file_data, email_subject):
            super().__init__(root_path, file_name, file_data)
            self._email_subject = self.normalize_directory_name(email_subject)
    
        def save(self):
            self._save_file(os.path.join(self._root_path, self._email_subject))
    
    
    # 模式3:每个发件人的每个邮件主题一个文件夹
    class AddressSubjectClassifySaver(Saver):
        def __init__(self, root_path, file_name, file_data, email_address, email_subject):
            super().__init__(root_path, file_name, file_data)
            self._email_address = self.normalize_directory_name(email_address)
            self._email_subject = self.normalize_directory_name(email_subject)
    
        def save(self):
            self._save_file(os.path.join(self._root_path, self._email_address, self._email_subject))
    
    
    # 模式4:每个发件人昵称一个文件夹
    class AliasClassifySaver(Saver):
        def __init__(self, root_path, file_name, file_data, from_alias):
            super().__init__(root_path, file_name, file_data)
            self._from_alias = self.normalize_directory_name(from_alias)
    
        def save(self):
            self._save_file(os.path.join(self._root_path, self._from_alias))
    
    
    # 储存器工厂
    class SaverFactor:
        def __init__(self, mode: int):
            self.__mode = mode
    
        def __call__(self, root_path, file_name, file_data, email_info: EmailInfo):
            """
                保存模式    SAVE_MODE
            【0:所有附件存入一个文件夹】
            【1:每个邮箱地址一个文件夹】
            【2:每个邮件主题一个文件夹】
            【3:每个发件人的每个邮件主题一个文件夹】
            【4:每个发件人昵称一个文件夹】
            """
            if self.__mode == 0:
                return MergeSaver(root_path, file_name, file_data)
            elif self.__mode == 1:
                return AddressClassifySaver(root_path, file_name, file_data, email_info.from_address)
            elif self.__mode == 2:
                return SubjectClassifySaver(root_path, file_name, file_data, email_info.subject)
            elif self.__mode == 3:
                return AddressSubjectClassifySaver(root_path, file_name, file_data, email_info.from_address,
                                                   email_info.subject)
            elif self.__mode == 4:
                return AliasClassifySaver(root_path, file_name, file_data, email_info.from_name)
            else:
                return None
    
    
    # 邮件属性判断_基类
    class EmailJudge:
        @abc.abstractmethod
        def judge(self):
            pass
    
    
    # 日期判断
    class DateJudge(EmailJudge):
        def __init__(self, date_begin, date_end, time_zone, email_date):
            self.__date_begin = date_begin
            self.__date_end = date_end
            self.__time_zone = time_zone
            self.__email_date = email_date
    
        def judge(self):
            # Date格式'4 Jan 2020 11:59:25 +0800'
            date_mail = datetime.datetime.strptime(self.__email_date, '%d %b %Y %H:%M:%S %z')
            date_begin = datetime.datetime.strptime((self.__date_begin + self.__time_zone), '%Y-%m-%d %H:%M%z')
            date_end = datetime.datetime.strptime((self.__date_end + self.__time_zone), '%Y-%m-%d %H:%M%z')
            return date_begin < date_mail < date_end
    
        @staticmethod
        # 比较是否比Target时间更早,用于结束邮件遍历的循环。包含时区。
        def is_earlier(email_time, target_time):
            email_datetime = datetime.datetime.strptime(email_time, '%d %b %Y %H:%M:%S %z')
            target_datetime = datetime.datetime.strptime(target_time, '%Y-%m-%d %H:%M%z')
            return email_datetime < target_datetime
    
    
    # 邮件主题判断
    class SubjectJudge(EmailJudge):
        def __init__(self, subject_include, email_subject):
            self.__subject_include = subject_include
            self.__email_subject = email_subject
    
        def judge(self):
            return self.__subject_include in self.__email_subject
    
    
    # 邮件发件人地址判断
    class AddressJudge(EmailJudge):
        def __init__(self, address_include, email_from_address):
            self.__address_include = address_include
            self.__email_from_address = email_from_address
    
        def judge(self):
            return self.__address_include in self.__email_from_address
    
    
    # 邮件发件人姓名判断
    class NameJudge(EmailJudge):
        def __init__(self, name_include, email_from_name):
            self.__name_include = name_include
            self.__email_from_name = email_from_name
    
        def judge(self):
            return self.__name_include in self.__email_from_name
    
    
    # 邮件筛选器
    class EmailFilter:
        def __init__(self):
            self.__judges = []
    
        def add_judge(self, judge: EmailJudge):
            self.__judges.append(judge)
    
        def judge_conditions(self):
            for condition_judge in self.__judges:
                if not condition_judge.judge():
                    return False
            return True
    
    
    # 批量邮件下载类
    class BatchEmail:
        def __init__(self, mode, email_server, email_address, email_password):
            self.__save_mode = 0  # 附件保存模式
            self.save_path = 'Email-Attachments'  # 附件保存位置
    
            # 筛选属性
            self.date_begin, self.date_end = '2020-1-1 00:00', '2020-1-4 20:00'  # 筛选属性:起止时间
            self.time_zone = '+0800'  # 筛选属性:时区
            self.from_address = ''  # 筛选属性:发件人地址
            self.from_name = ''  # 筛选属性:发件人姓名
            self.subject = ''  # 筛选属性:邮件主题
    
            self.__saver_factor = None
    
            if mode.lower().find('pop') != -1:
                self.__receiver = Pop3Receiver(email_server, email_address, email_password)
            elif mode.lower().find('imap') != -1:
                self.__receiver = ImapReceiver(email_server, email_address, email_password)
            else:
                print('请选择邮件协议,POP3或IMAP。')
                return
    
        def set_save_mode(self, save_mode):
            self.__save_mode = save_mode
            self.__saver_factor = SaverFactor(self.__save_mode)
    
        def download_attachments(self):
            if self.__receiver is None:
                return
    
            # 邮件数量和总大小:
            mail_quantity, mail_total_size = self.__receiver.get_email_status()
            print('邮件总数:', mail_quantity)
            if mail_total_size > 0:
                print('邮件总大小:', EmailInfo.bytes_to_readable(mail_total_size), end='\n\n')
    
            # mail_list中是各邮件信息,格式['number octets'] (1 octet = 8 bits)
            mail_list = self.__receiver.get_mail_list()
            error_count = 0
    
            # 倒序读取(从最新的开始)
            for mail_number in mail_list:
                # mail_number = '590'     # debug
    
                try:
                    content_byte = self.__receiver.get_mail_header_bytes(mail_number)
                    mail_message = self.parse_mail_byte_content(content_byte)
                    message_info = self.__get_email_info(mail_message)
                except Exception as e:
                    print('邮件接收或解码失败,邮件编号:[%s]  错误信息:%s' % (mail_number, e))
                    error_count += 1
                    continue
    
                email_filter = EmailFilter()
                email_filter.add_judge(DateJudge(self.date_begin, self.date_end, self.time_zone, message_info.date))
                email_filter.add_judge(SubjectJudge(self.subject, message_info.subject))
                email_filter.add_judge(AddressJudge(self.from_address, message_info.from_address))
                email_filter.add_judge(NameJudge(self.from_name, message_info.from_name))
    
                # 超出设定的最早时间则结束循环
                if DateJudge.is_earlier(message_info.date, self.date_begin + self.time_zone):
                    break
    
                if email_filter.judge_conditions():
                    content_byte, message_info.size = self.__receiver.get_full_mail_bytes(mail_number)  # 接收完整邮件
                    mail_message = self.parse_mail_byte_content(content_byte)
                    file_number = self.__save_email_attachments(mail_message, message_info)
    
                    print(
                        '( %d / %d )【%s】' % (
                            len(mail_list) - int(mail_number) + 1, len(mail_list), message_info.subject), end='')
                    print('已保存,下一封') if file_number != 0 else print('无附件')
                    message_info.print_info()
                else:
                    print('( %d / %d )【%s】不符合筛选条件,下一封' % (
                        len(mail_list) - int(mail_number) + 1, len(mail_list), message_info.subject))
            print('处理完成')
            if error_count > 0:
                print('有 %d 个邮件发生错误,请手动检查' % error_count)
    
        def close(self):
            self.__receiver.close()
    
        @staticmethod
        # 将邮件中的bytes数据转为字符串
        def decode_mail_info_str(content):
            result_content = []
            for value, charset in decode_header(content):
                if type(value) != str:
                    if charset is None:
                        value = value.decode(errors='replace')
                    elif charset.lower() in ['gbk', 'gb2312', 'gb18030']:
                        # 一些特殊符号标着gbk,但编码可能是gb18030中的。gb18030向下兼容gbk、gb2312,所以一律用gb18030。
                        value = value.decode(encoding='gb18030', errors='replace')
                    else:
                        value = value.decode(charset, errors='replace')
    
                result_content.append(value)
            return ' '.join(result_content)
    
        @staticmethod
        # 把邮件内容解析为Message对象
        def parse_mail_byte_content(content_byte):
            try:
                mail_content = content_byte.decode()
            except UnicodeDecodeError as e:
                mail_content = content_byte.decode(encoding='GB18030', errors='replace')  # GB18030兼容GB231、GBK
    
            return Parser().parsestr(mail_content)
    
        # 附件解析与保存,返回附件数量
        def __save_email_attachments(self, message: Message, email_info):
            file_count = 0
            for part in message.walk():
                file_name = part.get_filename()
                if file_name:
                    file_name = self.decode_mail_info_str(file_name)
                    email_info.add_attachment_name(file_name)
                    data = part.get_payload(decode=True)
                    self.__saver_factor(self.save_path, file_name, data, email_info).save()
                    file_count += 1
            return file_count
    
        def __get_email_info(self, message: Message):
            email_info = EmailInfo()
    
            try:
                email_info.subject = self.decode_mail_info_str(message.get('Subject'))
            except TypeError as e:
                email_info.subject = '无主题'
    
            name, address = parseaddr(message.get('From'))
            email_info.from_address = address
            email_info.from_name = self.decode_mail_info_str(name)
    
            date = message.get('Date')
            # 少数情况下无Data字段,Received
            if date is None:
                received = message.get('Received')
                if received is None:
                    # 极少数邮件信息头内没有时间信息,偶发于一些系统发送的邮件
                    raise ValueError('该邮件收件时间解析失败,邮件主题:【%s】' % email_info.subject)
                date = received[received.rfind(';') + 1:]
            # Date格式'Sat, 4 Jan 2020 11:59:25 +0800', 也有可能是'4 Jul 2019 21:37:08 +0800'
            # 开头星期去除,部分数据末尾有附加信息,因此以首个冒号后+12截取
            date_begin_index = 0
            for date_begin_index in range(len(date)):
                if '0' <= date[date_begin_index] <= '9':
                    break
            date = date.replace('GMT', '+0000')  # 部分邮件用GMT表示
            email_info.date = date[date_begin_index:date.find(':') + 12]
    
            return email_info
    
    
    # POP3协议 邮件接收类
    class Pop3Receiver:
        def __init__(self, host: str, email_address: str, email_password: str):
            # 连接POP3服务器(SSL):
            try:
                self.__connection = poplib.POP3_SSL(host)
            except OSError as e:
                print('连接服务器失败,请检查服务器地址或网络连接。')
                self.close()
                return
    
            self.__connection.set_debuglevel(False)
            poplib._MAXLINE = 32768  # POP3数据单行最长长度,在有些邮件中,该长度会超出协议建议值,所以适当调高
    
            # 服务器欢迎文字:
            print(self.__connection.getwelcome().decode())
    
            # 登录:
            self.__connection.user(email_address)
            try:
                self.__connection.pass_(email_password)
            except Exception as e:
                print(e.args)
                print('登陆失败,请检查用户名/密码。并确保您的邮箱已开启POP3服务。')
                self.close()
                return
    
        def get_mail_list(self):
            # mail_list中是各邮件信息,格式['number octets'] (1 octet = 8 bits)
            response, mail_list, octets = self.__connection.list()
            return [x.split()[0].decode() for x in reversed(mail_list)]
    
        def get_email_status(self):
            return self.__connection.stat()
    
        def get_mail_header_bytes(self, mail_number: str):
            # TOP命令接收前n行,此处仅读取邮件属性,读部分数据可加快速度。TOP非所有服务器支持,若不支持请使用RETR。
            response, content_byte, octets = self.__connection.top(mail_number, 40)
            # 第一个空行前之是头部信息 RFC822
            try:
                mail_header_end = content_byte.index(b'')
            except ValueError as e:
                mail_header_end = len(content_byte)
            return self.__merge_bytes_list(content_byte[:mail_header_end])
    
        def get_full_mail_bytes(self, mail_number: str):
            response, content_byte, size = self.__connection.retr(mail_number)
            return self.__merge_bytes_list(content_byte), size
    
        @staticmethod
        def __merge_bytes_list(bytes_list):
            # 注:极个别邮件中,同一封邮件存在多种编码,那么就不要join后整体解码,而是每一行单独解码。情况少见,暂时忽略。
            return b'\n'.join(bytes_list)
    
        def close(self):
            if self.__connection is not None:
                try:
                    self.__connection.close()
                except OSError as e:
                    print('断开时发生错误')
                self.__connection = None
    
    
    # IMAP4协议 邮件接收类
    class ImapReceiver:
        def __init__(self, host: str, email_address: str, email_password: str):
            # 连接IMAP4服务器(SSL):
            try:
                self.__connection = imaplib.IMAP4_SSL(host)
            except OSError as e:
                print('连接服务器失败,请检查服务器地址或网络连接。')
                self.close()
                return
    
            # 登录:
            try:
                s = self.__connection.login(email_address, email_password)
            except Exception as e:
                print(e.args)
                print('登陆失败,请检查用户名/密码。并确保您的邮箱已开启IMAP服务。')
                self.close()
                return
    
        def get_email_status(self):
            response, data = self.__connection.status('INBOX', '(MESSAGES)')
            quantity = int(re.findall('\d+', data[0].split()[2].decode())[0])
            return quantity, -1
    
        def get_mail_list(self):
            self.__connection.select()
            response, mail_list = self.__connection.search(None, 'ALL')
            return [x.decode() for x in reversed(mail_list[0].split())]
    
        def get_mail_header_bytes(self, mail_number: str):
            response, data = self.__connection.fetch(mail_number, '(BODY[HEADER])')
            if data[0] is None:
                # 极少数邮件无法获取到内容,一般是系统发送的邮件
                raise ValueError('邮件解析失败')
            return data[0][1]
    
        def get_full_mail_bytes(self, mail_number: str):
            response, data = self.__connection.fetch(mail_number, '(RFC822)')
            size = int(re.findall('\d+', data[0][0].split()[2].decode())[0])
            return data[0][1], size
    
        def close(self):
            if self.__connection is not None:
                try:
                    self.__connection.close()
                except OSError as e:
                    print('断开时发生错误')
                self.__connection = None
    

    展开全文
  • 代码 Public Sub 批量下载附件() Dim msg As MailItem Dim exp As Explorer Dim att As ...outlook > 开发工具 > 宏 > 批量下载附件(或者其它你自定的名称) 这样就会将所选中的所有邮件的附件下载到path中了。

    代码

    Public Sub 批量下载附件()
    
    Dim msg As MailItem
    Dim exp As Explorer
    Dim att As Attachment
    Dim mailIndex As Integer
    Dim path As String
    Dim folder As String
    
    Set exp = Application.ActiveExplorer
    
    '保存附件到哪个路径,末尾必须是斜杠
    path = "D:\xxxxxxxx"
    mailIndex = 0
    
    For Each msg In exp.Selection
    	If msg.Attachments.Count > 0 Then
    		mailIndex = mailIndex + 1
    		For Each att In msg.Attachments
    			'所有附件保存到path中,文件命名为:mailatt<编号>_附件原始文件名
    			att.SaveAsFile path + CStr(mailIndex) + "_" + att.FileName
    		Next
    	End If
    
    Next
    End Sub
    

    使用方法

    outlook2019 + win10

    启用宏

    outlook > 文件 > 选项 > 自定义功能区 > 勾选 开发工具
    在这里插入图片描述
    outlook > 文件 > 选项 > 信任中心设置 > 宏设置.> 启用所有宏
    在这里插入图片描述

    宏编写

    outlook > 开发工具 > Visual Basic > 双击 ThisOutlookSession
    在这里插入图片描述
    插入 > 过程
    在这里插入图片描述
    然后粘贴我给的代码段,F5运行或者Ctrl+S保存后:
    outlook > 开发工具 > 宏 > 批量下载附件(或者其它你自定的名称)
    这样就会将所选中的所有邮件的附件下载到path中了。

    展开全文
  • 这是作者2020年参加清华大学、Coremail、奇安信DataCon举办的比赛,主要是关于钓鱼和异常邮件识别研究。非常感谢举办方让我们学到了新知识,DataCon也是我比较喜欢和推荐的大数据安全比赛,这篇文章2020年10月就进了...

    这是作者2020年参加清华大学、Coremail、奇安信DataCon举办的比赛,主要是关于钓鱼和异常邮件识别研究。非常感谢举办方让我们学到了新知识,DataCon也是我比较喜欢和推荐的大数据安全比赛,这篇文章2020年10月就进了我的草稿箱,但由于小珞珞刚出生,所以今天才发表,希望对您有所帮助!感恩同行,不负青春。

    在这里插入图片描述

    微步情报局C&C资产进行拓线关联发现 “白象三代”组织在2019年期间用于钓鱼攻击的资产域名:ioa-cstnet.org。该域名在2019年3、4月期间曾被用于伪装成中国科学院计算机网路络信息中心管理员对该所人员发起鱼叉式攻击活动,试图窃取科研人员邮箱账密。钓鱼邮件如下所示,因此鱼叉式钓鱼攻击越来越多,其安全防御也非常重要。

    在这里插入图片描述

    展开全文
  • python批量下载邮件附件

    万次阅读 多人点赞 2018-08-20 18:16:29
    老板让你调查个情况,你excel表发出去了,结果反馈回来的邮件有数百之多,如果一个一个的点开保存,肯定要加班了,让 python 来帮忙吧。 02.批量下载 python 提供的 email 包十分好用,功能完备,搞定我们这个...
  • 邮件协议详解

    千次阅读 2021-07-22 15:31:29
    邮件的发送和接收过程——STMP、POP、IMAP、MIME 电子邮件发送协议 是一种基于“ 推 ”的协议,主要包括 ... (2)发件人点击屏幕上的”发送邮件“按钮,发送邮件的 工作全部交给用户代理来完成。用户代理通过SMT...
  •   此工具采用 VBA 编写,它能批量快速的将你收件箱,发件箱以及子文件夹下所有的邮件按 “收发日期 + 收发时间 + 收发类型(进或出)+ 收发人 + 主题.msg” 命名的形式将其导出到你指定的文件夹,并且带附件。...
  • 邮件里的内容全是乱码怎么办?

    千次阅读 2020-12-20 18:31:34
    全部2005-04-12 11:40:322005-04-12 11:40:12试试用东方快车,金山快译和南极星等软件来翻译一下看看全部2005-04-12 11:40:122005-04-12 11:39:15去下载一个dreammail 用来收发邮件,功能超强,特别是对乱码处理非常...
  • 计算机基础知识电子邮件使用技巧集锦(二)分类:计算机等级|更新时间:2016-07-08|来源:转载11、用ISP邮箱提高发信速度现在免费电子邮件大都支持SMTP和POP3协议,故在设置服务帐号时“工具”→“选项”→“邮件...
  • python实现朴素贝叶斯垃圾邮件分类

    千次阅读 2022-03-17 14:12:17
    txt_str = f.read() # 全部小写 txt_str = txt_str.lower() # 过滤掉所有符号 txt_str = translator.sub(' ', txt_str) # 过滤掉全部数字 txt_str = replace_num(txt_str) # 全体的邮件文本 根据换行符string...
  • 用户代理就是用户与电子邮件系统的接口,在大多数情况下它...一种协议用于用户代理向邮件 服务器发送邮件或在邮件服务器之间发送邮件,如SMTP协议,而另一种协议用于用户代 理从邮件服务器读取邮件,如邮局协议POP3。
  • 邮件Outlook设置本地存储的方法--

    千次阅读 2021-07-31 07:35:55
    因此我们不能将邮件大量、长期的存放在服务器上而需要这些邮件转移到本地硬盘上。这样做不但能够对平时邮件做好存档而且能够长期大量的保存邮件并且容易对邮件进行备份。下面给大家介绍一下如何使用outlook...
  • 电子邮件--详解SMTP和POP3协议

    千次阅读 2021-10-11 16:19:06
    文章目录前言一、电子邮件概述1.邮件信息格式2.邮件系统的组成结构二、SMTP协议1.协议概述2.通信过程(1)连接建立(2)邮件传送(3)连接释放三、POP3协议总结 前言 提示:以下是本篇文章正文内容 一、电子邮件概述 1....
  • 邮件收发协议详解

    千次阅读 2021-03-25 10:26:22
    电子邮件是一种异步通信媒介,即当人们方便时就可以收发邮件,不必与他人的计划进行协调。 因特网的电子邮件系统有3个主要组成部分:用户代理(user agent)、邮件服务器(mail server)、简单邮件传输协议(Simple ...
  • 提取OutLook邮件里面的邮件头信息(发件人、收件人) 因为之前发email的时候,被win10的惊喜更新砸中,而我也不小心点了一下,所以控制台的发送日志全没了,面对着已经发了的1000多个邮件,也不能根据最后一个发的人...
  • 它是因特网电子邮件的 第一个离线协议标准, POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循 POP3协议的接收邮件服务器,用来接...
  • 使用 Python 第三方库发送电子邮件

    千次阅读 2021-12-26 13:45:32
    使用 Python 第三方库发送电子邮件1. 安装 yagmail 第三方库2. 开启 POP3、IMAP 和 SMTP 服务2.1 POP3、IMAP 和 SMTP 简介2.2 开启 POP3、IMAP、和 SMTP 协议3. 发送邮件3.1 发送第一封电子邮件3.2 群发邮件3.3 给...
  • Node后台邮件服务器

    千次阅读 2018-12-11 20:45:55
    一、使用场景 在项目整体的实现中,我们可能需要使用邮箱来提供一些服务,或是发送...单一的node后台其实本身并没有发送邮件的功能,要想实现发送邮件的效果,还是需要借助一个邮箱来实现邮件的发送。 流程:前端提...
  • 邮件发送的原理

    千次阅读 2017-01-04 23:51:07
    当你发送一封邮件的时候,它首先会发送到收件人的邮件服务器上,并放入收件人的信箱中。(如果你在某一个邮件服务器提供商那里申请了一个邮箱账号,那么你在这个邮件服务器上面就有一个电子信箱)。收件人只需要定时...
  • Microsoft Outlook下载后删除的邮件恢复到web邮箱中  一定有人和我一样安装了outlook客户端接收邮件,至于Microsoft Outlook的优点最吸引我的是:写邮件时时大家熟悉的word界面,字体、表格以及段落格式...
  • 邮件协议

    千次阅读 2020-06-20 17:12:38
    常见的邮件协议 SMTP (25)、POP3(110)、IMAP(143) SMTPS(465)、POP3S(995)、IMAPS(993) SMTP协议概述 SMTP:简单邮件传输协议,它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP...
  • 邮件发送接收原理

    千次阅读 2018-05-24 22:26:24
    概述 电子邮件是因特网上使用得非常多的一种应用,它可以非常方便的使相隔很远的人进行通信。它主要的特点就是操作简单,快捷。当你发送一封邮件的时候,它首先会发送到收件人的邮件服务器上,并放入收件人的信箱中...
  • 一、常用的电子邮件协议 常用的电子邮件协议有SMTP、POP3、IMAP4,它们都隶属于TCP/IP协议簇,默认状态下,分别通过TCP端口25、110和143建立连接。下面分别对其进行简单介绍 1.1、SMTP协议 SMTP的全称是...
  • HTML邮件 兼容问题

    千次阅读 2018-11-02 17:13:19
    先来两个传送门感受一下: ...几乎每个会员制网站都需要通过后台发送邮件来与会员进行沟通,如注册确认、营销推广。这些由站方发给会员的信件,往往纯文本格式已不能满足界面和交互的要求,这时候我们就需要发...
  • 电子邮件发送协议是一种基于“推”的协议,主要包括... (2)发件人点击屏幕上的”发送邮件“按钮,发送邮件的 工作全部交给用户代理来完成。用户代理通过SMTP协议将邮件发送给发送方的邮件服务器(在这个过程中...
  • 卡巴斯基实验室《2017年Q2垃圾邮件与网络钓鱼分析报告》 ... 垃圾邮件:季度亮点 交付服务木马 2017年第二季度,我们发现了一大波恶意钓鱼邮件,这些邮件都将自身伪造成来自知名交付...攻击者将木马下载程序放置在...
  • (办公类-09)word邮件合并功能插入照片(上下环绕照片) 在Python批量生成《教师信息技术2.0培训》作业的过程中,作者同时尝试利用word邮件合并功能插入培训照片的方法。邮件合并信函,将文字和照片批量整合在同一...
  • 邮件服务器搭建安装部署文档

    千次阅读 2022-01-20 16:45:41
    主要的工作就是把邮件信息从发件人的邮件服务器中传送到接收人的邮件服务器中,偶尔我们使用MUA来发送邮件的话,也承载传输用户邮件到发件服务器的功能, 因而也称作推协议,顺带提一下,SMTP协议的出现是比HTTP还早的,最...
  • 使用javaMail收邮件 支持附件下载

    千次阅读 2012-03-08 13:49:03
    javaMail发送复杂邮件附件 使用javaMail收邮件主要有两种协议,一种是pop3,一种是imap。这两种协议都可以用来收邮件,但是在其中的处理上是有区别的。pop3是不支持判断邮件是否为已读的,也就是说你不能直接从...
  • 垃圾邮件分类(trec06c数据集)数据处理-特征提取

    千次阅读 多人点赞 2020-12-31 11:52:01
    垃圾邮件分类(trec06c数据集)数据处理-1 目标:我要提取 发件人(From)、收件人(To)、邮件主题(Subject)、邮件正文(zhengwen) ...这一部分的全部的代码放这儿: ~~~~~~~~~~~待更新~~~~~~~~~~~~~~~~~~~~~~~~~~~

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,835
精华内容 27,534
关键字:

怎么把邮件全部下载