我有以下功能可以在 powershell 中发送带有附件的电子邮件:
param
(
[parameter(Mandatory = $false)]
[string]$l
)
function SendMail(){
if($e -ine '')
{
$mail = New-Object System.Net.Mail.MailMessage
$mail.From = $f;
$mail.To.Add($t);
$mail.Subject = $s;
$att = New-Object System.Net.Mail.Attachment –ArgumentList $l
$mail.Attachments.Add($att)
$mail.Body = $b;
$smtp = New-Object System.Net.Mail.SmtpClient($serv);
$smtp.Send($mail);
}
}
当我尝试发送 .txt 文件附件时,它似乎删除了文本文件中的所有信息。有什么建议可以告诉我哪里出了问题吗?
答案1
我基本上使用了和你相同的代码 - 各种附件都顺利通过。我相当确信你的问题不在 PowerShell 中 - 你在与之通信的 SMTP 服务器上是否设置了垃圾邮件或其他过滤器?是否有另一个可以与之通信的干净的 SMTP 服务器?
作为参考,下面是我调整参数以进行测试的示例代码:
function SendMail() {
# create mail message
$mail = New-Object System.Net.Mail.MailMessage
$mail.From = "[email protected]"
$mail.To.Add("[email protected]")
$mail.Subject = "Here is your attached file"
$mail.Body = "See attached file"
# create attachment
$att = New-Object System.Net.Mail.Attachment "C:\Test.txt"
$mail.Attachments.Add($att)
# send email
$smtp = New-Object System.Net.Mail.SmtpClient("mail.serverfault.com")
$smtp.Send($mail)
}
答案2
您可以使用 Send-MailMessage(用于发送电子邮件的 V2 cmdlet)显著缩短代码。这也可能解决您的问题,因为以下几点:
- .NET 详细信息将对您隐藏,因此您不必担心错误地构造对象。
- cmdlet 更有可能正确处理路径。在 .NET 中交互时,一个非常常见的 PowerShell 问题是您必须通过绝对目录引用内容。虽然系统有当前工作目录的概念,但由于 PowerShell 目录可能位于文件系统上,也可能位于注册表中,因此 .NET 当前目录很少与 PowerShell 当前目录同步。
下面是一个使用 Send-MailMessage 的示例。其中,创建了一个参数哈希表,通过在变量名前面使用 @ 代替 $,每个参数都成为 Send-MailMessage 的参数。
有关更多示例,请参阅:使用 Send-MailMessage、ConvertTo-HTML 和 PowerShell Pack 的任务计划程序模块发送自动电子邮件
function SendMail($Attachment) {
# create mail message
$MessageParameters = @{
From = "[email protected]"
To = "[email protected]"
Subject = "Here is your attached file"
Body = "See attached file"
Attachments = $Attachment
SmtpServer = "mail.serverfault.com"
}
Send-MailMessage @MessageParameters
}
我相信这是一种更像“PowerShell”的做事方式,我希望它可以解决您的问题。
希望这可以帮助,
詹姆士
答案3
if($e -ine '') -ine 似乎是拼写错误?
您确实应该包含这些值...当您创建附件时,路径或文件名可能有问题吗?尝试使用文件的“全名”(路径+文件名)。