如何在PowerShell中将SQL的varbinary(max)数据附加到SMTPMessage
问题修复方案
你的问题核心不是附件添加逻辑错误,是Invoke-Sqlcmd默认会截断长二进制数据,默认的-MaxBinaryLength参数值为1024,所以你查询拿到的二进制本身就只有前1KB,自然最终附件大小不对。
修复步骤
- 修改查询语句,给
Invoke-Sqlcmd增加-MaxBinaryLength参数,设置为足够大的值,如果你不确定最大附件大小,可以直接设置为0代表不限制长度:
#Get the attachment binary into a variable from sql server $Query = "SELECT AttachmentBinary FROM [dbo].MyFiles" # 增加-MaxBinaryLength参数,0代表不限制二进制长度 $e= Invoke-Sqlcmd -Query $Query -ServerInstance $server -MaxBinaryLength 0 <# 其余原有参数保持不变 #>
- 验证数据完整性:你可以先在SQL Server中执行
SELECT DATALENGTH(AttachmentBinary) FROM [dbo].MyFiles得到二进制数据的真实长度,再在PowerShell中执行$e.AttachmentBinary.Length,两者一致就说明数据获取没有截断。 - 原有附件处理逻辑不需要修改,如果需要让收件人看到带后缀的正常文件名,可以调整附件创建代码,增加文件名参数:
$contentStream = New-Object System.IO.MemoryStream(,$e.Attachmentbinary) # 第三个参数指定附件显示的文件名,可根据业务需求修改 $MailAttachment = New-Object System.Net.Mail.Attachment($contentStream, "application/pdf", "你的附件名.pdf") $SMTPMessage.Attachments.Add($MailAttachment)
内容的提问来源于stack exchange,提问作者Erechtheus
相关产品推荐
相关产品推荐

