在VB脚本CDO.Message中将binary / base64数据设置为附件

时间:2015-03-24 11:57:06

标签: iis vbscript asp-classic cdo.message

我正在尝试发送附件为PDF的电子邮件。我有二进制/ Base64中的附件数据,但是当我尝试将其写入流时,它无法正常工作。这是我的代码。我在这里使用上传课程 - http://www.codeguru.com/csharp/.net/net_asp/article.php/c19297/Pure-ASP-File-Upload.htm

<!--METADATA TYPE="TypeLib" FILE="C:\windows\system32\cdosys.dll" -->
<!-- #include file="upload.asp" -->
<%

' Create the FileUploader
Dim Uploader, File
Set Uploader = New FileUploader

' This starts the upload process
Uploader.Upload()

Dim uploadFileName
Dim uploadFileData
' Check if any files were uploaded
If Uploader.Files.Count > 0 Then
    ' Loop through the uploaded files
    For Each File In Uploader.Files.Items
        uploadFileName = File.FileName
        uploadFileData = File.FileData
    Next
End If



Set ObjMailer = CreateObject("CDO.Message")
Set iConf = Server.CreateObject("CDO.Configuration")

Set Flds = iConf.Fields
With Flds
    .Item(cdoSendUsingMethod) = cdoSendUsingPort
    .Item(cdoSMTPServer) = "localhost"
    .Item(cdoSMTPServerPort) = 5000
    .Item(cdoSMTPconnectiontimeout) = 10
    .Update
End With

Set ObjMailer.Configuration = iConf

ObjMailer.Subject = "Subject"
ObjMailer.From = "from@testdomain.com"
ObjMailer.To = "to@testdomain.com"
ObjMailer.HTMLBody  = "<h1>This is a sample html email body</h1>"

' Code to Attach the Email
Const cdoContentDisposition = "urn:schemas:mailheader:content-disposition"

Dim oPart : Set oPart = ObjMailer.Attachments.Add
oPart.ContentMediaType = "application/pdf"

oPart.Fields(cdoContentDisposition).Value = "attachment;filename=""Test.pdf"""
oPart.Fields.Update

Dim oStreamOut: Set oStreamOut = oPart.GetDecodedContentStream
oStreamOut.Type = 1
oStreamOut.Write uploadFileData
oStreamOut.Flush

ObjMailer.Send
Set ObjMailer = Nothing
Set iConf = Nothing
Set Flds = Nothing
If Err.number <> 0 Then
    Response.Write "Error: " & Err.Number
    Response.Write "Error (Hex): " & Hex(Err.Number)
    Response.Write "Source: " &  Err.Source
    Response.Write "Description: " &  Err.Description
End If

我收到以下错误。我不知道我哪里出错了。

ADODB.StreamDescription: Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

最后,我得到了这个工作。感谢kul-tigin指出vbArray + vbByte的问题。上传的数据是多字节数据,我需要将其标准化。

这是我获得转换多字节数组here的函数。

Function GetFileDataBinary()

    Dim RS, LMultiByte, Binary
    Const adLongVarBinary = 205
    Set RS = CreateObject("ADODB.Recordset")
    LMultiByte = LenB(FileData)
    If LMultiByte > 0 Then
        RS.Fields.Append "mBinary", adLongVarBinary, LMultiByte
        RS.Open
        RS.AddNew
        RS("mBinary").AppendChunk FileData & ChrB(0)
        RS.Update
        Binary = RS("mBinary").GetChunk(LMultiByte)
    End If

    GetFileDataBinary = Binary
End Function

我改变了我的代码,就像下面一样,它只是无用的。

Dim uploadFileName
Dim uploadFileData
' Check if any files were uploaded
If Uploader.Files.Count > 0 Then
    ' Loop through the uploaded files
    For Each File In Uploader.Files.Items
        uploadFileName = File.FileName
        uploadFileData = File.GetFileDataBinary
    Next
End If

我可以致电File.GetFileDataBinary,因为我将GetFileDataBinary放入我的upload.asp