通过VBA发送带附件的电子邮件

5

我正在尝试为我的电子邮件添加附件功能。我的电子邮件代码已经能够工作,但是附件被发送为ATT00001.bin文件。

变量Forms![frmMain]!TabCtl54.Pages("page56").Controls("subtblcontent").Form![attachmentlnk]是一个表单上的文本框,用于放置我的文件名。

attachmentlnkvar = "file:///C:/Users/desktopname/Desktop/" & Forms![frmMain]!TabCtl54.Pages("page56").Controls("subtblcontent").Form![attachmentlnk] & ".pdf"

With cdomsg
.To = emailstr
.FROM = fromemailstr
.subject = Forms!frmMain.txtSubject
.Attachments.Add attachmentlnkvar
.HTMLBody = strHTML
.Send

End With
    Set cdomsg = Nothing

有没有一种方法可以将我的文件发送为PDF格式?

attachmentlnkvar 被填充后,在 with 之前的那一行,它的值是多少? - Nathan_Sav
这只是一个字符串变量,它将创建PDF的路径并确保其为PDF格式。 - user9448003
嗨,我理解了,但是那个变量等于你期望的吗? - Nathan_Sav
是的,它等于"C:\Users\desktopname\Desktop\reportname.pdf",这正是我所期望的。 - user9448003
你使用的是哪个电子邮件应用程序? - Nathan_Sav
嗨,我正在使用Microsoft Outlook。 - user9448003
4个回答

1

我很高兴与您分享我用来发送所有电子邮件的函数:

Public Sub SendMessage(Optional SubjectText = "", Optional BodyText = "", Optional AttachmentPath = "", Optional sendTo = "", Optional sendCC = "", Optional DeliveryConfirmation = True, Optional DisplayDoNotAutoSend = True, Optional SendHighPriority = True, Optional UseHTML = True)

   Dim objOutlook As Outlook.Application
   Dim objOutlookMsg As Outlook.MailItem
   Dim objOutlookRecip As Outlook.Recipient
   Dim objOutlookAttach As Outlook.Attachment
   Dim MultipleAttachmentPath As String
   Dim CurrentAttachment As Variant
   Dim aAtachments() As String
   On Error GoTo ErrorMsgs
    DoCmd.Hourglass True
   ' Create the Outlook session.
   Set objOutlook = New Outlook.Application    
   ' Create the message.
   Set objOutlookMsg = objOutlook.CreateItem(olMailItem)       
   With objOutlookMsg

      If UseHTML Then
      .BodyFormat = olFormatHTML          
      End If

      If Not isnull(sendTo) And InStr(sendTo, "@") > 0 Then
        .To = sendTo
      End If
      If Not isnull(sendCC) And InStr(sendCC, "@") > 0 Then
        .CC = sendCC
      End If
      .Subject = SubjectText

      If UseHTML Then
        .HTMLBody = "<div style='font-family:Calibri,sans-serif'>" & BodyText & GetThankYouSignature & "</div>"
      Else
        .Body = BodyText & vbCrLf & GetUserFullNameInASCIIText & vbCrLf & vbCrLf
      End If

      If SendHighPriority Then
          .Importance = olImportanceHigh  'High importance
      End If

      If DeliveryConfirmation Then
          .OriginatorDeliveryReportRequested = True
          .ReadReceiptRequested = True
      End If
      On Error Resume Next
      If AttachmentPath <> "" Then
        ' Add attachments to the message.
          If Not IsMissing(AttachmentPath) And InStr(AttachmentPath, ";") = 0 Then
             Set objOutlookAttach = .Attachments.add(AttachmentPath)
          ElseIf Not IsMissing(AttachmentPath) And InStr(AttachmentPath, ";") > 0 Then
            aAtachments = Split(AttachmentPath, ";")
            For Each CurrentAttachment In aAtachments
                .Attachments.add (CurrentAttachment)
            Next
          End If
      End If
    On Error GoTo ErrorMsgs
   End With

   If DisplayDoNotAutoSend Or isnull(sendTo) Then
       objOutlookMsg.Display
   Else
       objOutlookMsg.Send
   End If

   Set objOutlookMsg = Nothing
   Set objOutlook = Nothing
   Set objOutlookRecip = Nothing
   Set objOutlookAttach = Nothing
   DoCmd.Hourglass False
   Exit Sub
ErrorMsgs:
    DoCmd.Hourglass False
   If Err.Number = "287" Then
      MsgBox "You clicked No to the Outlook security warning. " & _
      "Rerun the procedure and click Yes to access e-mail" & _
      "addresses to send your message. For more information," & _
      "see the document at http://www.microsoft.com/office" & _
      "/previous/outlook/downloads/security.asp. "
   Else
    Call LogError(Err.Number, Err.Description, "SystemUtilities", "SendMessage")
      Resume Next
      Resume
   End If
End Sub

变量 AttachmentPath 可能包含多个用 ";" 分隔的附件路径。

0

不要使用file://等,只需使用路径和反斜杠。

attachmentlnkvar = "C:\Users\desktopname\Desktop\" & Forms![frmMain]!TabCtl54.Pages("page56").Controls("subtblcontent").Form![attachmentlnk] & ".pdf"

它仍然显示为二进制文件。 - user9448003

0

你试过使用 .AddAttachment attachmentlnkvar 代替 .Attachments.Add attachmentlnkvar 吗?这是我用来通过SMTP服务器发送PDF报告而不是Outlook的方法。


刚试了一下,它仍然显示为二进制文件。 - user9448003

0
问题出在您的SMTP服务器上。尝试将附件放在正文之后以避免此问题。如果这样不起作用,请尝试使用以下方式将消息作为纯文本而不是HTML发送:
.TextBody = bodyText

例子:

attachmentlnkvar = "C:/Users/desktopname/Desktop/" & Forms![frmMain]!TabCtl54.Pages("page56").Controls("subtblcontent").Form![attachmentlnk] & ".pdf"

With cdomsg
    .To = emailstr
    .FROM = fromemailstr
    .Subject = Forms!frmMain.txtSubject
    .HTMLBody = strHTML
    .AddAttachment attachmentlnkvar
    .Send
End With

Set cdomsg = Nothing

EXPLANATION: https://kb.mit.edu/confluence/pages/viewpage.action?pageId=4981187


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接