Добавление вложений в электронное письмо, созданное в powershell - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь создать сценарий PS, который выполняет следующие действия:

  • Запуск 2 программ, расположенных на сервере
  • Проверка файлов ошибок
  • Присоединениефайлы ошибок на электронную почту
  • Подождите 5 минут, промойте и повторите

Пока у меня есть ниже, я могу заставить его работать без вложения, он просто отправляет ссылку в электронном письме. Однако я бы предпочел, чтобы они были вложениями.

В настоящее время я получаю сообщение об ошибке: «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

}

}

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Конечно, вы должны предоставить свои учетные данные для аутентификации. Если вы посмотрите на документацию, то увидите, что -Credential является одним из параметров. Что вы можете сделать:

# Define your Credentials
$username = 'your username'
$password= 'your password'

# Crete a credential Object
[SecureString]$secureString = $password | ConvertTo-SecureString -AsPlainText -Force 
[PSCredential]$credentialObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $password

Добавьте параметр -Credential в команду Send-Mailmessage, например -Credential $credentialObject

Это просто, чтобы показать вам способ выполнить то, что вы хотите, но будьте осторожны с этим методом, потому что таким образом вы храните свой пароль непосредственно в скрипте. Существуют решения для шифрования вашего пароля во внешних файлах. Вы можете найти хорошее объяснение на: https://pscustomobject.github.io/powershell/howto/Store-Credentials-in-PowerShell-Script/

0 голосов
/ 10 октября 2019

Вы используете много ссылок .net. Я думаю, что вы можете упростить это, используя существующий командлет 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 Reference Send-MailMessage

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...