【发布时间】:2016-02-16 03:23:28
【问题描述】:
这似乎是 SendGrid Web API 和电子邮件附件的一个常见问题。我在网上找到了很多很多帖子,所有人都遇到了同样的问题……但似乎没有一个可以得到解决方案的回答。 SendGrid 自己的预设回复是使用他们的库之一......但问题仍然是当您使用没有库的语言时如何附加文件。
我已经尝试就这个问题亲自联系 SendGrid 支持...甚至提出支付支持以获得答案,但他们认为我要求进行“代码审查”,而我不是。问题很简单:将附件上传到 SendGrid Web API 需要什么。
我以前只是在建议的 API 格式中提供文件位置,如下所示:Previous Example of Posting to SendGrid Using VBA,这对我自己和其他几个人来说似乎工作了一段时间......但最近发生了一些变化。提供简单的文件路径似乎不再起作用。那么我现在需要做什么呢?我应该对文件进行编码吗?如果是这样,我应该使用 base64 什么编码?我和其他许多人将非常感谢这方面的任何帮助!
这是我的 base64 尝试,但它与我之前的文件路径尝试存在相同的问题,即附件显示在电子邮件中...但无法打开。
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
【问题讨论】:
-
您在使用任何本地库吗?如果没有,请考虑如何将本地文件上传/发送到 sendgrid 网络服务器?即使您生成多部分电子邮件内容,问题是 SendGrid Web 请求是否会理解它。你最好寻求他们的帮助!
-
只是出于好奇,outlook 不是发送邮件的选项吗?
-
你为什么要对文件进行base64编码?您需要根据SendGrid docs“文件内容必须是多部分 HTTP POST 的一部分”将其作为多部分帖子的一部分发送。您需要发送带有
content-type的multipart/form-data的 POST -
@bwest...这就是我的想法,我首先尝试过...但它似乎不起作用所以我想知道我是否使用了正确的编码。