关键词: python 、 数据传递 、 数据收集 、 邮件

背景

  在制作图像数据集时我们往往是需要大量甲方现场数据,然而自己却常常因各类条件受限无法很好的获取现场数据。如:

  1. 甲方不会安装远程软件;
  2. 甲方网络不在公网上,无法把数据映射到公网上便于自己获取;
  3. 自己没有公网,无法与甲方进行连接;

对此我深感棘手,本着能白嫖原则绝对不多花一分钱,我想到了一种方式可以解决上述问题,那就是以邮件的形式获取现场数据,这样只需要甲方的PC端能够正常上网即可实现数据的传输。

前提

  在《计网》中的邮件的网络协议主要包括SMTPPOP3IMAP。其中SMTP(简单邮件传输协议)是用于发送电子邮件的协议,它提供可靠且有效的电子邮件传输服务;POP3(邮局协议)是用于接收电子邮件的协议。它允许用户从邮件服务器上下载收到的邮件到本地计算机,同时删除保存在邮件服务器上的邮件;IMAP(Internet邮件访问协议)也是一种用于访问和管理电子邮件的协议。与POP3类似,但IMAP在邮件的管理和访问上更加灵活,提供了更多的功能和便利性,使用户可以更方便地管理邮件。

  这里我们选择大家几乎都有的QQ邮箱作为载体(薅马x腾的羊毛),大家进入自己的QQ邮箱开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

【数据传递】通过Email对指定文件夹下的图像数据以附件形式发送给自己
这里我们会获取到一个授权码,请copy这个授权码后面代码中会使用到。

发邮件

  在这里我也是改进了下网络上大佬们的代码,主要优化贡献如下:

  1. 新增读取ini文件配置,可以修改配置文件中文件夹的路径;
  2. 新增读取ini文件配置,设置一次发送图像的上限;
  3. 改单张图像为多张图像共同发送至自己的邮箱中;
import configparser
import os
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
class emailsend:
    def __init__(self, account="你的邮箱地址", authorization="你的授权码"):
        self.sender = account
        self.receiver = [account]
        self.smtpserver = 'smtp.qq.com'
        self.username = account
        self.password = authorization
        self.mail_title = ' '
    def sendfile(self, path=None,T=100):  # 带附件的发送
        # 创建一个带附件的实例
        message = MIMEMultipart()
        message['From'] = "{}".format(self.sender)  # 发送者
        message['To'] = ",".join(self.receiver)  # 接收者
        message['Subject'] = Header(self.mail_title, 'utf-8')
        count = 0
        for filename in os.listdir(path):
            file_path = os.path.join(path, filename)
            # 构造附件2(附件为JPG格式的图片)
            att2 = MIMEText(open(file_path, 'rb').read(), 'base64', 'utf-8')
            att2["Content-Type"] = 'application/octet-stream'
            att2["Content-Disposition"] = 'attachment; filename="%s"' % file_path
            message.attach(att2)
            os.remove(file_path)
            count += 1
            if count == T:
                break
        try:
            smtpObj = smtplib.SMTP_SSL(self.smtpserver, 465)
            smtpObj.login(self.username, self.password)
            smtpObj.sendmail(self.sender, self.receiver, message.as_string())
            print("mail has been send successfully")
            smtpObj.quit()
        except Exception as e:
            print('邮件发送失败   ' + str(e))
        return
if __name__ == '__main__':
    cfg = configparser.ConfigParser()  # 类实例化
    # 定义文件路径
    path = 'Config.ini'
    # 第一种读取ini文件方式,通过read方法
    cfg.read(path)
    dpath = cfg.get('email', 'DPath') # 待传输图像数据文件夹
    TCount = cfg.getint(cfg.get('email', 'TCount'))
    es = emailsend()
    es.sendfile(dpath,TCount)

总结

  本项目的目标是开发一个自动化解决方案,通过Email将指定文件夹下的图像数据以附件形式发送给自己。通过此项目,用户可以轻松地设置指定文件夹,并自动定期扫描该文件夹下的新增图像数据。从而大大简化了数据分享的流程,提高了工作效率。不过大家一定要在甲方授权下进行采集

此博客仅作技术交流使用