关键词: python 、 数据传递 、 数据收集 、 邮件
背景
在制作图像数据集时我们往往是需要大量甲方现场数据,然而自己却常常因各类条件受限无法很好的获取现场数据。如:
- 甲方不会安装远程软件;
- 甲方网络不在公网上,无法把数据映射到公网上便于自己获取;
- 自己没有公网,无法与甲方进行连接;
对此我深感棘手,本着能白嫖原则绝对不多花一分钱,我想到了一种方式可以解决上述问题,那就是以邮件的形式获取现场数据,这样只需要甲方的PC端能够正常上网即可实现数据的传输。
前提
在《计网》中的邮件的网络协议主要包括SMTP 、POP3 和IMAP。其中SMTP(简单邮件传输协议)是用于发送电子邮件的协议,它提供可靠且有效的电子邮件传输服务;POP3(邮局协议)是用于接收电子邮件的协议。它允许用户从邮件服务器上下载收到的邮件到本地计算机,同时删除保存在邮件服务器上的邮件;IMAP(Internet邮件访问协议)也是一种用于访问和管理电子邮件的协议。与POP3类似,但IMAP在邮件的管理和访问上更加灵活,提供了更多的功能和便利性,使用户可以更方便地管理邮件。
这里我们选择大家几乎都有的QQ邮箱作为载体(薅马x腾的羊毛),大家进入自己的QQ邮箱开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务:
这里我们会获取到一个授权码,请copy这个授权码后面代码中会使用到。
发邮件
在这里我也是改进了下网络上大佬们的代码,主要优化贡献如下:
- 新增读取ini文件配置,可以修改配置文件中文件夹的路径;
- 新增读取ini文件配置,设置一次发送图像的上限;
- 改单张图像为多张图像共同发送至自己的邮箱中;
shell
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将指定文件夹下的图像数据以附件形式发送给自己。通过此项目,用户可以轻松地设置指定文件夹,并自动定期扫描该文件夹下的新增图像数据。从而大大简化了数据分享的流程,提高了工作效率。不过大家一定要在甲方授权下进行采集
此博客仅作技术交流使用