IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Créer une chaîne de caractères pour envoyer un mail à tous les destinataires d'une requête SQL [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut Créer une chaîne de caractères pour envoyer un mail à tous les destinataires d'une requête SQL
    Bonjour.
    J'ai quelques difficultés avec PowerShell.
    J'ai fait un script qui interroge une base de données.
    Renvoie les adresse mails contenues dans une table.
    Envoie un mail à un résultat choisi du dataset.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    # Force le type d'execution
    Set-ExecutionPolicy Unrestricted
    
    Import-Module sqlps
    
    
    $file = 'C:\MonRep\logShell.txt' 
    
    $color = "#009900"
    $Conn = new-object system.data.sqlclient.sqlconnection
    $Conn.connectionstring = "Monserveur"
    $Conn.Open()
    
    # On interroge une vue système de SQL Server 2005
    $Requete = "SELECT mail FROM MaTable"
    
    $cmd = New-object system.data.sqlclient.SqlCommand
    $cmd.connection = $conn
    $cmd.commandtext = $Requete
    
      # Exécute la requête et retourne le nombre de lignes
    $cmd.Executenonquery()
    
    $DataAdapter = new-object System.Data.SqlClient.SQLDataAdapter($cmd)
    $DataSet = new-object System.Data.DataSet
    $DataAdapter.Fill($DataSet)
    
    
    	$emailSmtpServer = "serveur de messagerie"
    	$emailSmtpServerPort = "25"	 
    	$emailFrom =  "expediteur"
    	$emailTo = $dataset.tables[0].rows[0]["mail"] 
    	
    	
    	$emailMessage = New-Object System.Net.Mail.MailMessage($emailFrom , $emailTo)
    	
    	$emailMessage.Subject = "Test"
    	$emailMessage.Priority = "Normal"
    	
    
    	
    	$emailMessage.Body = "Bonjour"
    
    	$SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort )
    	$SMTPclient.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
    	 
    	$SMTPClient.Send( $emailMessage ) > $file
    
    # On libére la connexion, etc.
    
    $Conn.Close() 
    read-host 'Pause !'
    Mais je souhaiterai faire une concaténation de tous les mails contenus dans le dataset, logguer cette concaténation et envoyer un mail à tous les destinataires, et là, grand moment de solitude.
    J'ai essayé pas mal de truc donc ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $emailTo = $DataSet.Tables[0].Rows[0][0]
     for ($i=0;$i -le $dataset.tables[0].rows.count;$i++)
     {
       $emailto = $emailto + "," + $dataset.tables[0].rows[i]["mail"] > $logfile
     }
    Write-Host $emailto
    Mail la par contre plus rien ne fonctionne...
    Merci de votre aide.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    Oups, c'est uniquement l'écriture dans le ficher de log qui ne fonctionne pas.
    Pour le reste, j'ai oublié un "$".

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    dans la boucle tu recrées le fichier à chaque itération.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    Merci de ton aide.
    Faut t-il faire un tostring avant.
    Mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $emailto = $emailto + "," + $Dataset.tables[0].rows[$i]["mail"] > $file
    ne renvoie rien dans les logs.

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 69Pierre Voir le message
    Faut t-il faire un tostring avant.
    Sur le Dataset, je ne pense pas, mais je n'ai pas de test sous la main pour confirmer.

    Citation Envoyé par 69Pierre Voir le message
    Mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $emailto = $emailto + "," + $Dataset.tables[0].rows[$i]["mail"] > $file
    ne renvoie rien dans les logs.
    Normal, et je ne l'ai pas vu hier soir, l'affectation dans $Emailto ne renvoi rien dans le pipeline, la syntaxe suivante permet d'affecter une valeur ET de renvoyer la valeur affectée :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $i=10 # affectation
    ($i=10) # affectation ET émission de 10 dans le pipe
    Mais la construction de ta liste est à revoir je pense. par exemple la tracer une fois construite.

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Avec les versions récentes de PS tu peux écrire ceci :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     $ofs=','
    [string[]]$List=($DS.tables[1].rows).Email
     
     #transforme un tableau de string en une chaine, 
     #ici on utilise le séparateur $OFS
     #comportement différent de la méthode ToString()
    "$list"
    #User1@T.com,User2@T.com
     
     #la même chose sans la liste intermédiaire
     #renvoi une chaine
    "$(($DS.tables[1].rows).Email)"
    #User1@T.com,User2@T.com
    un exemple :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #https://blog.netnerds.net/2015/02/working-with-basic-net-datasets-in-powershell/
    $dt = New-Object System.Data.Datatable
    [void]$dt.Columns.Add("First")
    [void]$dt.Columns.Add("Second")
    [void]$dt.Columns.Add("Third")
     
    $dt.TableName = "Me"
    $ds = New-Object System.Data.DataSet
    $ds.Tables.Add($dt)
     
    $dt2 = New-Object System.Data.Datatable "AnotherTable"
    [void]$dt2.Columns.Add("Age")
    [void]$dt2.Columns.Add("Email")
    [void]$dt2.Rows.Add(10,"User1@T.com")
    [void]$dt2.Rows.Add(20,"User2@T.com")
    $ds.Tables.Add($dt2)
     
    $ofs=','
    [string[]]$List=($DS.tables[1].rows).Email
    "$list"
     
    "$(($DS.tables[1].rows).Email)"

  7. #7
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut


    Citation Envoyé par Laurent Dardenne Voir le message
    Sur le Dataset, je ne pense pas, mais je n'ai pas de test sous la main pour confirmer.


    Normal, et je ne l'ai pas vu hier soir, l'affectation dans $Emailto ne renvoi rien dans le pipeline, la syntaxe suivante permet d'affecter une valeur ET de renvoyer la valeur affectée :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $i=10 # affectation
    ($i=10) # affectation ET émission de 10 dans le pipe
    Mais la construction de ta liste est à revoir je pense. par exemple la tracer une fois construite.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Avec les versions récentes de PS tu peux écrire ceci :
    Je ne suis pas sûr d'avoir une version récente.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    Pour le format de date, il me fallait JJ/MM/AAAA, du coup c'est réglé.
    Il ne me reste plus qu'à mettre une partie du mail en gras (je n'ai pas encore trouvé comment) et c'est réglé.
    Merci beaucoup.

    Et problème d'encodage.
    Sous windows 7, culture france et version :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    PS C:\Users\adm-rva> $PsVersionTable
    
    Name                           Value
    ----                           -----
    PSVersion                      5.0.10586.117
    PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
    BuildVersion                   10.0.10586.117
    CLRVersion                     4.0.30319.42000
    WSManStackVersion              3.0
    PSRemotingProtocolVersion      2.3
    SerializationVersion           1.1.0.1
    PS : J'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $OutputEncoding = New-Object -typename System.Text.UTF8Encoding
    en début de code mais mails partent toujours avec un mauvais encodagen je n'ai pas compris comment utiliser ce nouvel objet encodage.

  10. #10
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 69Pierre Voir le message
    Je ne suis pas sûr d'avoir une version récente.
    Si la v5.0, l'itération automatique sur une collection fonctionne depuis la version 3 de PS

    Citation Envoyé par 69Pierre Voir le message
    Et problème d'encodage.
    Regarde à la source si tes données sont dans le format attendu

  11. #11
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Teste hors de ton script si ceci fonctionne :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $encoding=[System.Text.Encoding]::UTF8
    Send-MailMessage -to "<adresse@email>" -from "<adresse@email>" -Subject "Test de Mail accentuée" -body "Ceci est un test système d'envoi accentué." -Encoding $encoding

  12. #12
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    Oui, ça ça marche nickel.

    Pour mon format de données, c'est issu d'une requête T-SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    CAST(CAST(date_debut_message AS DATE)AS NVARCHAR(10)) as jour
    ...

  13. #13
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 69Pierre Voir le message
    Pour mon format de données, c'est issu d'une requête T-SQL :
    Je me doute , les données renvoyées par cette requête sont-elle accentuées correctement dans PS ?

  14. #14
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    J'en ai aussi des directement créées dans PS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $emailMessage.Subject = "Actualités"

  15. #15
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    Bonjour.
    Ce que je ne comprends pas, c'est comment utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $OutputEncoding = New-Object -typename System.Text.UTF8Encoding
    $encoding=[System.Text.Encoding]::UTF8
    avec mon objet $emailMessage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sujet = "Actualités"
    $emailMessage = New-Object System.Net.Mail.MailMessage($emailFrom , $emailTo)
    $emailMessage.Subject = $sujet
    pour gérer cet accent que j'ai dans le code powershell.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/12/2017, 11h45
  2. Réponses: 4
    Dernier message: 30/11/2011, 22h31
  3. Effacer les espaces dans une chaîne de caractères
    Par JohnnyWalk dans le forum Débuter avec Java
    Réponses: 16
    Dernier message: 19/07/2007, 14h13
  4. [TestStand] Compter les éléments d'une chaîne de caractères
    Par capblans dans le forum Autres langages
    Réponses: 2
    Dernier message: 29/04/2005, 09h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo