【问题标题】:Email with multiple attachments带有多个附件的电子邮件
【发布时间】:2012-10-21 11:31:06
【问题描述】:

我正在编写一个 PowerShell 脚本,供帮助台在将用户主文件夹从服务器迁移到 NAS 设备时使用。帮助台用户将用户名输入到“userhomelist.txt”文件中。

我的问题是我无法让脚本附加所有日志文件。只有最后一个日志文件附加到电子邮件。我想我需要为多个附件使用一个字符串,但我一直在想还有另一种方法。

#----- STEP #1 retrieve contents of input file ---#
$INPUTFILEPATH = 'c:\temp\userhomelist.txt'

#----- read input file contents ----#
$inputdata = Get-Content $INPUTFILEPATH

#----- Top section of email body ----#
$msgreport = new-object Net.Mail.MailMessage 
$msgreport = "To view log files, go to directory where this PowerShell Script was run from. `r"
$msgreport = $msgreport + "`r`n"

#read in each username
foreach ($username in $inputdata)
{

#----- STEP #2 robocopy files from \\server to \\nasdevice location ----#
Start-Process -FilePath robocopy -ArgumentList "\\server\userhomes\$username \\nasdevice\userhomes\$username /mir /sec /r:1 /w:1 /tee /NP /Z /log+:userhome-move-$username.log"
$file = "c:\temp\userhome\userhome-move-$username.log"
$msgreport = $msgreport + "$username robocopy has been completed." + "`n"

##----- STEP #3 change file and directory ownership to user ----#
Start-Process -FilePath subinacl -ArgumentList "/subdirectories \\nasdevice\userhomes\$username\*.* /setowner=$username"
$msgreport = $msgreport + "$username file and directory ownership changes have been completed." + "`n"
$msgreport = $msgreport + "`r`n"
}

#----- Email Results ----#
$SmtpClient = new-object system.net.mail.smtpClient
$MailMessage = New-Object system.net.mail.mailmessage 
$SmtpServer = "emailserver.business.com"
$SmtpClient.host = $SmtpServer 
$MailMessage.From = "userhome-migration@business.com"
$MailMessage.To.add("helpdeskn@business.com")
$MailMessage.Subject = "User migrations"
$MailMessage.IsBodyHtml = 0
$MailMessage.Body = $msgreport
$MailMessage.Attachments.Add($file)
$SmtpClient.Send($MailMessage)

【问题讨论】:

  • 你在 powershell 版本 1 中吗?

标签: email powershell email-attachments attachment


【解决方案1】:

如果您使用的是 powershell v2 或 v3,我建议使用 send-mailmessage cmdlet。 它有一个-attachments 参数,接受字符串数组(string[])。

您可以在foreach 用户循环之前更改变量$file 将其声明为$file = @()。 在 foreach 里面做:

$file += "c:\temp\userhome\userhome-move-$username.log"

$msgreport 更改为[string] 类型

然后使用send-mailmessage cmdlet 执行:

send-mailmessage -SmtpServer "emailserver.business.com"  `
-From "userhome-migration@business.com" -to "helpdeskn@business.com" `
-Subject "User migrations" -BodyAsHtml -Body $msgreport -Attachments $file

【讨论】:

  • 抱歉,我该如何“将 $msgreport 更改为 [string] 类型”?
  • @rainhailrob 只是省略了$msgreport = new-object Net.Mail.MailMessage 并在第一个$msgreport = "To view log files,.... 之后使用$msgreport += ..text here...。您可以在行尾添加一些nr 用于回车格式...
  • 那么这封电子邮件是单独发送每个日志还是一封包含所有日志的电子邮件?
  • @rainhailrob 实际上,您的代码发送一封包含所有附件的邮件...对于一封包含一个日志的邮件,您必须将 send-mailmessage 放入 foreach 循环中。
  • PS C:\temp> .\powershell-v3-email-with-attachment.ps1 Send-MailMessage :不支持给定路径的格式。在 C:\temp\Userhome-moves.ps1:33 char:17 + Send-MailMessage
猜你喜欢
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2011-04-14
  • 2020-09-12
  • 2018-03-09
  • 2014-09-25
  • 2019-05-25
  • 2021-12-30
相关资源
最近更新 更多