SendGrid-Anhänge sind leer oder beschädigt, wenn API (VBA) verwendet wird
Dies scheint ein ständiges Problem mit der SendGrid-Web-API und dem Versenden von E-Mail-Anhängen zu sein. Ich habe viele, viele Posts im Internet gefunden, bei denen alle dasselbe Problem haben ... aber keiner von ihnen scheint mit einer Lösung beantwortet zu werden. Die vordefinierte Antwort von SendGrid ist die Verwendung einer ihrer Bibliotheken. Es bleibt jedoch die Frage, wie Sie Dateien anhängen, wenn Sie eine Sprache verwenden, die keine Bibliothek enthält.
Ich habe versucht, mich in dieser Angelegenheit an den SendGrid-Support zu wenden. Ich habe sogar angeboten, für den Support zu zahlen, um eine Antwort zu erhalten, aber sie dachten, ich würde nach einer "Codeüberprüfung" fragen, was ich nicht war. Die Frage lautet einfach: Was wird zum Hochladen von Anhängen an die SendGrid-Web-API benötigt?
Ich habe zuvor nur den Dateispeicherort innerhalb des vorgeschlagenen API-Formats angegeben, wie hier zu sehen:Vorheriges Beispiel für das Posten in SendGrid mit VBA und das schien für mich und einige andere eine Weile gut zu funktionieren ... aber in letzter Zeit hat sich etwas geändert. Die Angabe eines einfachen Dateipfads scheint nicht mehr zu funktionieren. Was muss ich jetzt tun? Soll ich die Datei verschlüsseln? Wenn ja, welche Codierung soll ich base64 verwenden? Jede Hilfe dabei wäre sehr dankbar von mir und vielen anderen !!
Hier ist mein base64-Versuch, aber es gibt das gleiche Problem wie bei meinen vorherigen Dateipfadversuchen, d. H. Der Anhang wird in der E-Mail angezeigt ... aber er kann nicht geöffnet werden.
Private Sub SendEmail()
Dim rs As DAO.Recordset
Dim SQL As String
Dim byteData() As Byte
Dim xmlhttp As Object
Dim eTo As String
Dim eFrom As String
Dim eBody As String
Dim eSubject As String
Dim eToName As String
Dim HttpReq As String
Dim ePass As String
Dim eUser As String
Dim strXML As String
Dim strAttachments As String
Dim strBase64 As String
eSubject = Me.txtSubject
eBody = Me.txtMessage
eFrom = SenderEmail
eUser = SendGridUser
ePass = SendGridPass
' If Groups List/ Else Contacts List
If Me.chkGroups <> 0 Then
SQL = "SELECT * FROM qryContactsInSelectedGroups WHERE ContactType = 'Email'"
Else
SQL = "SELECT * FROM qrySelectedContacts WHERE ContactType = 'Email'"
End If
Set rs = CurrentDb.OpenRecordset(SQL, dbOpenDynaset, dbSeeChanges)
If Not (rs.EOF And rs.BOF) Then
rs.MoveFirst
Do Until rs.EOF = True
eTo = rs.Fields("ContactValue").Value
eToName = rs.Fields("FirstName").Value & " " & rs.Fields("LastName").Value
' Set the Server URL to the form input
HttpReq = "https://api.sendgrid.com/api/mail.send.xml?" _
& "api_user=" & eUser _
& "&api_key=" & ePass _
& "&to=" & eTo _
& "&toname=" & eToName _
& "&subject=" & eSubject _
& "&text=" & eBody _
& "&from=" & eFrom _
& GetAttachments()
' files[file1.jpg]=file1.jpg&files[file2.pdf]=file2.pdf
Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
' adoStream.Position = 0
xmlhttp.Open "POST", HttpReq, False
xmlhttp.send
byteData = xmlhttp.responseBody
Set xmlhttp = Nothing
strXML = StrConv(byteData, vbUnicode)
, Call EmailResponse(strXML, rs.Fields("ContactID").Value)
Debug.Print strXML
rs.MoveNext
Loop
End If
Set rs = Nothing
End Sub
Private Function GetAttachments() As String
Dim rs As DAO.Recordset
Dim SQL As String
Dim currentAttachment As String
Dim strAttachments As String
Dim Encoded64 As String
SQL = "SELECT * FROM tblMessageAttachments WHERE [MessageID] = " & MessageID
Set rs = CurrentDb.OpenRecordset(SQL, dbOpenDynaset, dbSeeChanges)
If Not (rs.EOF And rs.BOF) Then
rs.MoveFirst
Do Until rs.EOF = True
' Set Current Attachment
currentAttachment = rs.Fields("AttachmentLocation").Value & rs.Fields("AttachmentName").Value
Encoded64 = EncodeFile(currentAttachment)
strAttachments = strAttachments & "&files" & Chr(91) & rs.Fields("AttachmentName").Value & Chr(93) & "=" & Encoded64 'currentAttachment
'strAttachments = strAttachments & Encoded64
' Debug.Print strAttachments
rs.MoveNext
Loop
Debug.Print strAttachments
GetAttachments = strAttachments
End If
End Function
Private Function EncodeFile(text As String) As String
Dim arrData() As Byte
arrData = StrConv(text, vbFromUnicode)
Dim objXML As MSXML2.DOMDocument
Dim objNode As MSXML2.IXMLDOMElement
Set objXML = New MSXML2.DOMDocument
Set objNode = objXML.createElement("b64")
objNode.DataType = "bin.base64"
objNode.nodeTypedValue = arrData
EncodeFile = Replace(objNode.text, vbLf, "")
Set objNode = Nothing
Set objXML = Nothing
End Function