excel利用vba发送邮件
Sub Mail_Text_in_Body()
Dim msg As String, cell As Range
Dim Recipient As String, Subj As String, HLink As String
Dim Recipientcc As String, Recipientbcc As String
Recipient = "someone@21cn.com"
Recipientcc = ""
Recipientbcc = ""
Subj = "Testbodymail"
msg = "Dear customer"
HLink = "mailto:" & Recipient & "?" & "cc=" & Recipientcc & "&" & "bcc=" & Recipientbcc & "&"
HLink = HLink & "subject=" & Subj & "&"
HLink = HLink & "body=" & msg
ActiveWorkbook.FollowHyperlink (HLink)
Application.Wait (Now + TimeValue("0:00:03"))
Application.SendKeys "%s"
End Sub
VBA 中发送邮件(一. 使用 Outlook 组件)
01.'使用 Outlook 来发送邮件了
02.Sub SendEmailByOutlook()
03.
04. '要能正确发送并需要对Microseft Outlook进行有效配置
05. On Error Resume Next
06. Dim rowCount, endRowNo
07. Dim objOutlook As New Outlook.Application
08. Dim objMail As MailItem
09.
10. '取得当前工作表与Cells(1,1)相连的数据区行数
11. endRowNo = Cells(1, 1).CurrentRegion.Rows.Count
12.
13. '创建objOutlook为Outlook应用程序对象
14. Set objOutlook = New Outlook.Application
15.
16. '开始循环发送电子邮件,比如从第二行开始,第一行是标题
17. For rowCount = 2 To endRowNo
18.
19. '创建objMail为一个邮件对象
20. Set objMail = objOutlook.CreateItem(olMailItem)
21. With objMail
22.
23. '设置收件人地址(比如从 Excel 表的第一列“E-mail地址”字段中获得)
24. .To = Cells(rowCount, 1).Value '"fantasia@sina.com"
25.
26. '设置邮件主题(比如从 Excel 表的第二列“邮件主题”字段中获得)
27. .Subject = Cells(rowCount, 2).Value '"邮件主题"
28.
29. '设置邮件内容(比如从 Excel 表的第三列“邮件内容”字段中获得)
30. .Body = Cells(rowCount, 3).Value '"邮件内容"
31.
32. '设置附件(比如从 Excel 表的第四列“附件”字段中获得)
33. .Attachments.Add Cells(rowCount, 4).Value '"c:\\users.ctl"
34.
35. .Send
36.
37. End With
38.
39. '销毁objMail对象
40. Set objMail = Nothing
41.
42. Next
43.
44. '销毁objOutlook对象
45. Set objOutlook = Nothing
46.
47.End Sub
Excel 中贴个按钮,单击事件指向到这个过程。Excel 的 Visual Basic 编辑器中还必须引用 Microsoft Outlook 11.0 Object Library,具体组件名视你安装的 Outlook 版可能有所不同。只能使用 Outlook 而不是 Outlook Express。
您必须对 Outlook 进行了正确的配置,即达到能使用默认帐户发送邮件,上面代码实现的就是使用 Outlook 的默认帐户来发送邮件。
这种方法有一个很要命的问题就是,每发一封的时候会弹出一个 Outlook 的安全提示,如图:
一个个“是” 吧,这一定会让你厌其烦的,有说用 SendKeys 或别的软件来自动“是”,但都不太美妙。还不能真正达到全自动批量发邮件的效果。倒是在 Outlook Express 和 Outlook 2007 的安全设置中有这么一个选项“当别的应用程序试图用我的名义发送电子邮件时警告我(W)” 的可选项,可是一则 VBA 不知如何使用 Outlook Express,二则我电脑里没安装 2007 这么高级版本。所以得另寻他法了,那就是 JMail 组件。
可以在网络上搜索 w3 JMail Personal V4.3,或者直接到官网 http://www.dimac.net 去下载,w3 Jmail 的授权方式是免费的。默认位置安装好 JMail 之后,是在 C:\Program Files\Dimac\w3JMail4 可以看到 Examples 目录、jmail.dll、w3jmail4.pdf 和 readme.txt 文件。可以查阅w3jmail4.pdf 中的使用帮助。我们所要的文件其实只是那个 jmail.dll,安装程序会自动帮你注册 jmail.dll。若未运行安装程序,只是拷贝了 jmail.dll,则要运行 regsvr32 jmail.dll 注册它即可。
可以看看那个 Examples 目录,发现可支持 ASP、Assembly、Delphi、Visual C++、xml,自然像 JS、VBS、VB、VBA 那样的语言中也能使用。它不仅可以用来发送邮件,也能通过 POP 协议接收邮件。下面看一段接收邮件的代码:
01.'使用 JMail 组件来发送邮件
02.Function JmailSend(Subject, HtmlBody, MailTo)
03. Dim JmailMsg As New jmail.Message
04. With JmailMsg
05. .Encoding = "GBK"
06. .MailServerUserName = "Unmi" 'smtp 验证用户名
07. .MailServerPassWord = "xxxxxx" 'smtp 验证密码
08. .AddRecipient MailTo '收件人
09. .AddRecipientCC "fantasia@sina.com" '抄送
10. .AddRecipientBCC "broodwar@2911.net" '暗送
11. .From = "unmi@2911.net"
12. .FromName = "隔叶黄莺"
13. .Charset = "GBK"
14. .ContentType = "text/html"
15. '.Priority = 1 '重要级别
16. .Logging = True '为 True,可用 JmailMsg.Log 获得与服务器交互的详细日志信息
17. .Silent = True '为 True,出错时会有 JmailMsg.ErrorMessage 回送消息
18. .Subject = Subject
19. '.Body = HtmlBody '作为纯文本内容发送,设置 Body 属性
20. .HtmlBody = HtmlBody '用这个可以发送 Html 内容
21.
22. .AddAttachment "c:\users.ctl" '发送附件
23.
24. If .Send("mail.2911.net") Then '指定邮件服务器
25. JmailSend = "发送成功"
26. Else
27. JmailSend = JmailMsg.ErrorMessage
28. End If
29. MsgBox JmailMsg.Log
30. .Close
31. End With
32. Set JmailMsg = Nothing
33.End Function
在 Excel 的 Microsoft Visual Basic 编辑器中要引用注册的“JMail 4.0 Library”, 代码中的 AddXxx 方法可以执行多次,如增加多个收件人、多个附件等。真正实现批量全自动发送,程序中可动态的选择邮件服务器。
用 w3 JMail 组件比起调用 Outlook 可要方便的多,Outlook 可以不用配置,发布时只需要带个 jmail.dll 动态库,用 regsvr32 jmail.dll 注册一下即可。
,就是 XMLHttpRequest,把功能分离,Excel 只提交 Http 请求,由 JSP 来完成实际的邮件发送工作,当然也可以实现为其他的形式。所以也就有两部分实现代码,分别为:
JSP 代码,使用的是 Apache 的 commons-email 组件,它还需要用到 activation.jar 和 mail.jar,关于 commons-email 的使用可参考前面的一篇:用 apache commons-email 轻松发送无乱码邮件。比如文件存为 sendmail.jsp,通过浏览器来访问时用的 URL 是 http://192.168.1.100:8080/WebUtils/sendmail.jsp:
01.<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
02.<%@ page import="org.apache.commons.mail.*,java.net.*"%>
03.<%
04.
05./*发送邮件的页面,只允许以 post 方式提交
06. 参数说明:
07. to: 邮件接收人
08. subject: 邮件标题
09. body: 邮件正文
10.*/
11.
12.String method = request.getMethod();
13.
14.if(method.equalsIgnoreCase("post")){ //只处理 post 请求
15.
16. //把请求的字符集设为 iso8859-1,然后调用 toUTF8 来解决乱码问题
17. request.setCharacterEncoding("iso8859-1");
18. String to = toUTF8(request.getParameter("to"));
19. String subject = toUTF8(request.getParameter("subject"));
20. String body = toUTF8(request.getParameter("body"));
21.
22. // 发送带附件及HTML内容的邮件
23. HtmlEmail email = new HtmlEmail();
24. email.setHostName("smtp.sina.com");
25.
26. // 需要邮件发送服务器验证,用户名/密码
27. email.setAuthentication("fantasia", "xxxxxx");
28. email.addTo(to);
29. email.setFrom("fantasia@sina.com", "Unmi");
30.
31. // 设置主题的字符集为UTF-8
32. email.setCharset("UTF-8");
33. email.setSubject(subject);
34. try{
35. email.setHtmlMsg(body);
36. email.attach(new URL("file:///c|SendMail.java"), "SendMail.java","SendMail.java");
37. email.buildMimeMessage();
38. email.send();
39. out.print("发送成功");
40. }catch(Exception ex){
41. out.print(ex.getMessage());
42. }
43.}
44.%>
45.<%!
46. private String toUTF8(String src) throws UnsupportedEncodingException{
47. String dst = new String(src.getBytes("ISO8859-1"),"UTF-8");
48. return dst;
49. }
50.%>01.Function SendEmailByHttp(MailTo, Subject, Body)
02. Dim XmlHttp As New MSXML2.XMLHTTP60 '变量类型视你引用的 MSXML 版本略有不同,如 XMLHTTP50
03. Dim PageUrl, data
04. data = "to=" & MailTo & "subject=" & Subject & "&body=" & Body
05. PageUrl = "http://192.168.1.100:8080/WebUtils/sendmail.jsp"
06.
07. '假如你的 web 应用配置了诸如 form 验证,则需加上后两个参数
08. XmlHttp.Open "POST", PageUrl, False, "username", "password" '同步方式
09.
10. 'post 提交 form 时需要设置这个请求头
11. XmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
12.
13. '后面几行有关于设置请求头中的字符集好像解决不了乱码问题
14. 'XmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"
15. 'XmlHttp.setRequestHeader "Accept-Charset", "UTF-8"
16. 'XmlHttp.setRequestHeader "charset", "UTF-8"
17. 'XmlHttp.setRequestHeader "Content-Type", "charset=UTF-8"
18.
19. XmlHttp.Send data '发送请求
20. If XmlHttp.Status = 200 Then
21.
22. '去除 jsp 中输出的回车、换行和两边空格
23. SendEmailByHttp = Trim(Replace(Replace(XmlHttp.responseText, Chr(10), ""), Chr(13), ""))
24. Else
25. SendEmailByHttp = "发送失败!" '请求不正常的失败返回
26. End If
27.End Function