none
Tratar errores en envío de email con Send-MailMessage RRS feed

  • Pregunta

  • Hola

    Primero que todo quiero decirles que mis conocimientos de PowerShell son nulos solo he escrito unas pocas líneas usando ejemplos en Internet.

    Comparto el código de más abajo con el cual logro enviar correos de forma automática mediante una tarea de Windows pero no tengo idea de como capturar errores para tratarlos. Pienso en primera instancia en errores de conexión con el servidor SMTP o tal vez también errores en los buzones de los destinatarios, me bastaría con "manejar" los primeros, ¿ por favor alguna idea de como puedo hacerlo ?. Muchas gracias de antemano y saludos.

    function Exec-Sproc{
     param($Conn, $Sproc)
     $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
     $SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure
     $SqlCmd.Connection = $Conn
     $SqlCmd.CommandText = $Sproc
     $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($SqlCmd)
     $DataSet = New-Object System.Data.DataSet
     [Void] $SqlAdapter.Fill($DataSet)
     $SqlConnection.Close()
     return $DataSet.Tables[0]
    }
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Data Source=SERVIDOR,1433;Initial Catalog=BBDDsSQL;User Id=Yo; Password=Micontraseña;"
    $Res = Exec-Sproc -Conn $SqlConnection -Sproc "SP_MIO"

    foreach ($Row in $Res)
    {
        $From = "remitente@dominio.com"
        $To = $($Row.email)
        $Subject = $($Row.asunto)
        $Body = $($Row.htmlcorreo)
        $SMTPServer = "smtp.dominio.com"
        $SMTPPort = "25"
        $password = Get-Content C:\Users\Admin\credenciales.txt | ConvertTo-SecureString
        $credential = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList "remitente@dominio.com",$password
        Send-MailMessage -From $From -to $To -Subject $Subject -Body $Body -SmtpServer $SMTPServer -port $SMTPPort -Credential $credential
        Start-Sleep 5
    }

    miércoles, 5 de septiembre de 2018 7:26

Respuestas

  • Buenos dias Raimundo,

    Para gestionar los errores podrías utilizar try-catch-finally.

    Tu código va dentro del try, y si se produce algún error entra automáticamente en el catch. El bloque finally no es obligatorio

    Por ejemplo:

    try
    {
    #	tu código con todo lo que quieres ejecutar
    	...
    	Send-MailMessage -From $From -to $To -Subject $Subject -Body $Body -SmtpServer $SMTPServer -port $SMTPPort -Credential $credential
    }
    catch
    {
    #	lo que quieres que ocurra cuando hay un error
    	$ErrorMessage = $_.Exception.Message
    	#Salida por pantalla, escritura en fichero, envío de un mail avisando, etc...
    	Write-Host -ForegroundColor DarkRed "Se ha producido un error: $ErrorMessage"
    }
    finally
    {
    	#bloque opcional
    	#lo que pongas aquí se ejecutará SIEMPRE, tengas o no error.
    }

    Espero que te sirva.

    Un saludo,

    Diego.

    • Propuesto como respuesta Jebisata miércoles, 5 de septiembre de 2018 8:12
    • Marcado como respuesta Raimundo Ferrer viernes, 21 de septiembre de 2018 10:36
    miércoles, 5 de septiembre de 2018 8:10
  • Suscribo lo que dice Diego,

    Si quieres ir un poco más allá, puedes crearte un log:

    # Archivo de log
    $Logfile = ".\Logs\Errores.log"
    
    # Funcion de log
    Function LogWrite
    {
       Param ([string]$logstring)
    
       Add-content $Logfile -value $logstring
    }
    
    
    # El mensaje para el log debe ir en el catch
    try
    {
    
      #Código a ejecutar
    
    }
    catch
    {
      #Capturamos el mensaje de error
      $ErrorMessage = $_.Exception.Message
      
      #Llamamos al a función de log para que inserte el mensaje de error
      Logwrite $ErrorMessage
    
    }
    


    • Editado Jebisata miércoles, 5 de septiembre de 2018 8:22
    • Marcado como respuesta Raimundo Ferrer viernes, 21 de septiembre de 2018 10:36
    miércoles, 5 de septiembre de 2018 8:22

Todas las respuestas

  • Buenos dias Raimundo,

    Para gestionar los errores podrías utilizar try-catch-finally.

    Tu código va dentro del try, y si se produce algún error entra automáticamente en el catch. El bloque finally no es obligatorio

    Por ejemplo:

    try
    {
    #	tu código con todo lo que quieres ejecutar
    	...
    	Send-MailMessage -From $From -to $To -Subject $Subject -Body $Body -SmtpServer $SMTPServer -port $SMTPPort -Credential $credential
    }
    catch
    {
    #	lo que quieres que ocurra cuando hay un error
    	$ErrorMessage = $_.Exception.Message
    	#Salida por pantalla, escritura en fichero, envío de un mail avisando, etc...
    	Write-Host -ForegroundColor DarkRed "Se ha producido un error: $ErrorMessage"
    }
    finally
    {
    	#bloque opcional
    	#lo que pongas aquí se ejecutará SIEMPRE, tengas o no error.
    }

    Espero que te sirva.

    Un saludo,

    Diego.

    • Propuesto como respuesta Jebisata miércoles, 5 de septiembre de 2018 8:12
    • Marcado como respuesta Raimundo Ferrer viernes, 21 de septiembre de 2018 10:36
    miércoles, 5 de septiembre de 2018 8:10
  • Suscribo lo que dice Diego,

    Si quieres ir un poco más allá, puedes crearte un log:

    # Archivo de log
    $Logfile = ".\Logs\Errores.log"
    
    # Funcion de log
    Function LogWrite
    {
       Param ([string]$logstring)
    
       Add-content $Logfile -value $logstring
    }
    
    
    # El mensaje para el log debe ir en el catch
    try
    {
    
      #Código a ejecutar
    
    }
    catch
    {
      #Capturamos el mensaje de error
      $ErrorMessage = $_.Exception.Message
      
      #Llamamos al a función de log para que inserte el mensaje de error
      Logwrite $ErrorMessage
    
    }
    


    • Editado Jebisata miércoles, 5 de septiembre de 2018 8:22
    • Marcado como respuesta Raimundo Ferrer viernes, 21 de septiembre de 2018 10:36
    miércoles, 5 de septiembre de 2018 8:22