ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 10596|回复: 7

[分享] outlook邮件发送时自动检查附件,以及延时发送

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-8-18 14:31 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
代码如下,进入outlook后,按alt+f11,在ThisOutlookSession里面贴入如下代码,记得把outlook的宏安全性调整为“低”哦。

win7 ultimate + outlook2010通过,理论上outlook2007也可以,但2003不确定,希望大家多测试。做了有限次的测试,也不能保证没有bug,大家多提意见。

实现功能:
1、按发送后,如果正文或标题里包含“attach”、“附件”,但邮件却没有附件,将弹出提示窗口。支持检测多个关键词,自己修改代码。

2、可以延时发送邮件,延时时间以秒计算。(outlook的规则里面的延时时间最低为1分钟),如果不需要该功能,可在代码里关闭。可以设定重要性为高的邮件是否也延时发送。

延时发送有两种实现方式,可以都尝试一下,建议不了解vba的兄弟还是采用第一种延时发送的方法。:
a、(默认的方式)点击发送后,弹出一个对话框,如果点击ok就马上发送,如果点击cancel就不发送,如果什么都不动,那么10秒钟后自动发送(可自行设置时间)。
b、点击发送后,邮件保存在发件箱里,10秒钟后自动发送。该方法采用mailItem.DeferredDeliverTime属性,但由于本人vba技术有限,因此,如果采用这一方法,延时发送的时间很难控制在10秒,请高手解决。

该vba的原文来自网上,感谢原作者,为了阅读方便,我删掉了原作者的注释信息,请原谅。
  1. Private Declare Function MsgBoxEx Lib "user32" Alias "MessageBoxTimeoutA" ( _
  2.     ByVal hwnd As Long, _
  3.     ByVal lpText As String, _
  4.     ByVal lpCaption As String, _
  5.     ByVal wType As VbMsgBoxStyle, _
  6.     ByVal wlange As Long, _
  7.     ByVal dwTimeout As Long) As Long

  8. Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

  9. If TypeName(Item) <> "MailItem" Then Exit Sub

  10. Dim intRes As Integer
  11. Dim strMsg As String
  12. Dim strThismsg As String
  13. Dim intOldmsgstart As Integer

  14. Dim sSearchStrings(2) As String
  15. Dim bFoundSearchstring As Boolean
  16. Dim i As Integer ' loop var for FOR-NEXT-loop

  17. Dim intDeferStyle As Integer
  18. Dim intDeferTime As Integer
  19. Dim intMailImportance As Integer
  20. Dim bDeferImportance As Boolean

  21. bFoundSearchstring = False

  22. intMailImportance = Item.Importance

  23. '设定附件提醒的相关参数
  24. sSearchStrings(0) = "attach" '正文或标题包含的关键字,当找到这些关键字时,就认定邮件应该带附件
  25. sSearchStrings(1) = "enclose" '可以设定多个关键字,但记得在“Dim sSearchStrings(2) As String”语句中更改数组上限
  26. sSearchStrings(2) = "附件"



  27. '延时发送相关参数,可以更改
  28. intDeferStyle = 1 '延时发送的模式,0=不延时发送,1=跳出倒计时对话框,2=采用outlook自带的延时发送属性DeferredDeliveryTime
  29. intDeferTime = 10 '延时发送的时间,单位秒
  30. bDeferImportance = False '重要性为高的邮件是否也延时发送,0=重要性高的邮件不延时,1=重要性高的邮件也延时

  31. If bDeferImportance Then
  32.     intMailImportance = 1
  33. End If

  34. '检查附件
  35. intOldmsgstart = InStr(Item.Body, "-----Original Message-----")

  36. If intOldmsgstart = 0 Then
  37.     strThismsg = Item.Body + " " + Item.Subject
  38. Else
  39.     strThismsg = Left(Item.Body, intOldmsgstart) + " " + Item.Subject
  40. End If

  41. For i = LBound(sSearchStrings) To UBound(sSearchStrings)
  42.     If InStr(LCase(strThismsg), sSearchStrings(i)) > 0 Then
  43.         bFoundSearchstring = True
  44.         Exit For
  45.     End If
  46. Next i

  47. If bFoundSearchstring Then
  48.     If Item.Attachments.Count = 0 Then
  49.         strMsg = "Attachment Checker:" & Chr(13) & Chr(10) & "邮件内容提到了附件,但没有找到任何附件!" & Chr(13) & Chr(10) & "确定不添加附件吗?"
  50.         intRes = MsgBox(strMsg, vbYesNo + vbDefaultButton2 + vbExclamation, "You forgot the attachment!")
  51.         If intRes = vbNo Then
  52.             ' cancel send
  53.             Cancel = True
  54.         End If
  55.     End If
  56. End If

  57. '延时发送
  58. If intDeferStyle = 1 And intMailImportance <> 2 Then
  59.     '弹出倒计时对话框的方式,实现延时发送
  60.     strMsg = intDeferTime & "秒后发送邮件" & Chr(13) & Chr(10) & "马上发送请点确定,后悔请点取消,否则耐心等待"
  61.     intRes = MsgBoxEx(0, strMsg, "延时发送邮件", vbYesNo + vbInformation, 1, intDeferTime * 1000)
  62.     If intRes = vbNo Then
  63.         Cancel = True
  64.     End If
  65. ElseIf intDeferStyle = 2 And intMailImportance <> 2 Then
  66.     '采用outlook自带的DeferredDeliveryTime属性实现延时发送,有些小问题,很难控制10秒后准确发送,请高手解决,菜鸟可以用第一种延时发送方式
  67.     Item.DeferredDeliveryTime = DateAdd("s", intDeferTime, Now)
  68.    
  69. End If

  70. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-8-18 15:00 | 显示全部楼层
那段代码在2003里没问题。
你的操作系统是什么?

2003里没有msgboxex函数。

TA的精华主题

TA的得分主题

发表于 2011-8-18 14:52 | 显示全部楼层
CreateObject("Wscript.Shell").Popup "本窗口将在三秒钟后自动关闭……", 1, "MsgBox", 64

试试这个

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-18 14:56 | 显示全部楼层
dsd999 发表于 2011-8-18 14:52
CreateObject("Wscript.Shell").Popup "本窗口将在三秒钟后自动关闭……", 1, "MsgBox", 64

试试这个

呵呵,已经试过了,但不知道为什么,在我的outlook2010里面,用Wscript的方法,弹出的窗口没法自动关闭。我也是在excel vba里面找了半天之后,终于发现msgboxex这个函数能够自动关闭。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-18 15:06 | 显示全部楼层
dsd999 发表于 2011-8-18 15:00
那段代码在2003里没问题。
你的操作系统是什么?

我是win7 ultimate+outlook2010.

可能2003里面把MsgBoxEx改为MessageBoxTimeout吧。并且把第一行改为:
Private Declare Function MessageBoxTimeout Lib "user32" Alias "MessageBoxTimeoutA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long, ByVal wlange As Long, ByVal dwTimeout As Long) As Long

可以试试这样行不行。

我是在这个帖子里面看到的这个函数:http://club.excelhome.net/thread-590980-1-1.html

但在我的系统上用MessageBoxTimeout提示找不到函数,后来才换成MsgBoxEx的。

TA的精华主题

TA的得分主题

发表于 2012-12-13 08:31 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-1-2 15:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
2010的好像没有反应,直接发出去了

TA的精华主题

TA的得分主题

发表于 2015-11-26 21:31 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-18 11:04 , Processed in 0.045784 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表