Powershell脚本发送电子邮件,丢失电子邮件附件中的文本

我有以下function发送附件的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文件附件时,它似乎将文本文件中的所有信息去掉。 有什么错误的build议吗?

我基本上使用了相同的代码 – 各种附件都很好。 我相当有信心你的问题是在PowerShell之外的 – 你有SMTP服务器上的垃圾邮件或其他filter设置你正在通信? 有没有另一个SMTP服务器,你可以说是干净的?

作为参考,这里是我调整参数来testing的示例代码:

 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) } 

您可以通过使用Send-MailMessage(V2 cmdlet用于电子邮件)大大缩短代码。 这也可以解决你的问题,因为一些事情:

  • .NET的细节将被隐藏起来,所以你不必担心错误地构造一个对象。
  • 这些cmdlet更有可能正确处理path。 在.NET中进行交互时,一个非常常见的PowerShell问题就是你必须通过绝对目录引用东西。 虽然系统具有当前工作目录的概念,但由于PowerShell目录可能位于文件系统上,或者可能位于registry中,因此.NET当前目录很less与PowerShell当前目录同步。

下面是一个使用Send-MailMessage的例子。 其中创build了一个参数散列表,通过在variables名前使用@而不是$,每个参数都成为Send-MailMessage的一个参数。

有关更多示例,请参阅: 使用Send-MailMessage,ConvertTo-HTML和PowerShell软件包的任务计划程序模块发送自动电子邮件

 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”的方式来做事情,我希望它摆脱了你的问题。

希望这可以帮助,

詹姆士

如果($ e -ine'')-ine似乎是一个错字?

你真的应该包括值…当你创build附件,maxybe有一个path或文件名的问题? 尝试使用文件的“FullName”(path+文件名)。