PowerShell für E-Mail Versand mit RoboCopy

Dark_Masta

Cadet 4th Year
Registriert
Juli 2007
Beiträge
85
Hallo Zusammen
Ich bräuchte wieder mal eure Hilfe und zwar bei PowerShell

Ich hab ein kleines Script welches mit RoboCopy die Daten von Gerät 1 auf Gerät 2 kopiert.
Jetzt müsste ich natürlich wissen ob das geklappt hat oder was das Problem war. Da ich ziemlich ein Anfänger bin was PowerShell betrifft habe ich mich im Internet ein paar Sachen durch gelesen und ein paar Scripts getestet, leider hab ich bis jetzt noch keine E-Mail erhalten :)

Code:
#*=============================================
#* Base variables
#*=============================================

$SourceFolder = "D:\TEST"
$DestinationFolder = "\\TEst\Test"
$Logfile = "C:\Robocopy.log"
$Subject = "Robocopy Results: Copy Purpose - Location to Location"
#$SMTPServer = "smtp.server.com"
$Sender = "Hans@gmail.com"
$Recipients = "Fritz@gmail.com"
$Admin = "Uli@gmail.com"
$SendEmail = $True
$IncludeAdmin = $True
$AsAttachment = $False

#*=============================================
#* GMAIL variables
#*=============================================
$SMTPServer = "smtp.gmail.com"
$cred = New-Object System.Net.NetworkCredential("Hans@gmail.com", "Test");
# Add "-UseSsl -Credential $cred" to the Send-MailMessage

#*=============================================
#* SCRIPT BODY
#*=============================================

# Change robocopy options as needed. ( http://ss64.com/nt/robocopy.html )
Robocopy $SourceFolder $DestinationFolder /MIR /R:2 /W:5 /LOG:$Logfile /NP /NDL

# The following attempts to get the error code for Robocopy
# and use this as extra infromation and email determination.
# NO OTHER CODE BETWEEN THE SWITCH AND THE ROBOCOPY COMMAND
Switch ($LASTEXITCODE)
{
16
{
$exit_code = "16"
$exit_reason = "***FATAL ERROR***"
#$IncludeAdmin = $False
#$SendEmail = $False
}
8
{
$exit_code = "8"
$exit_reason = "**FAILED COPIES**"
#$IncludeAdmin = $False
#$SendEmail = $False
}
4
{
$exit_code = "4"
$exit_reason = "*MISMATCHES*"
$IncludeAdmin = $False
#$SendEmail = $False
}
2
{
$exit_code = "2"
$exit_reason = "EXTRA FILES"
$IncludeAdmin = $False
#$SendEmail = $False
}
1
{
$exit_code = "1"
$exit_reason = "Copy Successful"
$IncludeAdmin = $False
#$SendEmail = $False
}
0
{
$exit_code = "0"
$exit_reason = "No Change"
$SendEmail = $False
$IncludeAdmin = $False
}
default
{
$exit_code = "Unknown ($LASTEXITCODE)"
$exit_reason = "Unknown Reason"
#$SendEmail = $False
$IncludeAdmin = $False
}
}

# Modify the subject with Exit Reason and Exit Code
$Subject += " : " + $exit_reason + " EC: " + $exit_code

# Test log file size to determine if it should be emailed
# or just a status email
If ((Get-ChildItem $Logfile).Length -lt 25mb)
{
If ($IncludeAdmin)
{
If ($AsAttachment)
{
Send-MailMessage -From $Sender -To $Recipients -Cc $Admin -Subject $Subject -Body "Robocopy results are attached." -Attachment $Logfile -DeliveryNotificationOption onFailure -UseSsl -Credential $cred -SmtpServer $SMTPServer 
} Else {
Send-MailMessage -From $Sender -To $Recipients -Cc $Admin -Subject $Subject -Body (Get-Content $LogFile | Out-String) -DeliveryNotificationOption onFailure -UseSsl -Credential $cred -SmtpServer $SMTPServer
}
} Else {
If ($AsAttachment)
{
Send-MailMessage -From $Sender -To $Recipients -Subject $Subject -Body "Robocopy results are attached." -Attachment $Logfile -DeliveryNotificationOption onFailure -UseSsl -Credential $cred -SmtpServer $SMTPServer
} Else {
Send-MailMessage -From $Sender -To $Recipients -Subject $Subject -Body (Get-Content $LogFile | Out-String) -DeliveryNotificationOption onFailure -UseSsl -Credential $cred -SmtpServer $SMTPServer
}
}
} Else {
# Creat the email body from the beginning and end of the $Logfile
$Body = "Logfile was too large to send." + (Get-Content $LogFile -TotalCount 15 | Out-String) + (Get-Content $LogFile | Select-Object -Last 13 | Out-String)
# Include Admin if log file was too large to email
Send-MailMessage -From $Sender -To $Recipients -Cc $Admin -Subject $Subject -Body $Body -DeliveryNotificationOption onFailure -UseSsl -Credential $cred -SmtpServer $SMTPServer
#Exclude Admin if log file was too large to email
#Send-MailMessage -From $Sender -To $Recipients -Subject $Subject -Body $Body -DeliveryNotificationOption onFailure -SmtpServer $SMTPServer
}

#*=============================================
#* END OF SCRIPT: Copy-RobocopyAndEmail.ps1
#*=============================================

Beim Gmail Part hab ich schon recht herumgepfuscht und viel ausprobiert daher haben sich wohl auch schon viele Fehler eingeschlichen. Das Passwort stand schon im PowerShell oder jetzt mit verschlüsselter Datei, nichts hat funktioniert.

Ich bekomme fast immer die selben Meldungen:
"The SMTP server requeres a secure connection or the client was not authicated. The server respone was 5.7.0 Must issue a STARTTLS command first.

oder

"Send-MailMessage : Cannot process argument transformation on parameter 'Credential'. userName
At C:\RoboCopyScript.ps1:115 char:30"

Vielen Dank für eure Hilfe
 
Zuletzt bearbeitet:
Versuchs doch einfach mal mit dem Parameter -UseSSL

Code:
Send-MailMessage -UseSsl

Das CMDLET für Send-MailMessage übernimmt von dem STMPclient Object nicht das gesetze SSL Property.
 
Zuletzt bearbeitet:
Macht leider keinen Unterschied

Fehler:
Send-MailMessage : Cannot process argument transformation on parameter 'Credential'. userName
At line:107 char:166
+ ... sl -Credential $cred -SmtpServer $SMTPServer
+ ~~~~~
+ CategoryInfo : InvalidData: (:) [Send-MailMessage], ParameterBindingArgumentTransformationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Microsoft.PowerShell.Commands.SendMailMessage

Hab oben den Code mal geändert
 
Zuletzt bearbeitet:
Mh..ich schau mir das Skript nachher mal an.
Aber wie es aussieht kann er dein Credential Objekt nicht umwandeln.
 
Ich weiß nicht wies bei gmail ist aber manche provider verwenden nicht die default ports für die ssl verbindungen und dann funktioniert send-mailmessage nur wenn deine powershell version den -port parameter unterstützt (laut technet ab version 3.0 aber bei mir mit version 3.0 trotzdem nicht vorhanden...)

Also falls möglich angeben, ansonsten die alternative send methode wie z.B hier erwähnt, verwenden...

Als port würd ich 587 verwenden oder 465
 
Folgender Code läuft bei mir:

Wichtig war nur bei zweistufiger Authentifizierung ein Anwendungsspezifisches Passwort zu vergeben:

$EmailTo = "bla"
$EmailFrom = "bla"
$Subject = "Test"
$Body = "Test Body"
$SMTPServer = "smtp.gmail.com"
$filenameAndPath = "C:\setup.log"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
$SMTPMessage.Attachments.Add($attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("bla", "khnweojkqlqpccsi");
$SMTPClient.Send($SMTPMessage)
 
Zurück
Oben