none
Envoi d'un mail avec Send-MailMessage RRS feed

  • Question

  • Bonjour,

    J'essaye un petit script pour m'envoyer un message sur mon serveur Windows Server 2012. Il est tout simple le voici:

    $Message = Get-Process |     
    
      Sort-Object CPU -Descending |    
    
       Select-Object -First 10 -Property @{Label = "Nom" ; Expression = {$_.Name}},
    
                                         @{Label = "ID"  ; Expression = {$_.ID}},
    
                                         @{Label = "CPU" ; Expression ={($_.CPU).ToString("#.##")}}
    
    # Ici je transforme la variable en html mais comme fragment
    $Message = $Message | ConvertTo-Html -Fragment
    # Ici je définis une feuille de style interne ... pour que cela soit zoli
    $Head = @"
    <style>
      body {font-family: "Arial";font-size: 8pt;color: #4C607B}
      th, td {border: 1px solid #e57300;border-collapse: collapse;padding: 5px}
      th {font-size: 1.2em;text-align: left;background-color: #003366;color: #ffffff}
      td {color: #000000}
      .even { background-color: #ffffff}
      .odd { background-color: #bfbfbf}
    </style>
    "@
    # corps du mail
    $Body = @"
    <html>
         <body>
            <p>Bonjour,<br />
               Voici le resultat de Get-Process<br />
               <p>$Message</p>
            </p>
          </body>
    </html>
    "@
    
    $FinalMail = ConvertTo-HTML -Head $Head -Body $Body -PostContent "Mail généré le : $(Get-Date -Format "dddd dd-MM-yyyy à hh:mm:ss")"
    
    $MailParams =@{
        smtpServer = "toto.smtp.fr"
        from = "aa@aa.fr"
        to = "bb@bb.fr"
        subject = "TEST"
        body = $FinalMail
        BodyAsHTML = $true
        }
    # Ca c'était juste pour voir le résultat
    $FinalMail | Out-File 'C:\LOGON-SCRIPT$\Filtrage des Ordinateurs Inactifs\a.htm'
    ii 'C:\LOGON-SCRIPT$\Filtrage des Ordinateurs Inactifs\a.htm'
    
    # et l'envoi par mail qui utilise le splat
    Send-MailMessage @MailParams

    La génération du HTM c'est ok par contre j'ai une erreur pour l'envoi du mail:

    Send-MailMessage : Impossible de convertir «System.Object[]» en type «
    System.String», requis par le paramètre «Body». La méthode spécifiée n'est pas
    prise en charge.
    Au caractère C:\LOGON-SCRIPT$\Filtrage des Ordinateurs Inactifs\test.ps1:51 :
    18
    + Send-MailMessage @MailParams
    +                  ~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument : (:) [Send-MailMessage], Parame
       terBindingException
        + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Comma
       nds.SendMailMessage

    lundi 29 mars 2021 09:25

Réponses

  • Je me répond moi-même, ConvertTo-HTML génère un objet et non un string. Il suffit d'ajouter un | Out-String pour le transformer en String:

    $Message = Get-Process |     
    
      Sort-Object CPU -Descending |    
    
       Select-Object -First 10 -Property @{Label = "Nom" ; Expression = {$_.Name}},
    
                                         @{Label = "ID"  ; Expression = {$_.ID}},
    
                                         @{Label = "CPU" ; Expression ={($_.CPU).ToString("#.##")}}
    
    # Ici je transforme la variable en html mais comme fragment
    $Message = $Message | ConvertTo-Html -Fragment
    # Ici je définis une feuille de style interne ... pour que cela soit zoli
    $Head = @"
    <style>
      body {font-family: "Arial";font-size: 8pt;color: #4C607B}
      th, td {border: 1px solid #e57300;border-collapse: collapse;padding: 5px}
      th {font-size: 1.2em;text-align: left;background-color: #003366;color: #ffffff}
      td {color: #000000}
      .even { background-color: #ffffff}
      .odd { background-color: #bfbfbf}
    </style>
    "@
    # corps du mail
    $Body = @"
    <html>
         <body>
            <p>Bonjour,<br />
               Voici le resultat de Get-Process<br />
               <p>$Message</p>
            </p>
          </body>
    </html>
    "@
    
    $FinalMail = ConvertTo-HTML -Head $Head -Body $Body -PostContent "Mail généré le : $(Get-Date -Format "dddd dd-MM-yyyy à hh:mm:ss")" | Out-String
    
    $MailParams =@{
        smtpServer = "toto.smtp.fr"
        from = "aa@aa.fr"
        to = "bb@bb.fr"
        subject = "TEST"
        body = $FinalMail
        BodyAsHTML = $true
        }
    # Ca c'était juste pour voir le résultat
    $FinalMail | Out-File 'C:\LOGON-SCRIPT$\Filtrage des Ordinateurs Inactifs\a.htm'
    ii 'C:\LOGON-SCRIPT$\Filtrage des Ordinateurs Inactifs\a.htm'
    
    # et l'envoi par mail qui utilise le splat
    Send-MailMessage @MailParams

    • Marqué comme réponse Inrepublica mardi 30 mars 2021 15:35
    mardi 30 mars 2021 15:35