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