如何使用MS Access VBA发送Outlook附带的PDF电子邮件?

时间:2019-04-03 16:33:42

标签: vba ms-access outlook outlook-vba

我正在使用Access 2016中的Access应用程序。该应用程序通过DoCmd.OutputTo方法输出到PDF文件。

我想将此PDF发送到我在代码中构建的电子邮件中,或者打开带有附件的新Outlook电子邮件。

当我单击表单中的按钮以触发包含我的子代码的代码(位于单独的模块中)时,将永远不会显示电子邮件窗口,也不会发送电子邮件(取决于{{ 1}}与.Display)。我也没有收到任何错误。

我认为可能值得一提的是,对创建PDF的模块内的sub的调用可以按预期工作。

我正在运行Windows 7 64位计算机上作为Office 2016 Pro Plus一部分安装的Access 2016和Outlook 2016。 Office套件是32位的。

模块和子 (已删除电子邮件地址

.Send

子通话

Dim objEmail As Outlook.MailItem
Dim objApp As Outlook.Application

Set objApp = CreateObject("Outlook.Application")

Set objEmail = oApp.CreateItem(olMailItem)
With objEmail
    .Recipients.Add "email@domain.com"
    .Subject = "Invoice"
    .Body = "See Attached"
    .Attachments.Add DestFile
    .Display        
End With

基于在模块文件的子文件中输出PDF的事实,我应该在创建PDF的子文件中创建电子邮件(或调用子文件)吗?

注意:我已经在this accepted answer上查看了Stack Overflow,以及其他很多内容。我的问题有所不同,原因是我在问为什么不显示或发送消息,而不是像其他消息一样如何构建和发送消息。

编辑: Outlook无法打开,如果Outlook已经打开,则什么也不会发生。

最终通知: 要添加到接受的答案中,在Access的VBA编辑器中,您可能必须转到MsgBox "Now saving the Invoice as a PDF" strInvoiceNbr = Int(InvoiceNbr) strWhere = "[InvoiceNbr]=" & Me!InvoiceNbr strDocName = "Invoice Print One" ScrFile = "Invoice Print One" DestFile = "Inv" + strInvoiceNbr + " - " + Me.GetLastname + " - " + GetLocation MsgBox DestFile, vbOKOnly DoCmd.OpenForm strDocName, , , strWhere Call ExportToPDF(SrcFile, DestFile, "INV") Call EmailInvoice(DestFile) 并根据您的Office / Outlook版本启用Tools > References或类似功能。

3 个答案:

答案 0 :(得分:1)

您的问题可能与Outlook安全有关。通常,Outlook会显示一个弹出窗口,提示第三者应用程序正试图通过它发送电子邮件。您是否允许。但是,由于您以编程方式执行此操作,因此该弹出窗口永远不会出现。过去有一种绕过此方法的方法。

在用户登录并打开Outlook的同时测试您的程序。看看行为是否会有所不同。如果确实出现该弹出窗口,请在Google上搜索确切消息,您可能会找到一种绕过它的方法。

答案 1 :(得分:1)

要传递完整路径,请尝试使用Function EmailInvoice

示例

Option Explicit
#Const LateBind = True
Const olFolderInbox As Long = 6

Public Sub ExportToPDF( _
           ByVal strSrcFileName As String, _
           ByVal strNewFileName As String, _
           ByVal strReportType As String _
                )

    Dim PathFile As String

    Dim strEstFolder As String
        strEstFolder = "c:\OneDrive\Estimates\"
    Dim strInvFolder As String
        strInvFolder = "c:\OneDrive\Invoices\"

    ' Export to Estimates or Invoices Folder based on passed parameter
    If strReportType = "EST" Then
        DoCmd.OutputTo acOutputForm, strSrcFileName, acFormatPDF, _
                       strEstFolder & strNewFileName & ".pdf", False, ""


        PathFile = strEstFolder & strNewFileName & ".pdf"


    ElseIf strReportType = "INV" Then
        DoCmd.OutputTo acOutputForm, strSrcFileName, acFormatPDF, _
                       strInvFolder & strNewFileName & ".pdf", False, ""


        PathFile = strEstFolder & strNewFileName & ".pdf"


    End If

    EmailInvoice PathFile ' call function

End Sub

Public Function EmailInvoice(FldrFilePath As String)

    Dim objApp As Object
    Set objApp = CreateObject("Outlook.Application")

    Dim objNS As Object
    Set objNS = olApp.GetNamespace("MAPI")

    Dim olFolder As Object
    Set olFolder = objNS.GetDefaultFolder(olFolderInbox)
        'Open inbox to prevent errors with security prompts
        olFolder.Display

    Dim objEmail As Outlook.MailItem
    Set objEmail = oApp.CreateItem(olMailItem)

    With objEmail
        .Recipients.Add "email@domain.com"
        .Subject = "Invoice"
        .Body = "See Attached"
        .Attachments.Add FldrFilePath
        .Display
    End With

End Function

答案 2 :(得分:1)

为什么不使用sendOject?

sendobject的优点是,您不必受限于Outlook,并且任何电子邮件客户端都可以使用。

因此,可以使用以下代码:

  Dim strTo   As String
  Dim strMessage    As String
  Dim strSubject    As String

  strTo = "abc@abc.com;def@def.com"

  strSubject = "Your invoice"
  strMessage = "Please find the invoice attached"

  DoCmd.SendObject acSendReport, "rptInvoice", acFormatPDF, _
        strTo, , , strSubject, strMessage

请注意,如果需要过滤报告,请在运行发送对象之前先将其打开。当然,您可以在之后关闭报告(仅在必须过滤时才需要,然后在之前打开报告-如果不提供过滤器,则上述代码就足够了,而不必先打开报告)。

不需要单独写出pdf文件,也不需要编写代码来附加生成的pdf。上面的内容一步一步完成,实际上是一行代码。