You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell脚本发送带附件邮件后文件仍被锁定如何解决?

原因

System.Net.Mail.MailMessage和System.Net.Mail.Attachment均实现了IDisposable接口,加载附件后会持有对应文件的句柄,未主动调用释放方法时,句柄只会在垃圾回收器自动回收对象或PowerShell进程退出时才会释放,就会出现文件被持续占用的情况。

解决方案

方法1:手动调用释放方法

邮件发送完成后主动调用对象的Dispose()方法即可立即释放持有的文件句柄:

$message = New-Object System.Net.Mail.MailMessage $sender, $mailTo
$message.Subject = "Test email with attachment"
$message.Body = "See attachment."
$message.Attachments.Add("path\to\file")

$smtpClient = New-Object Net.Mail.SmtpClient($smtpHostname, $smtpPort)
$smtpClient.EnableSSL = $true
$smtpClient.send($message)

# 新增释放逻辑,执行后文件锁立即解除
$message.Dispose()
$smtpClient.Dispose()

方法2:使用using语句自动释放(推荐,支持PowerShell 5.1及以上版本)

using语句会在代码块执行结束后自动释放实现了IDisposable接口的对象,无需手动写释放逻辑,避免遗漏:

using ($message = New-Object System.Net.Mail.MailMessage $sender, $mailTo)
using ($smtpClient = New-Object Net.Mail.SmtpClient($smtpHostname, $smtpPort)) {
    $message.Subject = "Test email with attachment"
    $message.Body = "See attachment."
    $message.Attachments.Add("path\to\file")

    $smtpClient.EnableSSL = $true
    $smtpClient.send($message)
}
# 执行到此处时所有关联资源已自动释放

补充说明

如果需要提前释放单个附件,可直接遍历$message.Attachments集合,对指定附件对象调用Dispose()方法即可。

内容的提问来源于stack exchange,提问作者ytingyeu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:18:03