【问题标题】:Send email from Excel in Exchange environment在 Exchange 环境中从 Excel 发送电子邮件
【发布时间】:2011-09-01 15:20:18
【问题描述】:

我有一个用户表单,可以帮助不同的用户将数据填写到电子表格中。插入数据后,还应通过电子邮件将其发送给几个收件人,具体取决于表单中填写的选项。

这发生在使用 Exchange 的公司环境中。我会为此文件创建一个新的电子邮件帐户,以便能够将电子邮件作为一个实体发送,而不是使用用户的电子邮件帐户。

这可能吗?如何?我已经用谷歌搜索了它,我只能找到如何创建用户从他的帐户发送的邮件。

【问题讨论】:

  • 它是这样设置的。电子表格是数据所在的位置,随着时间的推移,许多不同的用户(来源)将对其进行分析和插入。我们希望向少数用户(目标)发送一封电子邮件,宣布新数据已进入。
  • @Jean-François Corbett:对不起,我并不是要居高临下 - 有时有这样的问题,结果是 OP 询问“如何使用 Y 做 X”,用 Y作为一个对他来说似乎最有可能的工具,虽然它实际上并不相关,他只是想“做 X”。这里不是这种情况,但恕我直言,最好提出并消除疑问。
  • @Piskvor:在这种情况下,您如何建议 OP“做 X”?你能推荐一个比 OP 提出的更好的 Y 吗?我以前必须解决这个完全相同的问题,如果有替代 Y,那么我想知道。

标签: email excel exchange-server vba


【解决方案1】:

我使用下面的代码 (source) 从 Excel-VBA 发送电子邮件。我只用我自己的电子邮件帐户对其进行了测试,但我假设您可以让它从不同的帐户 (msgOne.from = ...) 发送邮件,只要用户有权从 Exchange 服务器上的该帐户发送邮件。

Dim cdoConfig
Dim msgOne

Set cdoConfig = CreateObject("CDO.Configuration")
With cdoConfig.Fields
    .Item(cdoSendUsingMethod) = cdoSendUsingPort
    .Item(cdoSMTPServerPort) = 25 '465 ' (your port number) usually is 25
    .Item(cdoSMTPServer) = "smtp.mysmtpserver.com" ' your SMTP server goes here
    '.Item(cdoSendUserName) = "My Username"
    '.Item(cdoSendPassword) = "myPassword"
    .Update
End With

Set msgOne = CreateObject("CDO.Message")
Set msgOne.Configuration = cdoConfig
msgOne.To = "someone@somewhere.com"
msgOne.from = "me@here.com"
msgOne.subject = "Test CDO"
msgOne.TextBody = "It works just fine."
msgOne.Send

很遗憾,我目前无法检验这个假设,因为我只设置为从一个帐户发送。告诉我结果如何!

【讨论】:

    【解决方案2】:

    如果 excel 应用程序在装有 Outlook 的机器上运行,您可以按照以下方式进行操作。

    Function SendEmailWithOutlook(er As emailRecord, 
               recipients As String, 
               cc As String, 
               subject As String, 
               body As String, 
               attachmentPath As String) As Boolean
        Dim errorMsg As String
        Dim OutApp As Object
        Dim OutMail As Object
        Set OutApp = CreateObject("Outlook.Application")
        Set OutMail = OutApp.CreateItem(0)
        On Error GoTo errHandle
        If (er.useTestEmail = True) Then
            recipients = er.emailTest
            cc = er.emailTest
        End If
        With OutMail
            If er.emailFrom <> "" Then
                .sentOnBehalfOfName = er.emailFrom
            End If
            .To = recipients
            .cc = cc
            .bcc = er.emailBcc
            .subject = subject
            .htmlBody = body
            If attachmentPath <> "" Then
                .Attachments.Add attachmentPath
            End If
            .Send   'or use .Display
        End With
        On Error GoTo 0
    
        Set OutMail = Nothing
        Set OutApp = Nothing
        SendEmailWithOutlook = True
        Exit Function
    errHandle:
        errorMsg = "Error sending mail via outlook: " & Err.Description & vbCrLf
        errorMsg = errorMsg & "OnBehalfOf:" & er.emailFrom & vbCrLf
        errorMsg = errorMsg & "Recipients: " & recipients & vbCrLf
        errorMsg = errorMsg & "CC: " & cc & vbCrLf
        errorMsg = errorMsg & "BCC: " & er.emailBcc
        MsgBox errorMsg
        SendEmailWithOutlook = False
    End Function
    

    添加对 Microsoft Outlook 14.0 对象库的引用

    【讨论】:

      【解决方案3】:

      为什么不使用 Outlook 对象模型?

      您可以赋予当前用户代表指定用户发送的权限,然后在调用MailItem.Send之前设置MailItem.SentOnBehalfOfName和MailItem.ReplyRecipients(如果需要)属性。

      【讨论】:

      • 如果在编码部分有更多细节,这将是一个很好的答案
      • 您的哪一部分有问题?
      • 我没有相关问题;我刚刚登陆此页面并看到了答案。在其他人提供(大量)代码的地方,这个只提到了一些要使用的对象。虽然这 有助于将用户指向正确的方向,但我认为添加正在使用的此类对象的最小示例将使这可能是该问题的最佳答案。我认为这可能值得评论。 :-)
      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2019-07-01
      • 2018-07-24
      • 2016-12-28
      • 1970-01-01
      • 2015-11-16
      • 2011-06-20
      相关资源
      最近更新 更多