首页 > 解决方案 > 将附件添加到在 powershell 中生成的电子邮件

问题描述

我正在尝试创建一个执行以下操作的 PS 脚本:

到目前为止,我已经有了以下内容,我可以在没有附件的情况下使用它,它只是在电子邮件中发送一个链接。但是我宁愿它们是附件。

目前我得到的错误是“Powershell.exe:找不到接受参数'$null'的位置参数。”。

但我不知道为什么会产生这个?

任何意见,将不胜感激。

#Hide powershell
Powershell.exe -windowstyle hidden {

#Make sure the program isn't running before starting the script 
stop-process -Name WorksOrderCompletionImport
stop-process -Name WorksOrderIssuesImport

#Loop condition
While ($true)
{
$i++

#Bind location to string
$files=Get-ChildItem "E:\Production Siemens Interface Files\error"

#Binding the path to the string
$filechecker = 'E:\Production Siemens Interface Files\error\*.csv'

# Sender and Recipient Info for email
$MailFrom = "myemail@domain.com"
$MailTo = "myemail@domain.com"

# Sender Credentials
$Username = "myemail@domain.com"
$Password = "BadBoiPassword"

# Server Info
$SmtpServer = "smtp.office365.com"
$SmtpPort = "587"

# Message content
$Link = "\\SERVER1\E Drive\Production Siemens Interface Files\error"
$MessageSubject = "Errors have been generated in the Production Siemens Interface Files Folder" 
$Message = New-Object System.Net.Mail.MailMessage $MailFrom,$MailTo
$Message.IsBodyHTML = $true
$Message.Subject = $MessageSubject
$Message.Body = @'
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>Hello,</p>
<p>Please be advised that errors have been generated in the Siemens Integration Production Folder.</p>
<p>Please follow this link to check : <a href="\\SERVER1\e$\Production Siemens Interface Files\error">Link to error files</a></p>
</body>
</html>
'@

#Start the programs
start-process -filepath "C:\Program Files\Datel Computing\Siemens Integration PRODUCTION\WorksOrderIssuesImport.exe"
start-process -filepath "C:\Program Files\Datel Computing\Siemens Integration PRODUCTION\WorksOrderCompletionImport.exe"
Start-Sleep -s 10

#If statement to control email
if (Test-Path $filechecker)

# Construct the SMTP client object, credentials, and send
{$Smtp = New-Object Net.Mail.SmtpClient($SmtpServer,$SmtpPort)
$Smtp.EnableSsl = $true
$Smtp.Credentials = New-Object System.Net.NetworkCredential($Username,$Password)

$attachment = New-Object System.Net.Mail.Attachment –ArgumentList 'E:\Production Siemens Interface Files\error\'$file
$smtp.Attachments.Add($attachment)

$Smtp.Send($Message)}

else { Start-Sleep -s 10
}

#Stop the program
stop-process -Name WorksOrderCompletionImport
stop-process -Name WorksOrderIssuesImport

# Sleep for 300 seconds then loop back
Start-Sleep -s 300

}

}

标签: powershell

解决方案


您使用了很多 .net 引用。我认为您可以通过使用现有的 cmdlet Send-MailMessage 来简化此操作。例如:

$PSEmailServer = "smtp.office365.com"
$smtpPort = "587"
$mailFrom = "myemail@domain.com"
$mailTo = "myemail@domain.com"
$messageSubject = "Errors have been generated in the Production Siemens Interface Files Folder"
$attachment = "E:\Production Siemens Interface Files\error\$file"
$body = @'
<p>Hello,</p>
<p>Please be advised that errors have been generated in the Siemens Integration Production Folder.</p>
<p>Please follow this link to check : <a href="\\SERVER1\e$\Production Siemens Interface Files\error">Link to error files</a></p>
'@

Send-MailMessage -From $mailFrom -To $mailTo -Subject $messageSubject -Body $body -BodyAsHtml -Attachments $attachment -Port $smtpPort -UseSsl

另请参阅:MS 参考 Send-MailMessage


推荐阅读