Как отправить электронное письмо с приложением PDF с Outlook, используя MS Access VBA? - PullRequest
2 голосов
/ 03 апреля 2019

Я работаю с приложением Access в Access 2016. Приложение выводит в файл PDF с помощью метода DoCmd.OutputTo .

Я хочу отправить этот PDF-файл, прикрепленный к электронному письму, которое я встроил в код, или открыть новое электронное письмо Outlook с вложенным файлом.

Когда я нажимаю кнопку в форме, которая вызывает код, включающий мои подпрограммы (которые расположены в отдельных модулях), окно электронной почты никогда не отображается, а также не отправляется электронное письмо (в зависимости от использования .Display против .Send). Я также не получаю никаких ошибок.

Я думаю, что также стоит отметить, что Call to sub внутри модуля, который создает PDF, работает как положено.

Я использую Access 2016 и Outlook 2016, установленные как часть Office 2016 Pro Plus на 64-разрядной машине с Windows 7. Пакет Office является 32-разрядным.

Модуль & Sub (адрес электронной почты отредактирован )

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

Подзвон

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)

Исходя из того, что PDF выводится в подпрограмме в файле модуля, должен ли я создавать электронную почту (или вызывать подпрограмму) в подпрограмме, которая создает PDF?

ПРИМЕЧАНИЕ : я просмотрел этот принятый ответ здесь, на переполнении стека, а также многих других. Мой вопрос отличается из-за того, что я спрашиваю, почему сообщение не отображается или не отправляется, а не о том, как создать и отправить сообщение, как остальные.

EDIT : Outlook не открывается и ничего не происходит, если Outlook уже открыт.

Финальная нота : Чтобы добавить принятый ответ, в редакторе VBA для Access вам, вероятно, придется перейти на Tools > References и включить Microsoft Outlook 16.0 Object Library или аналогичный в зависимости от вашей версии Office / Outlook.

Ответы [ 3 ]

1 голос
/ 04 апреля 2019

Чтобы пройти полный путь, попробуйте использовать 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
1 голос
/ 04 апреля 2019

Любая причина, почему вы не используете 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. Вышесказанное делает все за один шаг и фактически представляет собой одну строку кода.

1 голос
/ 03 апреля 2019

Возможно, ваша проблема связана с безопасностью Outlook.Обычно Outlook отображает всплывающее окно с сообщением о том, что стороннее приложение пытается отправить письмо через него.Хотели бы вы позволить это или нет?Однако, поскольку вы делаете это программно, это всплывающее окно никогда не появляется.Раньше был способ обойти это.

Протестируйте вашу программу, когда пользователь вошел в систему и имеет открытую Outlook.Посмотрите, будет ли разница в поведении.Если это всплывающее окно появится, отправьте в Google точное сообщение, и вы, вероятно, найдете способ его обойти.

...