Powershell中如何不使用文件路径为$SMTPMessage.Attachments.Add添加二进制附件
解决方案
你可以使用System.Net.Mail.Attachment类支持流输入的重载构造函数实现需求,首先需要将二进制字节数组封装为MemoryStream对象再传入构造参数即可。
完整可运行代码片段
# 提前定义的变量示例(你可以根据实际场景调整赋值) # $binary = [IO.File]::ReadAllBytes("C:\test\example.pdf") # 存储附件原始二进制数据的字节数组 # $mimetype = "application/pdf" # 附件对应的MIME类型字符串 # $attachmentFileName = "月度报告.pdf" # 可选,定义收件人看到的附件显示名,建议指定 # $SMTPMessage 为已初始化的System.Net.Mail.MailMessage对象 # $SMTPClient 为已配置SMTP服务器、发件人信息的System.Net.Mail.SmtpClient对象 # 1. 将二进制字节数组转换为内存流 $memoryStream = New-Object System.IO.MemoryStream(,$binary) # 2. 通过流创建Attachment对象 $attachment = New-Object System.Net.Mail.Attachment($memoryStream, $attachmentFileName, $mimetype) # 3. 添加附件并发送邮件,逻辑和原有代码一致 $SMTPMessage.Attachments.Add($attachment) $SMTPClient.Send($SMTPMessage) # 可选:发送完成后释放资源 $memoryStream.Dispose() $attachment.Dispose()
注意事项
- 如果不需要指定附件显示名,可省略
$attachmentFileName参数,调用语法改为New-Object System.Net.Mail.Attachment($memoryStream, [System.Net.Mime.ContentType]::new($mimetype)) - 构造
MemoryStream时二进制参数前的逗号不可省略,是PowerShell中强制把字节数组作为单个参数传递的语法要求,省略会导致构造失败
内容的提问来源于stack exchange,提问作者Erechtheus
相关产品推荐
相关产品推荐

