背景
公司需求:读取收件箱,提取关键字;本来以为会是正常的163邮箱,或者qq邮箱,结果被告知是 exchange。
过程
本着传统程序员的三部曲:倒杯水,点根烟,打开百度。网上找了点案例,代码我就不贴了,最原始的code应该是这位老哥的了:
https://www.cnblogs.com/chendongblog/p/12500812.html
(吐槽一句:各位大大,能不能别单纯的粘贴、复制,然后发帖。。。没有样式,阅读费力就算了;没有任何介绍说明,自行调试时真的比较头疼)
言归正传
我的差异化体现在:
1、要求以第一封邮件为准,而按上面老哥的案例,是倒序排列的,代码体现在:
for item in inbox.all().order_by("-datetime_sent"):
遂修改为:
for item in inbox.all().order_by("datetime_sent"):
实现了正序排列;
2、发现了同名,我丢!
还好,系统内是记录了用户邮箱的,然后再get_email_list方法里修改取值
sender_name = item.sender.email_address
大致的代码段贴在这儿了:
(其实item里,存在3个属性值,可以通过print(item)查看具体)
for item in inbox.all().order_by("datetime_sent"):
subject = item.subject
if not item.sender:
continue
# sender_name = item.sender.name
# -----这里修改为使用邮箱地址------
sender_name = item.sender.email_address
send_time = (item.datetime_sent + datetime.timedelta(hours=8)).strftime(
"%Y-%m-%d %H:%M:%S"
)
b1 = (
True
if not subject_like or subject_like.lower() in subject.lower()
else False
)
b2 = True if not sender or sender.lower() in sender_name.lower() else False
if b1 and b2:
email_list.append([subject, sender_name, send_time])
还有别忘了download_email方法里,把入参sender修改为匹配email_address
for item in inbox.all().order_by("-datetime_sent"):
# if sender.lower() in item.sender.name.lower():
if sender.lower() in item.sender.email_address.lower():
_dict["content"] = item.text_body
_dict["attachments"] = [
{"name": attachment.name, "content": attachment.content}
for attachment in item.attachments
if isinstance(attachment, FileAttachment)
]
# print(_dict["content"])
if _dict:
log.info('one mail meets conditions')
return _dict
return
写在最后:案例上的都是没有加异常捕捉的,建议各位大佬在调用时加上异常捕获,方便调试时定位
后续
一个Java项目,需要生成邮件发送,邮件采用html格式。
利用的技术栈:hutool,工具方法:EmailUtils.sendEdrEmail。
以下简单记录遇到的2个问题点:
1、outlook邮箱,html的css格式,只能写在行内style标签,定义在外面的无法引入,head里的style好像也无效;
2、邮件正文需要插入图片的,通过<img src="cid:pictureId" />和EmailUtils.sendEdrEmail方法的参数imageMap即可实现,imageMap的key是img标签cid对应的pictureId,value为图片的InputStream