9

这是关于使用 VBA 发送电子邮件的几条消息的后续。

大多数建议使用 Outlook、CDO 或 MAPI:

Set appOL = CreateObject("Outlook.Application") 

Set msgOne = CreateObject("CDO.Message") 

Set mapi_session = New MSMAPI.MAPISession

但显然 Outlook 会要求我更改我们的工作组安全设置,而 CDO 和 MAPI 会要求我添加 DLL 或其他东西。

我正在尝试使用 Excel 来组织工作中的小组作业,但我无法以任何方式修改其他人的计算机。

有没有更简单的方法从 Excel 宏发送电子邮件?
我所需要的只是消息正文中没有附件的一段文本。

整个星期我都在浏览 Google、MSDN 和 StackOverflow,但我被困在一艘无处可去的慢船上。

4

3 回答 3

9

基于 Marc 提到的内容,这是一个久经考验的版本。

Option Explicit

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _
ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Sub SendMail()
    Dim objMail As String
    Dim oMailSubj, oMailTo, oMailBody As String

    On Error GoTo Whoa

    oMailSubj = "YOUR SUBJECT GOES HERE"
    oMailTo = "ABC@ABC.COM"
    oMailBody = "BLAH BLAH!!!!"
    objMail = "mailto:" & oMailTo & "?subject=" & oMailSubj & "&body=" & oMailBody

    ShellExecute 0, vbNullString, objMail, vbNullString, vbNullString, vbNormalFocus

    Application.Wait (Now + TimeValue("0:00:03"))
    Application.SendKeys "%s"

    Exit Sub
Whoa:
    MsgBox Err.Description
End Sub

跟进

谢谢(你的)信息。我已经排除了 ShellExecute,因为它将整个参数字符串限制为 250 个字符,而我需要大约 2000 个字符来发送消息。但看起来 SE 是在我的情况下真正可行的唯一选择。– Humanoid1000 7 小时前

这是我在下面的评论中提到的“可怕(我喜欢 JFC 所说的方式!!!)”方式,效果很好:) 顺便说一句,我只有 Outlook 作为我的默认客户端,所以我已经用它进行了测试。

代码

Option Explicit

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _
ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub SendMail()
    Dim objMail As String
    Dim oMailSubj As String, oMailTo As String
    Dim i As Long
    Dim objDoc As Object, objSel As Object, objOutlook As Object
    Dim MyData As String, strData() As String

    On Error GoTo Whoa

    '~~> Open the txt file which has the body text and read it in one go
    Open "C:\Users\Siddharth Rout\Desktop\Sample.Txt" For Binary As #1
    MyData = Space$(LOF(1))
    Get #1, , MyData
    Close #1
    strData() = Split(MyData, vbCrLf)

    Sleep 300

    oMailSubj = "YOUR SUBJECT GOES HERE"
    oMailTo = "ABC@ABC.COM"
    objMail = "mailto:" & oMailTo & "?subject=" & oMailSubj

    ShellExecute 0, vbNullString, objMail, vbNullString, vbNullString, vbNormalFocus

    Sleep 300

    Set objOutlook = GetObject(, "Outlook.Application")
    '~~> Get a Word.Selection from the open Outlook item
    Set objDoc = objOutlook.ActiveInspector.WordEditor
    Set objSel = objDoc.Windows(1).Selection

    objDoc.Activate

    Sleep 300

    For i = LBound(strData) To UBound(strData)
        objSel.TypeText strData(i)
        objSel.TypeText vbNewLine
    Next i

    Set objDoc = Nothing
    Set objSel = Nothing

    '~~> Uncomment the below to actually send the email
    'Application.Wait (Now + TimeValue("0:00:03"))
    'Application.SendKeys "%s"

    Exit Sub
Whoa:
    MsgBox Err.Description
End Sub

快照

包含消息的文本文件

在此处输入图像描述

发送前的电子邮件

在此处输入图像描述

于 2012-04-28T22:19:48.477 回答
5

您可能可以使用该Shell命令。

Shell("mailto:username@isp.com")

如果 Outlook 是您的默认电子邮件程序,我认为 windows 会正确解释它(它是从 windows 运行对话框中完成的,但不确定是否来自 VBA)。试试看。我现在不在 Excel 面前。

查看“mailto”的参数以了解如何将主题和正文添加到该字符串。

更正: 这只会生成电子邮件,但不会发送。无视我的回答。

于 2012-04-28T21:58:04.093 回答
0

这是最终结果:

原来,SendMail()在家工作但不在工作中,而是CreateObject("Outlook.Application")在工作中工作。

我的安全设置不是 Outlook 的问题,这是一个普通的错字。

无论哪种方式,对于其他迷失在这个主题上的人来说,这个页面上都有很多很好的信息。

于 2012-05-05T15:37:50.400 回答