【问题标题】:Mailgun webhooks and classic aspMailgun webhook 和经典 asp
【发布时间】:2014-09-23 09:17:55
【问题描述】:

我已经在 Mailgun 控制面板中设置了一个 Web 挂钩的 URL,并设置了一个脚本,以便在发生反弹时将带有来自 Mailgun 的 HTTP Post 的 txt 文件附加到 URL。我已经通过从提交表单的测试页面提交 HTTP Post 来测试它,并且表单数据被写入 txt 文件 - 但是当我从 Mailgun 触发测试时,会写入一个新行但 Request.Form 收集似乎为空。

我是否遗漏了 Mailgun 的 HTTP Post 中的某些内容以及我尝试从中获取 request.form 集合的方式?

<%
strWebhookData = "///// New Entry ///" & vbnewline
For Each Item In Request.Form
        fieldName = Item
        fieldValue = Request.Form(Item)
        Response.write fieldName & " " & fieldValue
        strWebhookData =  strWebhookData & fieldName &" = " & fieldValue & vbnewline        
    Next 
Response.write strWebhookData

set fs=Server.CreateObject("Scripting.FileSystemObject")
    set f=fs.OpenTextFile(Server.MapPath("bounces.txt"),8,true)
    f.WriteLine(vbnewline & strWebhookData)
    f.Close
set f=Nothing
set fs=Nothing

%>

【问题讨论】:

    标签: asp-classic mailgun


    【解决方案1】:

    不确定这是否可行,但请尝试

    For Each x In Request.Form
        fieldName = x
        fieldValue = Request.Form(x)
        Response.write fieldName & " " & fieldValue
        strWebhookData =  strWebhookData & fieldName &" = " & fieldValue & vbnewline        
    Next
    

    【讨论】:

    • 感谢您 - 但该脚本确实从我用来发布到该页面的测试页面捕获表单变量,但没有从 Mailgun HTTP Post 捕获任何内容。无论如何,我会尝试您的建议。
    • Mailgun HTTP Post 代码是什么样的?你能检查一下是否有任何东西正在使用开发者工具(chrome)或 Firebug(FireFox)进行传输
    • 如果有帮助,这里是 HTTP_RAW 的输出。内容长度:4230 内容类型:multipart/form-data;边界=2adc9741-1b71-4442-9377-170f6562daea 接受编码:gzip 用户代理:mailgun/treq-0.2.1
    【解决方案2】:

    我正在使用这段代码,我真的不记得我在哪里找到它:

    Response.Expires=0
    Response.Buffer = TRUE
    Response.Clear
    byteCount = Request.TotalBytes
    RequestBin = Request.BinaryRead(byteCount)
    Dim UploadRequest
    Set UploadRequest = CreateObject("Scripting.Dictionary")
    BuildUploadRequest  RequestBin
    

    '一些示例变量

    strEvent    = UploadRequest.Item("event").Item("Value")
    strEmail    = UploadRequest.Item("recipient").Item("Value")
    

    '您可以在 mailgun 日志选项卡上找到所有变量

    Sub BuildUploadRequest(RequestBin)
        'Get the boundary
        PosBeg = 1
        PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
        boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
        boundaryPos = InstrB(1,RequestBin,boundary)
        'Get all data inside the boundaries
        Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
            'Members variable of objects are put in a dictionary object
            Dim UploadControl
            Set UploadControl = CreateObject("Scripting.Dictionary")
            'Get an object name
            Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
            Pos = InstrB(Pos,RequestBin,getByteString("name="))
            PosBeg = Pos+6
            PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
            Name = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
            PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
            PosBound = InstrB(PosEnd,RequestBin,boundary)
            'Test if object is of file type
            If  PosFile<>0 AND (PosFile<PosBound) Then
                'Get Filename, content-type and content of file
                PosBeg = PosFile + 10
                PosEnd =  InstrB(PosBeg,RequestBin,getByteString(chr(34)))
                FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
                'Add filename to dictionary object
                UploadControl.Add "FileName", FileName
                Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
                PosBeg = Pos+14
                PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
                'Add content-type to dictionary object
                ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
                UploadControl.Add "ContentType",ContentType
                'Get content of object
                PosBeg = PosEnd+4
                PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
                Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
                Else
                'Get content of object
                Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
                PosBeg = Pos+4
                PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
                Value = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
            End If
            'Add content to dictionary object
        UploadControl.Add "Value" , Value   
            'Add dictionary object to main dictionary
        UploadRequest.Add name, UploadControl   
            'Loop to next object
            BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
        Loop
    
    End Sub
    
    'String to byte string conversion
    Function getByteString(StringStr)
     For i = 1 to Len(StringStr)
        char = Mid(StringStr,i,1)
        getByteString = getByteString & chrB(AscB(char))
     Next
    End Function
    
    'Byte string to string conversion
    Function getString(StringBin)
     getString =""
     For intCount = 1 to LenB(StringBin)
        getString = getString & chr(AscB(MidB(StringBin,intCount,1))) 
     Next
    End Function
    

    【讨论】:

      【解决方案3】:

      数据是多部分/表单数据; - 我使用 aspUpload 从表单中读取变量

      Set Upload = Server.CreateObject("Persits.Upload.1")
      Upload.Save
      
      strEvent        = Upload.Form("event")
      sBounceEmail    = Upload.Form("recipient")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-14
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        相关资源
        最近更新 更多