ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] vba调用cdo发送邮件(qq邮箱)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-5-4 19:58 | 显示全部楼层 |阅读模式
最近正好用到这个功能,搜索论坛看到轩辕轼轲老师的帖子代码
Excel通过VBA调用CDO发邮件
http://club.excelhome.net/thread-794521-1-1.html
(出处: ExcelHome技术论坛)


操作系统win10(64bit)+office2016(32bit)
老师的代码后续跟帖反映不能用,主要是时间比较久远,有些设置变了

如果用的是qq邮箱,首先要开授权码

https://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1001256&&id=28


Sub CDOSENDEMAIL()
Dim CDOMail As Variant
On Error Resume Next '出错后继续执行
Application.DisplayAlerts = False '禁用系统提示
ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly '将工作簿设置为只读模式
Set CDOMail = CreateObject("CDO.Message") '创建对象
CDOMail.From = "10000@qq.com" '设置发信人的邮箱
CDOMail.To = "10000@qq.com" '设置收信人的邮箱
CDOMail.Subject = "主题:用CDO发送邮件试验" '设定邮件的主题
'CDOMail.TextBody = "文本内容" '使用文本格式发送邮件
CDOMail.HtmlBody = "当您看到此封邮件,表明CDO设置正确" '使用Html格式发送邮件
CDOMail.AddAttachment ThisWorkbook.FullName '发送本工作簿为附件
stUl = "http://schemas.microsoft.com/cdo/configuration/" '微软服务器网址
With CDOMail.Configuration.Fields
.Item(stUl & "smtpusessl") = True
.Item(stUl & "smtpserver") = "smtp.qq.com" 'SMTP服务器地址
.Item(stUl & "smtpserverport") = 465 'SMTP服务器端口
.Item(stUl & "sendusing") = 2 '发送端口
.Item(stUl & "smtpauthenticate") = 1 '远程服务器需要验证
.Item(stUl & "sendusername") = "10000" '发送方邮箱名称
.Item(stUl & "sendpassword") = 上面连接生成的授权码,非你qq邮箱密码" '发送方邮箱密码
.Item(stUl & "smtpconnectiontimeout") = 60 '连接超时(秒)
.Update
End With
CDOMail.Send '执行发送
Set CDOMail = Nothing '发送成功后即时释放对象
If Err.Number = 0 Then
MsgBox "成功发送邮件", , "温馨提示" '如果没有出错,则提示发送成功
Else
MsgBox Err.Description, vbInformation, "邮件发送失败" '如果出错,则提示错误类型和错误代码
End If
ThisWorkbook.ChangeFileAccess Mode:=xlReadWrite '将工作簿设置为读写模式
Application.DisplayAlerts = True '恢复系统提示
End Sub



红色是在轩辕轼轲代码上按照当下的配置做了微调,调整完毕后亲测可用。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-7-28 10:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
要求对象怎么处理啊?win7+excel2016

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-29 10:22 | 显示全部楼层
岁月无敌 发表于 2019-7-28 10:38
要求对象怎么处理啊?win7+excel2016

cdosys.dll  下载 并注册后再调用试试

TA的精华主题

TA的得分主题

发表于 2019-11-21 15:21 | 显示全部楼层
本帖最后由 ndt3 于 2019-11-21 21:25 编辑

ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly '将工作簿设置为只读模式
ThisWorkbook.ChangeFileAccess Mode:=xlReadWrite '将工作簿设置为读写模式
这两句适用于对本文件发送,如果穿插有其他sub可能会造成不执行。
我想了个办法绕开了。新建一个新的文件,把需要的工作表复制过去,发送完成删除。测试OK。


代码如下:

Sub CDOSENDEMAIL()
'On Error Resume Next '出错后继续执行
Application.DisplayAlerts = False '禁用系统提示
'ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly '将工作簿设置为只读模式
Set CDOMail = CreateObject("CDO.Message") '创建对象
CDOMail.From = "1234567@qq.com" '设置发信人的邮箱
CDOMail.To = "1234567@qq.com" '设置收信人的邮箱
CDOMail.Subject = "主题:用CDO发送邮件试验" '设定邮件的主题
'CDOMail.TextBody = "文本内容" '使用文本格式发送邮件
CDOMail.HtmlBody = a '使用Html格式发送邮件
CDOMail.AddAttachment ThisWorkbook.Path & "\" & "a" & ".xlsx" '发送当前目录下的工作簿a为附件
stUl = "http://schemas.microsoft.com/cdo/configuration/" '微软服务器网址
With CDOMail.Configuration.Fields
.Item(stUl & "smtpusessl") = True
.Item(stUl & "smtpserver") = "smtp.qq.com" 'SMTP服务器地址
.Item(stUl & "smtpserverport") = 465 'SMTP服务器端口
.Item(stUl & "sendusing") = 2 '发送端口
.Item(stUl & "smtpauthenticate") = 1 '远程服务器需要验证
.Item(stUl & "sendusername") = "1234567" '发送方邮箱名称
.Item(stUl & "sendpassword") = "" '上面连接生成的授权码,非你qq邮箱密码" '发送方邮箱密码
.Item(stUl & "smtpconnectiontimeout") = 60 '连接超时(秒)
.Update
End With
CDOMail.Send '执行发送
Set CDOMail = Nothing '发送成功后即时释放对象
'If Err.Number = 0 Then
'MsgBox "成功发送邮件", , "温馨提示" '如果没有出错,则提示发送成功
'Else
'MsgBox Err.Description, vbInformation, "邮件发送失败" '如果出错,则提示错误类型和错误代码
'End If
'ThisWorkbook.ChangeFileAccess Mode:=xlReadWrite '将工作簿设置为读写模式
Kill ThisWorkbook.Path & "\" & "a" & ".xlsx"'新工作簿删除
'Call dayin
Application.DisplayAlerts = True '恢复系统提示
End Sub

           Sub xjwj()

              Set Wk = Workbooks.Add
                 wd = ThisWorkbook.Name

                 Application.DisplayAlerts = False
                 Wk.SaveAs Filename:=ThisWorkbook.Path & "\" & "a" & ".xlsx" '新建一当前目录下命名为a工作簿
                 Windows(wd).Activate
                 Sheets("邮件").Select
                 Sheets("邮件").Copy Before:=Workbooks(“a"& ".xlsx").Sheets(1)  '全部工作表转移
                  Wk.Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Delete '删除工作簿的废工作表  Cells(105536, 3).End(xlUp).row

             Wk.Save
            Wk.Close'新建的工作簿关闭
            Call CDOSENDEMAIL'新建后发送
           End Sub


TA的精华主题

TA的得分主题

 楼主| 发表于 2019-11-22 12:43 | 显示全部楼层
附件发当前工作簿是个特殊的操作,需要加:
ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly '将工作簿设置为只读模式
ThisWorkbook.ChangeFileAccess Mode:=xlReadWrite '将工作簿设置为读写模式

如果发的是非当前工作簿,那么就去掉这两句,然后修改附件那句
CDOMail.AddAttachment ThisWorkbook.FullName '  将红色的修改为文件路径即可

TA的精华主题

TA的得分主题

发表于 2021-3-6 08:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-11-17 12:40 | 显示全部楼层
您好,我使用您的代码,提示发送失败,邮件无法发送到 SMTP 服务器。传输错误代码为 0x80040217邮件无法发送到 SMTP 服务器。传输错误代码为 0x80040217。服务器响应为 not available

TA的精华主题

TA的得分主题

发表于 2021-11-24 07:18 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-11-30 12:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 星语心愿 于 2021-11-30 12:32 编辑

有没有办法实现这样的功能:复制当前工作簿的前两张工作表另存为一个工作簿,在工作簿的原名后面加上当前日期,再将该工作簿作为附件调用自己的qq邮箱发送到指定的qq邮箱,邮件名称就是发送的工作簿的名称?

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-30 19:20 | 显示全部楼层
星语心愿 发表于 2021-11-30 12:30
有没有办法实现这样的功能:复制当前工作簿的前两张工作表另存为一个工作簿,在工作簿的原名后面加上当前日 ...

试试看,代码没测试,如果有错调试下
先生成邮件附件在制定位置
然后发送该附件

  1. Sub CDOSENDEMAIL()
  2. Dim CDOMail As Variant
  3. On Error Resume Next '出错后继续执行
  4. Application.DisplayAlerts = False '禁用系统提示

  5. '生成附件工作簿
  6. p = ThisWorkbook.Path
  7. f = "邮件的附件.xlsx"
  8. Sheets(Array("表名1", "表名2")).Copy
  9. ActiveWorkbook.SaveAs Filename:=p & "" & f, FileFormat:=51
  10. ActiveWindow.Close


  11. Set CDOMail = CreateObject("CDO.Message") '创建对象
  12. CDOMail.From = "10000@qq.com" '设置发信人的邮箱
  13. CDOMail.To = "10000@qq.com" '设置收信人的邮箱
  14. CDOMail.Subject = "主题:用CDO发送邮件试验" '设定邮件的主题
  15. 'CDOMail.TextBody = "文本内容" '使用文本格式发送邮件
  16. CDOMail.HtmlBody = "当您看到此封邮件,表明CDO设置正确" '使用Html格式发送邮件
  17. CDOMail.AddAttachment p & "" & f '发送本工作簿为附件
  18. stUl = "http://schemas.microsoft.com/cdo/configuration/" '微软服务器网址
  19. With CDOMail.Configuration.Fields
  20. .Item(stUl & "smtpusessl") = True
  21. .Item(stUl & "smtpserver") = "smtp.qq.com" 'SMTP服务器地址
  22. .Item(stUl & "smtpserverport") = 465 'SMTP服务器端口
  23. .Item(stUl & "sendusing") = 2 '发送端口
  24. .Item(stUl & "smtpauthenticate") = 1 '远程服务器需要验证
  25. .Item(stUl & "sendusername") = "10000" '发送方邮箱名称
  26. .Item(stUl & "sendpassword") = 上面连接生成的授权码,非你qq邮箱密码" '发送方邮箱密码
  27. .Item(stUl & "smtpconnectiontimeout") = 60 '连接超时(秒)
  28. .Update
  29. End With
  30. CDOMail.Send '执行发送
  31. Set CDOMail = Nothing '发送成功后即时释放对象
  32. If Err.Number = 0 Then
  33. MsgBox "成功发送邮件", , "温馨提示" '如果没有出错,则提示发送成功
  34. Else
  35. MsgBox Err.Description, vbInformation, "邮件发送失败" '如果出错,则提示错误类型和错误代码
  36. End If

  37. Application.DisplayAlerts = True '恢复系统提示
  38. End Sub
复制代码

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-23 00:37 , Processed in 0.044990 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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