Envoyer des emails avec pieces jointes en exécutant blat

0/5 (3 avis)

Vue 10 337 fois - Téléchargée 796 fois

Description

Ce logiciel permet d'envoyer un email en exécutant blat avec en pièces jointes tous les fichiers d'un dossier. On peut mettre une ou plusieurs adresses mail en argument ou dans un fichier ini.
Une fois transmis les fichiers peuvent être archivés.
Le prog peut se refermer automatiquement ou rester ouvert

Source / Exemple :


Imports System.Object
Imports System.Runtime.InteropServices.Marshal
Imports System.IO
Imports System

Public Class sendmails
    Public blat_instructions$
    Public blat_to$
    Public dossier_temp$
    Public dossier_archives$
    Public chemin_courrant$
    Public fermetureauto$
    Public liste_attachements$
    Public archivage$

    Private Declare Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedBuffer As IntPtr, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
    Public argument As String

    'Retourne la valeur de la clé "Cle" de la section "Section" du fichier "File"
    Public Function GetCle(ByVal File As String, ByVal Section As String, ByVal Cle As String) As String
        Dim PtrCh As IntPtr
        Dim Lng As Integer
        Dim Chaine As String
        PtrCh = StringToHGlobalAnsi(New String(vbNullChar, 1024))
        Lng = GetPrivateProfileString(Section, Cle, "", PtrCh, 255, File)
        Chaine = PtrToStringAnsi(PtrCh, Lng)
        FreeHGlobal(PtrCh)
        GetCle = Chaine
    End Function

    Private Sub sendmails_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim dirInfo As DirectoryInfo
        Dim arguments As [String]() = Environment.GetCommandLineArgs()
        chemin_courrant$ = Application.StartupPath

        'récupérer l'argument
        If arguments.Length > 1 Then argument = arguments(1)
        If argument = "" Then
            argument = "DEFAULT"
            blat_to = GetCle(chemin_courrant$ + "\sendmails.ini", argument, "to")
        Else
            blat_to = argument
        End If

        'lecture du fichier ini
        fermetureauto = GetCle(chemin_courrant$ + "\sendmails.ini", "DEFAULT", "fermetureauto")
        archivage = GetCle(chemin_courrant$ + "\sendmails.ini", "DEFAULT", "archivage")
        blat_instructions = GetCle(chemin_courrant$ + "\sendmails.ini", "BLAT", "instructions")
        dossier_temp = GetCle(chemin_courrant$ + "\sendmails.ini", "DOSSIERS", "temp")
        dossier_archives = GetCle(chemin_courrant$ + "\sendmails.ini", "DOSSIERS", "archives")

        Dim Liste_fichiers As String() = Directory.GetFileSystemEntries(dossier_temp$)
        Dim Entree As String
        Dim monStreamWriter1 As StreamWriter = New StreamWriter(chemin_courrant + "\sendmails.log", True, System.Text.Encoding.UTF8)
        Dim monStreamWriter2 As StreamWriter = New StreamWriter(chemin_courrant + "\attach.txt", True, System.Text.Encoding.UTF8)

        'lecture du dossier temporaire et création de la liste des piéces jointes 
        For Each Entree In Liste_fichiers 'Pour chaque entrée de la liste  
            If File.Exists(Entree) Then     'Si c'est un fichier  
                liste_attachements = liste_attachements + "," + Entree
            End If
        Next (Entree)
        'écriture de la liste dasn sun fichier texte
        monStreamWriter2.WriteLine(liste_attachements)
        monStreamWriter2.Close()

        ListBox1.Items.Add(argument)
        If liste_attachements <> "" Then ListBox1.Items.Add(liste_attachements)
        ListBox1.Items.Add(blat_instructions + " -to " + blat_to + " -af " + chemin_courrant + "\attach.txt")

        'exécution de blat
        Shell(blat_instructions + " -to " + blat_to + " -af " + chemin_courrant + "\attach.txt", AppWinStyle.NormalFocus, True, -1)

        If archivage = "Oui" Then 'si archivage = oui, création des dossiers si nécessaire et déplacement des fichiers
            dirInfo = New DirectoryInfo(dossier_archives + "\" + Str(Now.Year))
            If dirInfo.Exists Then 'le dossier année existe't'il ?
                dirInfo = New DirectoryInfo(dossier_archives + "\" + Str(Now.Year) + "\" + Str(Now.Month))
                If dirInfo.Exists = False Then Directory.CreateDirectory(dossier_archives + "\" + Str(Now.Year) + "\" + Str(Now.Month)) 'si le dossier mois n'existe pas, le creer
            Else
                Directory.CreateDirectory(dossier_archives + "\" + Str(Now.Year)) 'creer le dossier année
                Directory.CreateDirectory(dossier_archives + "\" + Str(Now.Year) + "\" + Str(Now.Month)) 'ceer le dossier mois
            End If

            dossier_archives = dossier_archives + "\" + Str(Now.Year) + "\" + Str(Now.Month)
            For Each Entree In Liste_fichiers 'Pour chaque entrée de la liste  
                Dim TmpName As String = Microsoft.VisualBasic.Mid(Entree, Len(dossier_temp$) + 1)
                TmpName = Replace(TmpName, "'\'", "") 'récupérer le nom du fichier
                If File.Exists(Entree) Then     'Si c'est un fichier  
                    File.Move(Entree, dossier_archives + TmpName) ' le déplace dans le dossier archives
                End If
            Next (Entree)
        Else
            For Each Entree In Liste_fichiers 'Pour chaque entrée de la liste  
                Dim TmpName As String = Microsoft.VisualBasic.Mid(Entree, Len(dossier_temp$) + 1)
                TmpName = Replace(TmpName, "'\'", "") 'récupérer le nom du fichier
                If File.Exists(Entree) Then     'Si c'est un fichier  
                    File.Delete(dossier_archives + TmpName) ' le déplace dans le dossier archives
                End If
            Next (Entree)

        End If

        'Ecriture du texte dans le fichier log
        monStreamWriter1.WriteLine(Now)
        monStreamWriter1.WriteLine("argument :" & argument)
        monStreamWriter1.WriteLine("Pieces jointes :" & liste_attachements)
        monStreamWriter1.WriteLine(blat_instructions + " -to " + blat_to + " -af " + chemin_courrant + "\attach.txt")
        'Fermeture du StreamWriter
        monStreamWriter1.Close()

        'suppression du fichier liste des pieces jointes
        File.Delete(chemin_courrant + "\attach.txt")

        If fermetureauto = "Oui" Then End
    End Sub

    Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

    End Sub
End Class

Conclusion :


Dans le zip on trouve la source, blat et les doc(word) html
décompresser le zip sur d: renseigner le fichier ini, mettre un petit fichier dans le dossier temp et executer sendmails.exe

Codes Sources

A voir également

Ajouter un commentaire Commentaires
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
3 févr. 2010 à 08:13
Ok ok,

Sinon il y plus simple pour envoyer des mails, .Net l'implémente déja.
Il faut importer "Imports System.Net.Mail" et puis celà doit suffir :

Dim MonSMTP As New SmtpClient("ServeurDeMail")
MonSMTP.Send("moi@domaine.fr", "lui@domaine.fr", "Sujet", "Mon message")

Sinon l'INI pourquoi pas, mais bon le XML étant à la mode, pourquoi ne pas s'y mettre :-)

Pour débuter ce cours est pas mal : http://plasserre.developpez.com/cours/vb-net/

Bon code ...
cs_mays Messages postés 15 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 24 septembre 2014
2 févr. 2010 à 21:39
Salut
Blat est un petit prog qui permet d'envoyer des emails en lignes de commandes

Je reconnais que j'ai surtout fait du VB6 et que pour le .Net pour l'instant je récupère des fonctions à droite à gauche suivant ce dont j'ai besoin.
J'ai utilisé un point ini car les collègues qui utilisent le prog et qui n'ont pas l'habitude du xml sont plus à l'aise avec un fichier ini.

Je prend note de tes remarques, je vais essayé de prendre le temps de le corriger et mieux faire la prochaine fois.
@+
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
2 févr. 2010 à 08:25
Au premier coup d’oeil je dirais que tu as fait beaucoup de VB avant de faire du .Net !

Alors déjà c’est quoi Blat ? :-s

Sinon çà je ne pense pas que çà serve à grand-chose "Imports System.Object", Object est une classe et non un espace de nom


Je vois également que tu as utilisé un gros bloc de variable déclaré en Public.
En fait ta classe n’est pas une classe, il n’y a pas de constructeur, aucun passage de paramètre, çà ressemble plus à un module.
Tu devrais regarder des articles sur la POO, il y en a pas mal sur la toile.

De plus tes declarations comme "Public dossier_archives$" serai un peu mieux comme çà : "Public dossier_archives as String"

Sinon pas obligatoire mais tu peux faire plus court si tu veux :
Dim monStreamWriter1 As StreamWriter = New StreamWriter( ...
Dim monStreamWriter1 As New StreamWriter( ...

Tu fais un monStreamWriterX.Close, mais n’oublie pas pour des soucis d’optimisation de faire un monStreamWriterX.Dispose (ou utilise un bloc Using...End Using) pour libérer l’objet

Shell ... arf, çà existe encore çà ? Regarde si tu ne peux pas utiliser la Class Process.

Fais gaffe à çà : dossier_archives + "" + ...
Si tu te trouve dans la racine du disque (ex : C:\), le "" va être doublé !

fermetureauto = "Oui" -> un boolean ne serait pas mieux ?

Après essai pour ton fichier de config de passer dans un autre format comme le XML, puisqu’a ma connaissance Microsoft ne veut plus maintenir le .INI (pas de classe présente dans .Net)


Public Function GetCle(
[code]
GetCle = Chaine
End Function
Stop, en .Net on retourne le résultat d’une fonction avec Return et non le nom de la fonction.

Là t’a laissé trainé çà :
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

Ca ne sert à rien, et de plus ta classe n’hérite pas de Windows.Form !? ( = Ce n'est pas un formulaire)
Comment tu as pu créer une listbox la dessus ?


Dim TmpName As String = Microsoft.VisualBasic.Mid(Entree, Len(dossier_temp$) + 1)
TmpName = Replace(TmpName, "'\'", "") 'récupérer le nom du fichier

-> Là aussi essai de te documenter sur la Class String (String.SubString(), String.Replace(), etc..)


Allé corrige nous tous çà ... et mets toi à l'objet, tu verra c'est super sympa ;-)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.