【问题标题】:How do I attach varbinary(max) data from SQL to my SMTPMessage in powershell?如何在 Powershell 中将 varbinary(max) 数据从 SQL 附加到我的 SMTPMessage?
【发布时间】:2021-12-27 15:46:52
【问题描述】:

我的 SQL 服务器中有一个 varbinary(max) 列,其中包含如下所示的二进制文件:

  0x255044462D312E340D0A25E2E3CFD30D...

我想在 powershell 中检索此值,以便我可以运行发送电子邮件的逻辑。

#Get the attachment binary into a variable from sql server
$Query = "SELECT AttachmentBinary FROM [dbo].MyFiles"
$e= Invoke-Sqlcmd -Query $Query -ServerInstance $server (etc.etc.)

在 powershell 中运行 $e.Attachmentbinary 会给我一个十进制数字列表,我认为这是 powershell 显示二进制文件的方式:

37
80
68
70
45
(and so on)

现在的问题是,当我准备文件并发送电子邮件时..

$contentStream = New-Object System.IO.MemoryStream(,$e.Attachmentbinary)
$MailAttachment = New-Object System.Net.Mail.Attachment($contentStream, "application/pdf")
$SMTPMessage.Attachments.Add($MailAttachment)

.. 它给我发送了一个 1kb 的文件。也就是说,

$e.AttachmentBinary.Length #Returns 1024 for some reason..

我确定数据库中的二进制数据是正确的。添加附件时,问题似乎出在第二部分。

如何纠正?

【问题讨论】:

  • 查看 MemoryStream 类的constructor overloads,您需要System.IO.MemoryStream($e.Attachmentbinary)。那里的逗号使它使用带有两个参数的重载,这些参数希望字节缓冲区作为第一个参数,第二个是布尔值(可写)
  • P.S.您可能需要明确地将 $e.Attachmentbinary 转换为 [Byte[]]$e.Attachmentbinary
  • @Theo 您的解决方案有效,但我还必须为我的 Invoke-Sqlcmd 命令增加 -MaxBinaryLength 78680。
  • 本题与tsql无关。请去掉这里引错人的标签,浪费时间

标签: arrays powershell smtp


【解决方案1】:

Invoke-Sqlcmd 需要一个 -MaxBinaryLength 值,因为 varbinary 的默认大小 1024 (1KB) 可能太小了。

按照@Theo 的建议,需要将结果数组 $e.Attachmentbinary 显式转换为二进制。

[Byte[]]$e.Attachmentbinary

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多