ASP经典版:无法通过Sendgrid API v3发送Base64 PDF附件,只能发送PDF中的文件名

如何解决ASP经典版:无法通过Sendgrid API v3发送Base64 PDF附件,只能发送PDF中的文件名

我正在尝试使用Sendgrid v3 API通过模板,个人数据和一个或多个附件发送邮件。现在已经花费了数天时间处理附件,似乎无法解决将PDF编码为JSON并包含PDF的全部内容的问题。测试时,我收到了邮件,并且有附件。但是只有400个字节,Adobe认为这是不可读的。在文本编辑器中打开它时,PDF包含文件名。 “所以,亲爱的,但不要雪茄……”

这是我的代码,减去API密钥:

<%
Session.LCID=1053
dagen = FormatDateTime(Now,2)
bilaga1 = "D:\\www5.volvobil.net\KC-Admin-sg\docs\bilaga13.pdf"

Function ReadFile(sfilepath)
    Const adTypeText = 2
    Const adTypeBinary = 1
    Set B64Code = CreateObject("ADODB.Stream")
    b64Code.Open
    testCode = b64Code.LoadFromFile(sfilepath)
      b64Code.Position = 0
      b64Code.Type = adTypeText
      b64Code.CharSet = "us-ascii"
        dim bd
      bd = b64Code.ReadText
      B64Code.Close
      ReadFile = Base64Encode(bd)
End Function

Function Base64Encode(sText)
  Dim oXML,oNode
  Set oXML = CreateObject("Msxml2.DOMDocument.3.0")
  Set oNode = oXML.CreateElement("base64")
  oNode.dataType = "bin.base64"
  oNode.nodeTypedValue = Stream_StringToBinary(sText)
  Base64Encode = oNode.text
  Set oNode = Nothing
  Set oXML = Nothing
End Function

Function Base64Decode(ByVal vCode)
  Dim oXML,oNode
  Set oXML = CreateObject("Msxml2.DOMDocument.3.0")
  Set oNode = oXML.CreateElement("base64")
  oNode.dataType = "bin.base64"
  oNode.text = vCode
  Base64Decode = Stream_BinaryToString(oNode.nodeTypedValue)
  Set oNode = Nothing
  Set oXML = Nothing
End Function

Private Function Stream_StringToBinary(Text)
  Const adTypeText = 2
  Const adTypeBinary = 1
  Dim BinaryStream 'As New Stream
  Set BinaryStream = CreateObject("ADODB.Stream")
  BinaryStream.Type = adTypeText
  BinaryStream.CharSet = "us-ascii"
  BinaryStream.Open
  BinaryStream.WriteText Text
  BinaryStream.Position = 0
  BinaryStream.Type = adTypeBinary
  BinaryStream.Position = 0
  Stream_StringToBinary = BinaryStream.Read
  Set BinaryStream = Nothing
End Function

Private Function Stream_BinaryToString(Binary)
  Const adTypeText = 2
  Const adTypeBinary = 1
  Dim BinaryStream 'As New Stream
  Set BinaryStream = CreateObject("ADODB.Stream")
  BinaryStream.Type = adTypeBinary
  BinaryStream.Open
  BinaryStream.Write Binary
  BinaryStream.Position = 0
  BinaryStream.Type = adTypeText
  BinaryStream.CharSet = "us-ascii"
  Stream_BinaryToString = BinaryStream.ReadText
  Set BinaryStream = Nothing
End Function

toppbilden = "<img src=https://static.volvobil.se/images/mailutskick/600_header2_island.jpg alt=head border=0 />"
mailrubrik = "Byte av bil / Replacement of Car"
rubriken = "VÄLKOMMEN ATT BYTA DIN BIL"
enrubriken = "Welcome to replace your car (English version below)"


portalen = "<A HREF=https://intranet.volvocars.net/volvo-car-group/hr-portal/Pages/Company-cars-general-information-Sweden-Swedish.aspx>My Employment</A>"
portalenen = "<a href=https://intranet.volvocars.net/volvo-car-group/hr-portal/Pages/Company-cars-general-information-Sweden.aspx>My Employment</a>"

template = "d-3be42a9ce1db4461b2f72256fbb198eb"

    filen = ReadFile(bilaga1)
    filename = "bilaga13.pdf"

Response.Write "Filenamn = "& filename &" Fil = "& filen

    data = "{""from"":{""email"":""norepy@volvobil.se""},""personalizations"":[{""to"":[{""email"":"""& epost &"""}],""dynamic_template_data"":{""receipt"":true,""name"":"""& namnet &""",""hallen"":"""& hallen &""",""regno"":"""& regno &""",""oldregno"":"""& oldregno &""",""bilen"":"""& bilen &""",""dagtiden"":"""& dagtiden &""",""levgubbe"":"""& levgubbe &"""}}],""attachments"": [{""content"": """& filen &""",""filename"":"""& filename &""",""type"":""application/pdf""}],""template_id"":"""& template &"""}"
    link = "https://api.sendgrid.com/v3/mail/send"

    Dim oXMLHTTP
    Set oXMLHTTP = CreateObject("Msxml2.ServerXMLHTTP.6.0")
    if oXMLHTTP is nothing then Set oXMLHTTP = CreateObject("Microsoft.XMLHTTP")

    oXMLHTTP.Open "POST",link,False
    oXMLHTTP.setRequestHeader "Content-Type","application/json;charset=UTF-8"
    oXMLHTTP.setRequestHeader "Authorization","Bearer <API-key>"

oXMLHTTP.send data

If oXMLHTTP.Status = 200 Then
PostData = oXMLHTTP.responseText
Else
response.Write "Status: " & oXMLHTTP.Status & " | "
response.Write oXMLHTTP.responseText

End If

SET oXMLHTTP = NOTHING

SET FormConad = NOTHING

Set objFSO = Nothing
Set objFileOut = Nothing
Set objXML = Nothing
Set objDocElem = Nothing
Set objStream = Nothing

%>

输出是网页上的base64代码,状态:400 |来自Sendgrid的{“ errors”:[{“ message”:“ Bad Request”,“ field”:null,“ help”:null}]}。

附件没有问题,我已经尝试了一些。

非常感谢您的投入。

谢谢

哈斯

解决方法

看起来像是将文件内容作为文本而不是二进制流式传输。

总结;

  1. bilaga1变量不应包含D:\\,因为这可能会导致LoadFromFile()方法出错。有效的文件路径应该为D:\
  2. PDF不是文本文件,因此ADODB.Stream应该使用adTypeBinary而不是adTypeText

作为旁注:

这是我为我不久前构建的SendGrid库编写的函数,应该使您对如何添加附件有所了解。

Sub AddMailAttachment(path,contenttype,disposition,filename,id)
    Dim json: json = ""
    Dim attachment,data

    If Not IsEmpty(path) Then
      If Left(path & "",4) = "http" Then
        Dim xhr: Set xhr = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
        With xhr
          Call .Open("GET",path,False)
          Call .Send()
          If .Status = 200 Then
            data = .ResponseBody
          End If
        End With
      Else
        Dim fso: Set fso = Server.CreateObject("Scripting.FileSystemObject")
        Dim stream: Set stream = Server.CreateObject("ADODB.Stream")
        If fso.FileExists(path) Then
          With stream
            Call .Open()
            .Type = adTypeBinary
            Call .LoadFromFile(path)
            data = .Read()
          End With
        End If
      End If
      Dim contentid: contentid = Empty
      Set attachment = New MailAttachment
      If LCase(Trim(disposition & "")) = "inline" Then contentid = id
      Call attachment.Create(data,contentid)
      Call m_attachments.Add(attachment.Id,attachment)
    End If
End Sub

该代码是类的一部分,因此无法从该示例访问某些元素,例如m_attachments(这是存储该类附件的Scripting.Dictionary)。这个想法是向您展示如何实现ADODB.Stream

这里是MailAttachment类。

Class MailAttachment
  Private m_id
  Private m_contentid
  Private m_content
  Private m_contenttype
  Private m_dispoition
  Private m_filename
  Private m_contentlength

  Public Property Get Id
    Id = m_Id
  End Property

  Public Property Get ContentId
    ContentId = m_contentid
  End Property

  Public Property Get Content
    Content = m_content
  End Property

  Public Property Get ContentType
    ContentType = m_contenttype
  End Property

  Public Property Get Disposition
    Disposition = m_dispoition
  End Property

  Public Property Get FileName
    FileName = m_filename
  End Property

  Public Property Get Size
    Size = m_contentlength
  End Property

  Private Sub Class_Initialize()

  End Sub

  Private Function ToBase64(rabyt)
    Dim xml: Set xml = CreateObject("MSXML2.DOMDocument.3.0")
    xml.LoadXml "<root />"
    xml.documentElement.dataType = "bin.base64"
    xml.documentElement.nodeTypedValue = rabyt

    ToBase64 = Replace(xml.documentElement.Text,vbLf,"")
  End Function

  Public Sub Create(content,contentid)
    m_id = CreateGuidPlainFormat()
    m_contentid = contentid
    m_contentlength = LenB(content)
    m_content = ToBase64(content)
    m_contenttype = contenttype
    m_dispoition = disposition
    m_filename = filename
  End Sub
End Class
,

这实际上有效(Base64 Encode a ZIP file using Classic ASP and VB Script的技巧)和https://www.motobit.com/的功能。

但是,它要花很长时间,并且只能管理小文件,否则会超时。

这是当前代码:

         Function Base64Encode(inData)
      Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
      Dim cOut,sOut,I

      For I = 1 To Len(inData) Step 3
        Dim nGroup,pOut,sGroup

        nGroup = &H10000 * Asc(Mid(inData,I,1)) + _
          &H100 * MyASC(Mid(inData,I + 1,1)) + MyASC(Mid(inData,I + 2,1))

        nGroup = Oct(nGroup)

        nGroup = String(8 - Len(nGroup),"0") & nGroup

        pOut = Mid(Base64,CLng("&o" & Mid(nGroup,1,2)) + 1,1) + _
          Mid(Base64,3,5,7,1)

        sOut = sOut + pOut

      Next
      Select Case Len(inData) Mod 3
        Case 1: 
          sOut = Left(sOut,Len(sOut) - 2) + "=="
        Case 2: 
          sOut = Left(sOut,Len(sOut) - 1) + "="
      End Select
      Base64Encode = sOut
    End Function

    Function MyASC(OneChar)
      If OneChar = "" Then MyASC = 0 Else MyASC = Asc(OneChar)
    End Function

    Function BinaryToString(Binary)
      Dim I,S
      For I = 1 To LenB(Binary)
        S = S & Chr(AscB(MidB(Binary,1)))
      Next
      BinaryToString = S
    End Function

    Dim objStream,strFileText
    Set objStream = Server.CreateObject("ADODB.Stream")
    objStream.Type = 1
    objStream.Open
    objStream.LoadFromFile Server.MapPath(bilaga1)

    strFileText = Base64Encode(BinaryToString(objStream.Read))
    Response.Write strFileText

    objStream.Close
    Set objStream = Nothing

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-