none
Send-MailMessage ohne Nutzereingabe RRS feed

  • Frage

  • Hallo,

    ich möchte mit Send-MailMessage jeden Tag um 18 Uhr eine Email versenden. Dies soll natürlich automatisch passieren (Ohne Nutzereingabe)

    $pw = Get-Content D:\X\X\X\regmail.txt | ConvertTo-SecureString
    $cred = New-Object System.Management.Automation.PSCredential "r016225", $pw

    Send-MailMessage -Credential $cred -to $sendTo -from $sendFrom -Subject $subject -body $body -Attachment $filepath -encoding ([System.Text.Encoding]::UTF8)

    Wenn ich das Teste werde ich allerdings aufgefordert meine Logindaten einzugeben. Da dies später durch den SYSTEM-User jeden Tag um 18 Uhr ausgeführt werden soll, ist das ein Problem.

    Wie kann ich das umgehen? Und warum fragt er überhaupt? Ich gebe ihm doch das Passwort und den Namen.

    lg Zuyas

    Montag, 22. Juli 2013 12:07

Antworten

  • Wenn man einen Sheduled Task laufen lässt , dann ist es dem TaskSheduler verboten die Identität zu wechseln (es fehlen privilegien!).
    Das ist hier aber nicht dein Problem da hier die Credentials zum schluss im "klartext" (NetworkCredential) an den Mailserver übergeben werden.

    Das Send-Mail Cmdlet hat einen bekannten Bug in der PowerShell Version 2.0 da gibts probleme bei der SMTP-Authentifizierung.

    Nimm statt dessen die .NET Klasse Net.Mail.SmtpClient.

    # Mail server
    $SmtpServer = "smtp.xxxx.int"
    
    # Credentials to authentificate against smtp server
    $username = "account"
    $password = "password"
    
    # E-Mail adresses
    $From = "yyy@xxx.net"
    $To = "bbb@cccc.de"
    
    # Attachment
    $AttachedFile  = "D:\temp\test.txt"
    
    # Subject line
    $Subject = "This is the subject "
    
    # Mail message body
    $Body = @"
    Thist is a Test mail!
       Greetings !
    "@
    
    ###### Create Mail ######
    
    $smtp = new-object Net.Mail.SmtpClient($SmtpServer)
    
    
    $attachment = new-object Net.Mail.Attachment($AttachedFile)
    
    $credentials=new-object System.Net.NetworkCredential
    $credentials.username = $username
    $credentials.password = $password
    
    $smtp.Credentials = $credentials.getcredential($SmtpServer,"25","basic")
    
    $message = New-Object Net.Mail.MailMessage
    $message.Subject = $Subject
    $message.From = 
    $message.To.Add($To)
    $message.Body = $Body
    $message.Attachments.Add($attachment)
    
    $smtp.Send($message)


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Bearbeitet Peter Kriegel Dienstag, 23. Juli 2013 06:11 bvggbgfbfg
    • Als Antwort markiert Zuyas Dienstag, 23. Juli 2013 11:33
    Dienstag, 23. Juli 2013 06:09

Alle Antworten

  • Ok.. Wenn ich bei:

    $cred = New-Object System.Management.Automation.PSCredential "r016225", $pw

    nicht meinen Nutzernamen sondern irgendwas sinnloses hinschreibe klappt es.
    Montag, 22. Juli 2013 12:46
  • Hallo,

    wenn du es ganz schön machen willst und mit deinen Credentials die Mail versenden willst kannst du diese auch in eine verschlüsselte Datei ablegen und diese dann immer wieder vorm versenden der Mail lesen.

    Datei erstellen:

    Read-Host -AsSecureString | ConvertFrom-SecureString | out-file "c:\XXX\Meine-Credentials.txt"

    Mail erstellen:

    $pwd = Get-Content "c:\XXX\Meine-Credentials.txt" | ConvertTo-SecureString
    $cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "User-ID",$pwd

    Send-MailMessage -Credential $cred -to $sendTo -from $sendFrom -Subject $subject -body $body -Attachment $filepath -encoding ([System.Text.Encoding]::UTF8)

    Grüße

    Klaus

    Montag, 22. Juli 2013 12:54
  • Hallo KSV43,

    genau so habe ich es auch gemacht. Was ich nicht verstehe.. Wenn ich bei "User-ID" die User-ID eingebe funktioniert es nicht mehr.

    Nunja.. Das viel größere Problem ist.. Wenn ich es ausführe funktioniert es.. Wenn der Task Scheduler (als SYSTEM) es ausführt läuft die Task unendlich lange und sendet nichts. Eine Idee woran das liegen kann?

    Montag, 22. Juli 2013 14:05
  • Wenn man einen Sheduled Task laufen lässt , dann ist es dem TaskSheduler verboten die Identität zu wechseln (es fehlen privilegien!).
    Das ist hier aber nicht dein Problem da hier die Credentials zum schluss im "klartext" (NetworkCredential) an den Mailserver übergeben werden.

    Das Send-Mail Cmdlet hat einen bekannten Bug in der PowerShell Version 2.0 da gibts probleme bei der SMTP-Authentifizierung.

    Nimm statt dessen die .NET Klasse Net.Mail.SmtpClient.

    # Mail server
    $SmtpServer = "smtp.xxxx.int"
    
    # Credentials to authentificate against smtp server
    $username = "account"
    $password = "password"
    
    # E-Mail adresses
    $From = "yyy@xxx.net"
    $To = "bbb@cccc.de"
    
    # Attachment
    $AttachedFile  = "D:\temp\test.txt"
    
    # Subject line
    $Subject = "This is the subject "
    
    # Mail message body
    $Body = @"
    Thist is a Test mail!
       Greetings !
    "@
    
    ###### Create Mail ######
    
    $smtp = new-object Net.Mail.SmtpClient($SmtpServer)
    
    
    $attachment = new-object Net.Mail.Attachment($AttachedFile)
    
    $credentials=new-object System.Net.NetworkCredential
    $credentials.username = $username
    $credentials.password = $password
    
    $smtp.Credentials = $credentials.getcredential($SmtpServer,"25","basic")
    
    $message = New-Object Net.Mail.MailMessage
    $message.Subject = $Subject
    $message.From = 
    $message.To.Add($To)
    $message.Body = $Body
    $message.Attachments.Add($attachment)
    
    $smtp.Send($message)


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Bearbeitet Peter Kriegel Dienstag, 23. Juli 2013 06:11 bvggbgfbfg
    • Als Antwort markiert Zuyas Dienstag, 23. Juli 2013 11:33
    Dienstag, 23. Juli 2013 06:09
  • Hallo Peter,

    vielen Dank! Du hast mich mal wieder gerettet ;)

    Gegen Ende fehlt allerdings $message.From = $From

    Könntest du ja für die Nachwelt noch bearbeiten.

    Ansonnsten läuft es jetzt so wie es soll, vielen Dank nochmal.

    lg Zuyas

    Edit:

    Für andere vielleicht auch Interessant.. Mein Script soll die Datei nach dem Senden umbenennen. Das Script greift aber noch eine ganze weile auf die Datei zu, sie ist also nicht änder/löschbar..

    Einfach am Ende einfügen:

    $attachment.Dispose();
    $message.Dispose();

    • Bearbeitet Zuyas Dienstag, 23. Juli 2013 14:17 Nachtrag
    Dienstag, 23. Juli 2013 11:40