Send Robocopy E-Mail and SLACK

   Robocopy, Microsoft Windows için bir komut satırı dosya aktarım aracıdır. Robocopy, işlevsel olarak COPY komutundan ve XCOPY'den daha kapsamlıdır ancak ikisinin de yerini almaz. Kevin Allen tarafından oluşturulan ve ilk olarak Windows NT 4.0 Kaynak Seti'nin bir parçası olarak piyasaya sürülen bu özellik, Windows Vista ve Windows Server 2008'den bu yana Windows'un standart bir özelliğidir.

Robocopy kullanımı ve örnekleri için diğer kılavuza bakabilirsiniz. 3 adet dosya oluşturacağız. 

  • Robocopy için bir batch file
  • Başarılı işlem için e-posta ayarlarının olduğu bir powershell betiği
  • Hatalı işlem için e-posta ayarlarının olduğu bir powershell betiği

succesmailsend

Bilgisayarınızda, başlat butonuna basarak Windows PowerShell ISE'yi yönetici olarak çalıştırın.

Açılan pencerede aşağıdaki kopyalayın ve ilgili belirtilen alanları kendi yapınıza göre değiştirin. Betiği çalıştırın ve size e-mail geldiğini doğrulayın. Eğer her şey yolunda ise dosya adını succesmailsend.ps1 olarak kayıt ediniz. 

  • SMTPUsername: Gmail hesap adını giriniz.
  • SMTPPassword: Gmail için uygulama parolanızı giriniz. (Kılavuz üzerinden nasıl yapılacağına bakabilirsiniz.)
  • EmailFrom: Gmail hesap adını giriniz.
  • EmailTo: Mail alacak hesapları giriniz.
  • EmailBody: Mail içi gövde başlığı.
  • EmailBody: Robocopy log dosyası içeriğini mail içine yazdırmak için log dosyasının yolunu giriniz.
  • uriSlack = "Slack Web Hook URL adresini giriniz."
  • pretext = "Konu Başlığı Giriniz."
  • text = “Konu içeriği yazınız.”
     
# Email parameters
$SMTPServer = "smtp.gmail.com"
$SMTPPort = 587
$SMTPUsername = "x@gmail.com"
$SMTPPassword = "towl aeqg kuyx kxrb"
$EmailFrom = "x@gmail.com"
$EmailTo = "x@hotmail.com", "y@gmail.com"
$EmailSubject = "Mehmet_Backup - İŞLEM BAŞARILI - Result: OK"
$EmailBody = "Mehmet_Backup profilinin yedek alma işlemi başarı ile sonuçlanmıştır. Log kayıtları ektedir. `n"
$EmailBody += Get-Content "B:\robocopy.log" | Out-String

# Attachment file paths
#$Attachment1 = "B:\x.log"
# eğer birden fazla mail eki gönderimi olacaksa bu kod eklenecek Ör. "$Attachment2 = "C:\robocopy\log\test_v1.log""

# Create a new mail message
$MailMessage = New-Object System.Net.Mail.MailMessage
$MailMessage.From = $EmailFrom
foreach ($recipient in $EmailTo) {
    $MailMessage.To.Add($recipient)
}
$MailMessage.Subject = $EmailSubject
$MailMessage.Body = $EmailBody

# Attach files to the mail message
$AttachmentFiles = $Attachment1 # Birden fazla olduğunda bu kısımı yanına eklemeyi unutma Ör. ",$Attachment2"
foreach ($AttachmentFile in $AttachmentFiles) {
    $Attachment = New-Object System.Net.Mail.Attachment($AttachmentFile)
    $MailMessage.Attachments.Add($Attachment)
}

# Create a new SMTP client and send the mail message
$SMTPClient = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($SMTPUsername, $SMTPPassword)
$SMTPClient.Send($MailMessage)

# Dispose of the attachment objects
foreach ($Attachment in $MailMessage.Attachments) {
    $Attachment.Dispose()
}

 # SlackWebhook URL bilgilerini giriniz.

    $uriSlack = "https://hooks.slack.com/services/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75"
    $body = ConvertTo-Json @{
        pretext = "Database Backup"
        text = "Veritabanı Yedeklerı Alındı."
        color = "#142954"
    }

    try {
        Invoke-RestMethod -uri $uriSlack -Method Post -body $body -ContentType 'application/json' | Out-Null
    } catch {

        Write-Error (Get-Date) ": Update to Slack went wrong..."

        Invoke-WebRequest -Method Post -Uri $Url -Body $body
    }

failsendmail

Bilgisayarınızda, başlat butonuna basarak Windows PowerShell ISE'yi yönetici olarak çalıştırın.

Açılan pencerede aşağıdaki kopyalayın ve ilgili belirtilen alanları kendi yapınıza göre değiştirin. Betiği çalıştırın ve size e-mail geldiğini doğrulayın. Eğer her şey yolunda ise dosya adını failsendmail.ps1 olarak kayıt ediniz. 

  • SMTPUsername: Gmail hesap adını giriniz.
  • SMTPPassword: Gmail için uygulama parolanızı giriniz. (Kılavuz üzerinden nasıl yapılacağına bakabilirsiniz.)
  • EmailFrom: Gmail hesap adını giriniz.
  • EmailTo: Mail alacak hesapları giriniz.
  • EmailBody: Mail içi gövde başlığı.
  • EmailBody: Robocopy log dosyası içeriğini mail içine yazdırmak için log dosyasının yolunu giriniz.
  • uriSlack = "Slack Web Hook URL adresini giriniz."
  • pretext = "Konu Başlığı Giriniz."
  • text = “Konu içeriği yazınız.”
     
# Email parameters
$SMTPServer = "smtp.gmail.com"
$SMTPPort = 587
$SMTPUsername = "x@gmail.com"
$SMTPPassword = "towl aeqg kuyx kxrb"
$EmailFrom = "x@gmail.com"
$EmailTo = "x@hotmail.com", "y@gmail.com"
$EmailSubject = "Mehmet_Backup - İŞLEM BAŞARISIZ! - Result: ERRORS"
$EmailBody = "Mehmet_Backup profilinin yedek alma işlemi alınamamıştır! lütfen Log kayıtlarını kontrol ediniz. Log kayıtları ektedir. `n"
$EmailBody += Get-Content "B:\robocopy.log"  | Out-String

# Attachment file paths
#$Attachment1 = "B:\robocopy.log"
# eğer birden fazla mail eki gönderimi olacaksa bu kod eklenecek Ör. "$Attachment2 = "C:\robocopy\log\test_v1.log""

# Create a new mail message
$MailMessage = New-Object System.Net.Mail.MailMessage
$MailMessage.From = $EmailFrom
foreach ($recipient in $EmailTo) {
    $MailMessage.To.Add($recipient)
}
$MailMessage.Subject = $EmailSubject
$MailMessage.Body = $EmailBody

# Attach files to the mail message
$AttachmentFiles = $Attachment1 # Birden fazla olduğunda bu kısımı yanına eklemeyi unutma Ör. ",$Attachment2"
foreach ($AttachmentFile in $AttachmentFiles) {
    $Attachment = New-Object System.Net.Mail.Attachment($AttachmentFile)
    $MailMessage.Attachments.Add($Attachment)
}

# Create a new SMTP client and send the mail message
$SMTPClient = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($SMTPUsername, $SMTPPassword)
$SMTPClient.Send($MailMessage)

# Dispose of the attachment objects
foreach ($Attachment in $MailMessage.Attachments) {
    $Attachment.Dispose()
}

 # SlackWebhook URL bilgilerini giriniz.

    $uriSlack = "https://hooks.slack.com/services/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75"
    $body = ConvertTo-Json @{
        pretext = "Database Backup"
        text = "Veritabanı Yedeklerı Alınamadı."
        color = "#142954"
    }

    try {
        Invoke-RestMethod -uri $uriSlack -Method Post -body $body -ContentType 'application/json' | Out-Null
    } catch {

        Write-Error (Get-Date) ": Update to Slack went wrong..."

        Invoke-WebRequest -Method Post -Uri $Url -Body $body
    }

Robocopy Batch File

Aşağıdaki alanları güncelleyiniz ve dosya adını robocopy.bat olarak kayıt ediniz.

  • İlk sıradaki robocopy ile başlayan satırda kaynak ve hedef yollarını belirtin. Aynı satırın sonuna, powershell betiğinde belirttiğiniz log dosyasının oluşacağı yolu yazın.
  • REM EMAIL FAILURE ve SUCCESS yazan kısımlara robocopy  ile başlayan satırda kaynak ve hedef yollarını belirtin.
  • PowerShell.exe ile başlayan en sondaki satırlara hata ve başarı için oluşturulan powershell betiklerin yolunu gösterin.

Opsiyonel: Eğer sadece hata mesajlarını almak istiyorsanız, succesmailsend.ps1 dosyasının $EmailTo kısmını boş bırakın.

Robocopy parametrelerini kendi yapınıza göre düzenlemeyi unutmayın. Robocopy hakkında daha fazla bilgi almak için diğer kılavuzlara bakınız.

@echo off
ECHO " Otomatik koplayama basliyor lutfen bekleyiniz. . ."

robocopy A:\source\ B:\destination\ /e /XO /R:3 /W:5 /TBD /MIR /ETA /TEE /XA:SH /V /NP /NFL /MT:64 /log:"B:\robocopy.log"

if %ERRORLEVEL% EQU 16 echo ***FATAL ERROR*** & goto end2
if %ERRORLEVEL% EQU 15 echo OKCOPY + FAIL + MISMATCHES + XTRA & goto end2
if %ERRORLEVEL% EQU 14 echo FAIL + MISMATCHES + XTRA & goto end2
if %ERRORLEVEL% EQU 13 echo OKCOPY + FAIL + MISMATCHES & goto end2
if %ERRORLEVEL% EQU 12 echo FAIL + MISMATCHES & goto end2
if %ERRORLEVEL% EQU 11 echo OKCOPY + FAIL + XTRA & goto end2
if %ERRORLEVEL% EQU 10 echo FAIL + XTRA & goto end2
if %ERRORLEVEL% EQU 9 echo OKCOPY + FAIL & goto end2
if %ERRORLEVEL% EQU 8 echo FAIL & goto end2
if %ERRORLEVEL% EQU 7 echo OKCOPY + MISMATCHES + XTRA & goto end2
if %ERRORLEVEL% EQU 6 echo MISMATCHES + XTRA & goto end2
if %ERRORLEVEL% EQU 5 echo OKCOPY + MISMATCHES & goto end2
if %ERRORLEVEL% EQU 4 echo MISMATCHES & goto end2
if %ERRORLEVEL% EQU 3 echo OKCOPY + XTRA & goto success2
if %ERRORLEVEL% EQU 2 echo XTRA & goto success2
if %ERRORLEVEL% EQU 1 echo OKCOPY & goto success2
if %ERRORLEVEL% EQU 0 echo No Change & goto success2

:end2

REM EMAIL FAILURE FOR A:\source\ B:\destination\

PowerShell.exe -ExecutionPolicy Bypass -File "C:\robocopy\failsendmail.ps1"

exit

:success2

REM EMAIL SUCCESS FOR A:\source\ B:\destination\

PowerShell.exe -ExecutionPolicy Bypass -File "C:\robocopy\succesmailsend.ps1"

İşlemin başarılı olduğunu kontrol etmek için, robocopy.bat dosyasını çalıştırın. Dosyaların kopyalandığı ve maili kontrol edin. Eğer her şey istediğiniz gibiyse, robocopy.bat batch file dosyasını Windows üzerinde Task Scheduler ekleyerek bu işlemleri düzenli olarak yaptırabilirsiniz.

Task Scheduler hakkında daha fazla bilgi almak için diğer kılavuzlara bakınız.

Blog'a Dön