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

Vue hybride

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    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 éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    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
    Billets dans le blog
    1
    Par défaut
    Salut,
    dans la boucle tu recrées le fichier à chaque itération.

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    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
    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
    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 éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    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.

+ 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