公司合规章程比较多,公司邮箱的SMTP邮件端口都不给随意使用。但是有一些日常繁琐重复的工作需要用邮件群发小组内部分享。 所以直接调用了python中win32com的模块。 可以实现调用本地电脑outlook客户端,编辑,发送邮件。 方法简单也不需要使用SMTP端口。
首先安装调用win32com模块,该模块基本包含了office系列工具的全部日常操作的借口,有时间的同学也可以去microsoft官网看一下相关的接口内容。
https://docs.microsoft.com/en-us/previous-versions/office/office-365-api/
import win32com.client as win32
创建一个函数,参数为:收件人,主题,正文,附件。生成文件后自动发送。
def sendmail(self,receivers,title,body,attach_path=None):
outlook=win32.Dispatch('Outlook.Application')
mail=outlook.CreateItem(0)
if isinstance(receivers,list): #判断存在多少收件人
if len(receivers)>1:
mail.To=';'.join(receivers)
else:
mail.To=receivers[0]
else:
mail.To=receivers
mail.Subject=title
mail.Body=body
if attach_path is None: #判断是否存在附件地址文件
pass
else:
mail.Attachments.Add(attach_path)
mail.Send()
发送后,也可以查询当前收件箱最新一封邮件
def readNewMail(self):
outlook = win32.Dispatch('Outlook.Application').GetNamespace("MAPI")
inbox=outlook.GetDefaultFolder(6)
body_content=inbox.Items.GetLast().body
return body_content
这里 GetDefaultFolder 数值6为收件箱的index, 其他位置也可以去官方API中查询
olFolderCalendar(9), olFolderContacts(10), olFolderDeletedItems(3), olFolderDrafts(16), olFolderInbox(6), olFolderJournal(11), olFolderNotes(12), olFolderOutbox(4), olFolderSentMail(5), or olFolderTasks(13).
全部代码如下,供参考:
import win32com.client as win32
class outlook():
'''
操作一下本地outlook
'''
def init(self):
pass
def openoutlook(self):
pass
def sendmail(self,receivers,title,body,attach_path=None):
'''
发送邮件
:param receivers:收件人
:param title:主题
:param body:邮件内容
:param attach_path:附件地址
;retuxn:发送
'''
outlook=win32.Dispatch('Outlook.Application')
mail=outlook.CreateItem(0)
if isinstance(receivers,list):
if len(receivers)>1:
mail.To=';'.join(receivers)
else:
mail.To=receivers[0]
else:
mail.To=receivers
mail.Subject=title
mail.Body=body
if attach_path is None:
pass
else:
mail.Attachments.Add(attach_path)
mail.Send()
def draftmail(self,receivers,title,body,attach_path=None):
'''
保存一份草稿
:param receivera:收件人
:param title:主题
:param body:邮件内容
:param attach_path:附件地址
:return:保存
'''
outlook=win32.Dispatch('Outlook.Application')
mail=outlook.CreateItem(0)
#如果多个人,这里做个判断
if isinstance(receivers,list):
if len(receivers)>1:
mail.To=';'.join(receivers)
else:
mail.To=receivers[0]
else:
mail.To=receivers
mail.Subject=title
mail.Body=body
if attach_path is not None:
mail.Attachments.Add(attach_path)
mail.Save()
def readNewMail(self):
outlook = win32.Dispatch('Outlook.Application').GetNamespace("MAPI")
inbox=outlook.GetDefaultFolder(6)
body_content=inbox.Items.GetLast().body
return body_content
if __name__=='__main__':
otlk = outlook()
last_new_mail=otlk.readNewMail()
print(last_new_mail)
title="****test new script"
receivers="XXX@gmail.com"
body='test email from my script,easy peasy lemon squeezy'
filep=r"C:/sd/dsf/sss.xlsx"
otlk.sendmail(title=title,receivers=receivers,body=body,attach_path=filep)
:) 如果有所帮助,请点赞,评论。欢迎讨论咨询
网友评论