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

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

我有以下功能可以在 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 似乎是拼写错误?

您确实应该包含这些值...当您创建附件时,路径或文件名可能有问题吗?尝试使用文件的“全名”(路径+文件名)。

相关内容