ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求一个邮件延迟发送的方法,顺便分享一个个人认为不错的检查附件的vba

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-8-18 11:16 | 显示全部楼层 |阅读模式
我用的outlook2010,outlook规则里面的延迟发送邮件,最小间隔是1分钟,这个有点长,有时候碰到比较急的邮件,要等1分钟才发出去实在是太急人了。个人认为10秒的延迟发送也就足够了,肯定来得及后悔。所以想用vba做一个。

看了之前的帖子,试着用这个语句来延迟发送,在当前时间基础上延迟10秒:
item.DeferredDeliveryTime=DateAdd("s",10,now())

但发现实际效果不如人意,这个DeferredDeliveryTime总是自动取整的分钟数。比如现在是10:50:20,那么DateAdd("s",10,now)之后应该是10:50:30,但实际上,如果msgbox item.DeferredDeliveryTime电话,会发现这个DeferredDeliveryTime被设定成10:51:00,后面这个秒数总是自动取0。

求高手解决。另外我想的另外一个方法,直接在写完邮件点击发送按钮之后,出现一个10秒倒计时的对话框,如果倒计时为0就开始发送,如果中途点击了“取消”,就取消发送。不过,用msgbox好像不能显示倒计时,也不能自动关闭,我的vba知识很少,不知道该用什么方法,求助。

另外,分享一个个人觉得比较好的检查附件的vba,从网上查到的,感谢原作者。这个vba的优点在于:可以自己设定检查的关键字。记得把outlook的宏安全设定为“低”:
  1. Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

  2. If TypeName(Item) <> "MailItem" Then Exit Sub
  3. ' VBA program for Outlook, (c) Dan Evans. dan at danevans.co.uk
  4. ' Will check if your outgoing email mentions an attachment, but you've
  5. ' forgotten to attach it

  6. ' v1.03b of 29/7/05 - Modified by Leonard Slingerland (leonard at slingerland.biz) to have array of words rather than just one
  7. ' v1.03 of 10/8/04 - Modified to search through subject line as well as message body
  8. ' v1.02 of 16/10/02 - No change to code, but tested works with Outlook 2002 as well as Outlook 2000
  9. ' v1.01 of 23/9/01 - OK for "Attach" as well as "attach"
  10. ' v1.00 of 21/9/01 - Initial working version

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

  15. ' ADDED BY LS >>>
  16. ' - Does not search for "Attach", but for all strings in an array that is defined here
  17. Dim sSearchStrings(2) As String
  18. Dim bFoundSearchstring As Boolean
  19. Dim i As Integer ' loop var for FOR-NEXT-loop
  20. bFoundSearchstring = False

  21. sSearchStrings(0) = "attach"
  22. sSearchStrings(1) = "enclose"
  23. sSearchStrings(2) = "附件"


  24. ' ADDED BY LS <<<

  25. intOldmsgstart = InStr(Item.Body, "-----Original Message-----")
  26. ' intOldmsgstart is the location of where old/re/fwd msg starts. Will be 0 if new msg

  27. If intOldmsgstart = 0 Then
  28.     strThismsg = Item.Body + " " + Item.Subject
  29. Else
  30.     strThismsg = Left(Item.Body, intOldmsgstart) + " " + Item.Subject
  31. End If
  32. ' The above if/then/else will set strThismsg to be the text of this message only,
  33. ' excluding old/fwd/re msg
  34. ' IE if the original included message is mentioning an attachment, ignore that
  35. ' Also includes the subject line at the end of the strThismsg string

  36. ' ADDED BY LS >>>
  37. For i = LBound(sSearchStrings) To UBound(sSearchStrings)
  38.     If InStr(LCase(strThismsg), sSearchStrings(i)) > 0 Then
  39.         bFoundSearchstring = True
  40.         Exit For
  41.     End If
  42. Next i
  43. ' ADDED BY LS <<<

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


  54. End Sub
复制代码



TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-18 11:18 | 显示全部楼层
感觉上面的代码有些乱,因此去掉注释之后,再发一遍:
  1. Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

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

  3. Dim intRes As Integer
  4. Dim strMsg As String
  5. Dim strThismsg As String
  6. Dim intOldmsgstart As Integer


  7. Dim sSearchStrings(2) As String
  8. Dim bFoundSearchstring As Boolean
  9. Dim i As Integer ' loop var for FOR-NEXT-loop
  10. bFoundSearchstring = False

  11. sSearchStrings(0) = "attach"
  12. sSearchStrings(1) = "enclose"
  13. sSearchStrings(2) = "附件"



  14. intOldmsgstart = InStr(Item.Body, "-----Original Message-----")


  15. If intOldmsgstart = 0 Then
  16.     strThismsg = Item.Body + " " + Item.Subject
  17. Else
  18.     strThismsg = Left(Item.Body, intOldmsgstart) + " " + Item.Subject
  19. End If

  20. For i = LBound(sSearchStrings) To UBound(sSearchStrings)
  21.     If InStr(LCase(strThismsg), sSearchStrings(i)) > 0 Then
  22.         bFoundSearchstring = True
  23.         Exit For
  24.     End If
  25. Next i


  26. If bFoundSearchstring Then
  27.     If Item.Attachments.Count = 0 Then
  28.         strMsg = "Attachment Checker:" & Chr(13) & Chr(10) & "邮件内容提到了附件,但没有找到任何附件!" & Chr(13) & Chr(10) & "确定不添加附件吗?"
  29.         intRes = MsgBox(strMsg, vbYesNo + vbDefaultButton2 + vbExclamation, "You forgot the attachment!")
  30.         If intRes = vbNo Then
  31.             Cancel = True
  32.         End If
  33.     End If
  34. End If


  35. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2011-8-18 11:37 | 显示全部楼层
谢谢分享,待会在2003试试。

就是有个问题,很急的邮件为什么不立即发送呢,为什么还要延迟?

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-18 12:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
dsd999 发表于 2011-8-18 11:37
谢谢分享,待会在2003试试。

就是有个问题,很急的邮件为什么不立即发送呢,为什么还要延迟?

多谢版主了。很急的邮件,延迟10秒发送还是可以的,只不过延迟1分钟就有点久了。所以,用outlook自带的规则时,延迟时间最短1分钟,就不是很合适。

TA的精华主题

TA的得分主题

发表于 2011-8-18 13:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
很急的邮件为什么不立即发送呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-18 14:17 | 显示全部楼层
本帖最后由 leucine 于 2011-8-18 14:34 编辑

是这样,如果在outlook规则里面设置了“所有邮件延迟1分钟发送”,那么就算很急的邮件,点击发送后,它也会等1分钟才发送。如果每次要取消这个规则,再发送,就太麻烦了。

刚刚在excel vba区看到一个函数msgboxex,于是自己动手,顺利解决了问题,贴出来跟大家分享。

为了便于搜索,就新开了一个主题:

http://club.excelhome.net/thread-754442-1-1.html

TA的精华主题

TA的得分主题

发表于 2011-8-18 14:55 | 显示全部楼层
其实我还是不明白急邮件为什么不立刻发送?

你是用VBA创建邮件?

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-18 15:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
dsd999 发表于 2011-8-18 14:55
其实我还是不明白急邮件为什么不立刻发送?

你是用VBA创建邮件?

是这样:为了留一个“后悔药”,所以我需要设定邮件延迟一段时间发送,就像Gmail里面一样。在这段时间里面,如果突然觉得邮件不该发,或者还有需要补充的,就可以取消发送,进行更改。

以前我采用的方法是,直接使用outlook自动规则里面的延迟发送,这个规则里面最小的延迟时间是1分钟,没法用更短的时间。

这样,所有的邮件点击发送之后,都会延迟1分钟发送,1分钟之内如果后悔了,就可以不发送,同时我也在规则里面也设定了“重要性为高”的邮件就不延迟发送,确保有些邮件能够马上发送。

但实际使用中,有些重要邮件需要马上发送的,我却忘了更改重要性为高。这样导致这些邮件都是延迟1分钟发送了。

我希望模仿Gmail的方式,所有邮件都延迟发送,但延迟时间仅10~20秒。

不是我不想立刻发送这些重要邮件啊,问题是,每次重要邮件如果要马上发送的话,都要设置成重要性高,或者取消自动规则,是件很麻烦的事。

TA的精华主题

TA的得分主题

发表于 2011-8-18 15:51 | 显示全部楼层
这次说的很详细,明白了。看来你每天要发很多封邮件。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-31 03:45 , Processed in 1.035882 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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