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

Macros et VBA Excel Discussion :

Exporter une facture en PDF et l'envoyer directement par mail sans outlook.


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2024
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2024
    Messages : 8
    Par défaut Exporter une facture en PDF et l'envoyer directement par mail sans outlook.
    Bonjour,

    J'utilise Excel 365 et comme messagerie Gmail

    Je cherche donc à exporter une facture Excel en PDF (nous en avons une centaine à faire). Celle-ci s'enregistre dans Dropbox pour etre utilisée par d'autres utilisateur. A ce jour la facture s'exporte correctement. En revanche pour l'envoyer par mail sans Outloock c'est beaucoup plus compliqué malgré différents tuto. Une personne bienveillante pour aider notre association sportive est la bienvenue.

    Concernant l'exportation de la facture Excel en PDF c'est tout bon. La facture s'enregistre avec le N° de facture + le nom du client dans un répertoire que je peux modifier

    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
     
    Sub EXPORTdaniel1_PDF()
      Dim Dossier
      Dim Chemin As String
      Dim ws As Worksheet
      Set ws = ActiveSheet
      If MsgBox(" Voulez vous exporter la facture en PDF ", vbYesNo + vbQuestion, "Confirmation….. ! ") = vbYes Then
        On Error Resume Next
            Dossier = Application.InputBox("Insérer nom du dossier", "Création du dossier", "Factures PDF")
        Chemin = ThisWorkbook.Path & "\" & Dossier & "\"
        Var = Dir(Chemin, vbDirectory)
        If Var = "" Then
          On Error GoTo 0
          ChDir ThisWorkbook.Path
     
          MkDir ThisWorkbook.Path & "\" & Dossier
        End If
          ws.ExportAsFixedFormat xlTypePDF, Chemin & Range("E5").Value & " _ " & Range("L1").Value, _
          xqualitystandard, True, False, 1, 1, False
      End If  
     
    End Sub

    Concernant l'envoi par mail, je coince bien, L'Email ne pars pas, j'ai fais un essai sans la PJ. Je ne vois pas non plus comment attacher la facture dans le mail

    J'ai coché la case " Microsoft CDO for windows 2000 " dans les références dans VBA



    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
     
    Sub mail()
    Dim mail As CDO.Message
    Set mail = New CDO.Message
    mail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    mail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    mail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
    mail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = ??
    mail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    mail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/senusername") = "mon adresse mail@gmail.com"
    mail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "Mon Mot de passe@"
    mail.Configuration.Fields.Update
     
    With mail
    .Subject = "CSD Tennis de Table – Facture"
    .From = "Mon adresse mail@gmail.com"
    .To = Sheets("Modele Facture").Range("L10").Value
    '‘.CC = « ***@*** »
    .TextBody = "Merci de recevoir votre facture relative à vos engagements. Cordialement"
    '.AddAttachement " de la pièce jointe" 
     
    End With
    On Error Resume Next
    mail.Send
    Set mail = Nothing
    End Sub

  2. #2
    Membre Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 315
    Par défaut
    Hello,

    pourquoi vouloir passer par Gmail ? Normalement en utilisant le SMTP de la connexion en cours ça ne devrait pas poser de problème, non ?
    JièL
    Membre des AMIS
    Anti Macro Inutilement Superfétatoire

  3. #3
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2024
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2024
    Messages : 8
    Par défaut
    Bonsoir,

    J'aurai préféré passé par gmail car c'est ma boite mail. Mais apparemment le CDO ne fonctionne plus. Donc je vais revoir ma copie.

    Et je ne suis pas en mesure de le faire car je n'ai pas les connaissances suffisantes.

    Merci et bonne soirée

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 208
    Par défaut
    Salut à tous.

    Si je prends l'exemple des factures de mon abonnement chez SFR, je reçois un courriel qui m'indique que j'ai reçu dans mon espace personnel la dernière facture. Je n'ai plus qu'à me rendre dans mon espace personnel pour aller la télécharger. Pour des questions de confidentialités il est mieux de procéder ainsi que d'envoyer un PDF par courriel.

    Le principale problème est que le courriel n'est pas destiné à faire des transferts de fichiers mais d'informer. De même, je ne clique jamais sur une pièce jointe si je ne connais pas l'émetteur.

    Faire des envois de masse (limité à 500 courriels par 24h chez gmail) fait que vous pouvez vous retrouver dans un blocage temporaire, quelques heures à 24H. A la longue, votre adresse email peut être marquée comme suspecte, voire considérée comme faisant du spam et donc blacklistée.

    Il arrive aussi que les courriels n'arrivent pas à destination, bloqué par le serveur du destinataire qui gère les boîtes aux lettres. Cela m'arrive assez fréquemment avec le forum developpez.

    Je veux simplement dire que votre façon de faire n'est pas la bonne.

  5. #5
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2024
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2024
    Messages : 8
    Par défaut
    Merci, j'en prends note

  6. #6
    Membre Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 315
    Par défaut
    Citation Envoyé par zaza62000 Voir le message
    J'aurai préféré passé par gmail car c'est ma boite mail. Mais apparemment le CDO ne fonctionne plus
    Je me suis mal exprimé... je voulais dire : pourquoi ne pas utiliser le serveur SMTP de la connexion ?
    J'explique : quelque soit la boite mail, le serveur smtp de la connexion actuelle (avec les bons paramètres) permet d'envoyer en utilisant n'importe quelle adresse.
    Exemple : une boite mail chez Free toto@free.fr et une connexion fibre chez SFR peut parfaitement être configurer pour envoyer des messages en utilisant le SMTP de SFR (smtp.sfr.fr par exemple, je ne connais pas le non réel) et utiliser le POP ou IMAP de Free (pop.free.fr ou imap.free.fr).
    voici les modifs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub mail()
    mail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "nom du serveur smtp de la connexion active"
    mail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = port du serveur smtp de la connexion active
    mail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/senusername") = "mon adresse mail@de la connexion active"
    mail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "Mon mot de passe de l'adresse mail de la connexion active"
    Ce qu'il manque ici c'est l'adresse de retour donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .From = "Mon adresse mail@gmail.com"
    NB : non testé
    JièL
    Membre des AMIS
    Anti Macro Inutilement Superfétatoire

  7. #7
    Membre Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 315
    Par défaut
    @Artemus24 sur la principe vous avez raison, mais SFR (ou d'autres) ont les moyens de stocker des milliers/millions de factures sur un serveur, est-ce qu'une association sportive en a les moyens ?
    JièL
    Membre des AMIS
    Anti Macro Inutilement Superfétatoire

  8. #8
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 208
    Par défaut
    @ Nain porte koi : une association sportive ne possède pas des millions de membres, mais plutôt quelques centaines au grand maximum.
    Elle a la possibilité de le faire en automatisant les factures à partir d'une base de données.
    Il suffit de cliquer sur un bouton, pour produire la facture sous forme de PDF et de la transmettre à son correspondant.
    Le stockage n'est pas un problème, il faut justement s'identifier, cliquer sur un bouton pour obtenir sa facture.
    Je ne pense pas que zaza62000 fasse les factures manuellement.

  9. #9
    Membre Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 315
    Par défaut
    Heu... Qui a dit que c'était pour facturer les membres de l'association ? 😁
    Et zaza6200 a parlé d'une centaine de facture (par mois, année ?) , mais bon, admettons, encore que vous parlez d'une limite a 500 par mois (d'où provient ce chiffre ? )
    Donc la personne reçoit un mail sans pièce jointe et doit cliquer sur un lien pour récupérer la facture.
    Question : elle est stockée où cette facture ? Sur un serveur qui n'aurait que cette fonctionnalité et serait donc payé par l'association ?
    2ème solution qui utilise, comme vous le suggérez, une base de données dans laquelle il y a toutes les factures.
    La personne reçoit un mail sans pièce jointe et doit demander (par mail ou tel) qu'on lui envoi directement sa facture ? Et la il faut une personne qui va générer la facture et lui envoyer par mail ?

    Heum
    JièL
    Membre des AMIS
    Anti Macro Inutilement Superfétatoire

  10. #10
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 208
    Par défaut
    Citation Envoyé par Nain porte koi
    Heu... Qui a dit que c'était pour facturer les membres de l'association ? ??
    Oui, en effet, j'ai lié un peu trop vite factures et membres de cette association sportive. La réponse donnée par zaza62000 :
    Citation Envoyé par zaza62000
    La facture s'enregistre avec le N° de facture + le nom du client dans un répertoire que je peux modifier.
    Et il précise bien qu'il en a une centaine à faire :
    Citation Envoyé par zaza62000
    Je cherche donc à exporter une facture Excel en PDF (nous en avons une centaine à faire). Celle-ci s'enregistre dans Dropbox pour être utilisée par d'autres utilisateur.
    Citation Envoyé par Nain porte koi
    Et zaza6200 a parlé d'une centaine de facture (par mois, année ?) , mais bon, admettons, encore que vous parlez d'une limite a 500 par mois (d'où provient ce chiffre ? )
    Voici le lien vers le site GMAIL avec ses restrictions d'usage.

    Citation Envoyé par Nain porte koi
    Question : elle est stockée où cette facture ?
    zaza62000 indique que la facture est enregistré dans un répertoire.
    Il suffit de mettre ce PDF accessible depuis leur site web, avec une identification de l'utilisateur pour qu'il puisse la récupérer.

    Citation Envoyé par Nain porte koi
    2ème solution qui utilise, comme vous le suggérez, une base de données dans laquelle il y a toutes les factures.
    Je ne vois pas trop où se trouve la difficulté.
    L'utilisateur s'identifie auprès du site web, se retrouve sur une page web où il va cliquer sur un bouton pour obtenir sa facture.
    En quoi est-ce si compliqué de procéder ainsi ? SFR le fait bien, et d'autres sites aussi.

    Citation Envoyé par Nain porte koi
    Et la il faut une personne qui va générer la facture et lui envoyer par mail ?
    Je n'ai jamais dit qu'une personne devait "générer" la facture demandée, mais de rendre cette demande automatique.
    Il faut aussi se donner les moyen de ses ambitions, non ?

    Pour revenir sur l'envoi de courriels, zaza62000 peut utiliser "PHPMAILER". C'est bien plus complet que d'utiliser la fonction mail() sous Php.

    Ce que je déclare sous php (php.ini) pour l'envoi de courriels :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [mail function]
    auth_username = prenom.nom@sfr.fr
    auth_password = mot_de_passe
     
    sendmail_from = prenom.nom@sfr.fr
    SMTP          = smtp.sfr.fr
    smtp_port     = 587
    qui est la déclaration de ma boite mail chez SFR.

    Sous Microsoft Office, je n'ai jamais fait de l'envoi de courriels de masse, donc a priori, en l'état, je ne sais pas faire.

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 746
    Par défaut
    La résolution de votre problème passe obligatoirement par une mise en conformité avec les nouvelles directives de sécurité de Google. L'ère de l'authentification simple est révolue.

    Le concept d'application moins sécurisée (LSA) désigne tout logiciel tiers qui demande uniquement un nom d'utilisateur et un mot de passe pour accéder aux données Google, sans passer par un jeton OAuth. Google a entamé la fermeture progressive de cette porte d'entrée pour réduire la surface d'attaque des comptes utilisateurs. Depuis le 30 septembre 2024, cette restriction s'est durcie pour les comptes Workspace, et la date butoir du 14 mars 2025 a marqué la fin définitive du support pour tous les types de comptes.

    https://support.google.com/a/answer/14114704?hl=en

    Cette politique vise à éliminer le risque de "Credential Stuffing" et de "Replay Attacks". Si un pirate intercepte une connexion SMTP basique, il obtient le mot de passe maître du compte, donnant accès à tout l'écosystème Google de la victime (Drive, Photos, Agenda).

    Pour permettre aux outils hérités comme notre script VBA de continuer à fonctionner sans réécrire le code pour supporter OAuth 2.0 (une tâche extrêmement complexe en VBA pur), Google propose une solution intermédiaire : le Mot de Passe d'Application (App Password).

    Il s'agit d'un code cryptographique à 16 caractères, généré aléatoirement par Google, qui remplace le mot de passe utilisateur dans la configuration SMTP.
    Ce mot de passe présente trois avantages sécuritaires majeurs par rapport au mot de passe classique :

    - Entropie Élevée : Impossible à deviner par force brute.
    - Scope Limité : Il ne donne accès qu'au protocole pour lequel il a été créé (ici, la messagerie), et non à l'ensemble du compte Google.
    - Révocabilité : En cas de compromission du script VBA, ce mot de passe peut être révoqué instantanément sans obliger l'utilisateur à changer son mot de passe principal ni à reconfigurer ses autres appareils.

    Important :
    L'activation de la Validation en Deux Étapes (2FA) est un prérequis technique absolu pour générer ce mot de passe.
    Sans 2FA, l'option "Mots de passe d'application" reste invisible dans l'interface de gestion Google.

    https://wellsr.com/vba/2020/excel/vb...il-with-gmail/

    Il est impératif de vérifier que le poste de travail de l'association peut physiquement atteindre les serveurs de Google sur le port 465.
    Les pare-feux d'entreprise ou les suites de sécurité antivirus bloquent souvent par défaut le trafic sortant sur les ports de messagerie pour empêcher les malwares d'envoyer du spam.

    L'outil PowerShell est le moyen le plus fiable pour effectuer ce test sous Windows, car il contourne les configurations des clients mail pour tester la couche TCP pure.

    La commande suivante initie une poignée de main TCP (SYN/SYN-ACK) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Test-NetConnection smtp.gmail.com -Port 465
    - Un résultat TcpTestSucceeded : True confirme que la route est ouverte.
    - Un résultat False indique un blocage en amont (routeur, FAI, ou pare-feu local), qui rendra toute correction de code inutile tant qu'il ne sera pas levé.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  12. #12
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 208
    Par défaut
    Merci Fred1599 pour tes explications. Quelque chose dans ce genre là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    PS C:\WINDOWS\system32> Test-NetConnection smtp.gmail.com -Port 465
     
    ComputerName		: smtp.gmail.com
    RemoteAddress		: 2a00:1450:400c:c00::6d
    RemotePort		: 465
    InterfaceAlias		: Ethernet
    SourceAddress		: 2a02:84xx:xxxx:xxxx::xxxx
    TcpTestSucceeded	: True
     
    PS C:\WINDOWS\system32>
    J'ai repris la macro où il y avait quelques erreurs :
    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
    Sub mail()
    	Dim mail As Object
    	Set mail = CreateObject("CDO.Message")
     
    	' Configuration du serveur SMTP
    	With mail.Configuration.Fields
    		.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    		.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
    		.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
    		.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    		.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "mon.adresse@gmail.com"
    		.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "mot_de_passe_app"
    		.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    		.Update
    	End With
     
    	' Contenu du mail
    	With mail
    		.From = "mon.adresse@gmail.com"
    		.To = Sheets("Modele Facture").Range("L10").Value
    		.Subject = "CSD Tennis de Table – Facture"
    		.TextBody = "Merci de recevoir votre facture relative à vos engagements. Cordialement"
    		' .AddAttachment "chemin_vers_fichier" ' Décommentez si vous voulez joindre un fichier
    		On Error Resume Next
    		.Send
    		If Err.Number <> 0 Then
    			MsgBox "Erreur lors de l'envoi : " & Err.Description
    		End If
    	End With
     
    	Set mail = Nothing
    End Sub
    Pas testé.

  13. #13
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 746
    Par défaut
    Pour vous le test semble ok, mais est-ce que le PO a le même résultat ? C'est dépendant des pare-feu et antivirus ce type de blocage.

    Pour le code j'avais pensé à ceci,

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    Option Explicit
     
    ' -------------------------------------------------------------------------
    ' PROCEDURE PRINCIPALE : ORCHESTRATION MÉTIER
    ' Rôle : Valider les données, générer le document, déclencher l'envoi.
    ' -------------------------------------------------------------------------
    Sub Traitement_Facture_Complet()
        Dim ws As Worksheet
        Dim Dossier As String, CheminDossier As String
        Dim NomFichier As String, CheminComplet As String
        Dim EmailClient As String
        Dim RawName As String
     
        ' Initialisation de la feuille active
        Set ws = ActiveSheet
     
        ' --- ÉTAPE 1 : Validation Utilisateur et Données ---
        If MsgBox("Confirmez-vous l'exportation et l'envoi de la facture par email?", _
                  vbYesNo + vbQuestion, "Confirmation d'envoi") = vbNo Then Exit Sub
     
        ' Vérification de la présence d'un email valide en cellule L10
        EmailClient = Trim(ws.Range("L10").Value)
        If InStr(EmailClient, "@") = 0 Or InStr(EmailClient, ".") = 0 Then
            MsgBox "ERREUR CRITIQUE :" & vbCrLf & _
                   "L'adresse email du client en cellule L10 est invalide ou manquante.", _
                   vbExclamation, "Données Invalides"
            Exit Sub
        End If
     
        ' --- ÉTAPE 2 : Gestion du Système de Fichiers ---
        ' Utilisation de ThisWorkbook.Path pour garantir la portabilité du script
        Dossier = "Factures PDF"
        CheminDossier = ThisWorkbook.Path & "\" & Dossier & "\"
     
        ' Création sécurisée du répertoire s'il n'existe pas
        ' La fonction Dir vérifie l'existence sans lever d'erreur
        If Dir(CheminDossier, vbDirectory) = "" Then
            On Error Resume Next
            MkDir CheminDossier
            If Err.Number <> 0 Then
                MsgBox "Impossible de créer le dossier de sauvegarde." & vbCrLf & _
                       "Vérifiez vos droits d'écriture.", vbCritical
                Exit Sub
            End If
            On Error GoTo 0
        End If
     
        ' --- ÉTAPE 3 : Construction et Sanitisation du Nom de Fichier ---
        ' Nettoyage des caractères interdits dans les noms de fichiers Windows (\ / : *? " < > |)
        RawName = ws.Range("E5").Value & "_" & ws.Range("L1").Value
        RawName = Replace(RawName, "/", "-")
        RawName = Replace(RawName, "\", "-")
     
        NomFichier = RawName & ".pdf"
        CheminComplet = CheminDossier & NomFichier
     
        ' --- ÉTAPE 4 : Exportation PDF ---
        ' Utilisation de la méthode native ExportAsFixedFormat
        On Error GoTo ErreurExport
        ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=CheminComplet, _
            Quality:=xlQualityStandard, IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, OpenAfterPublish:=False
        On Error GoTo 0
     
        ' --- ÉTAPE 5 : Transmission au Service de Messagerie ---
        ' Passage des arguments critiques à la sous-procédure
        Call EnvoyerMailGmail(CheminComplet, EmailClient)
     
        Exit Sub
     
    ErreurExport:
        MsgBox "Erreur lors de la génération du fichier PDF." & vbCrLf & _
               "Détails : " & Err.Description, vbCritical
    End Sub
     
    ' -------------------------------------------------------------------------
    ' SOUS-PROCÉDURE : COUCHE DE TRANSPORT SMTP (CDO)
    ' Rôle : Configurer le schéma CDO et négocier la connexion SSL avec Gmail.
    ' -------------------------------------------------------------------------
    Sub EnvoyerMailGmail(FichierJoint As String, Destinataire As String)
        Dim iMsg As Object
        Dim iConf As Object
        Dim Flds As Object
        Dim Schema As String
     
        ' Définition de l'espace de noms du schéma CDO
        ' Note : Ce n'est pas une URL web, mais une clé de registre interne à la DLL
        Schema = "http://schemas.microsoft.com/cdo/configuration/"
     
        Set iMsg = CreateObject("CDO.Message")
        Set iConf = CreateObject("CDO.Configuration")
     
        ' Chargement des configurations par défaut
        iConf.Load -1
        Set Flds = iConf.Fields
     
        With Flds
            ' --- CONFIGURATION RÉSEAU ET SÉCURITÉ ---
     
            ' sendusing : 2 = Envoi via le réseau (SMTP)
           .Item(Schema & "sendusing") = 2
     
            ' Serveur SMTP de Gmail
           .Item(Schema & "smtpserver") = "smtp.gmail.com"
     
            ' Port 465 : Force le mode SMTPS (Implicit SSL)
            ' C'est la configuration la plus stable pour CDO/Gmail
           .Item(Schema & "smtpserverport") = 465
     
            ' Activation du chiffrement SSL/TLS
           .Item(Schema & "smtpusessl") = True
     
            ' Timeout de connexion (en secondes) - Augmenté pour l'envoi de PDF
           .Item(Schema & "smtpconnectiontimeout") = 60
     
            ' --- AUTHENTIFICATION ---
     
            ' smtpauthenticate : 1 = Authentification Basique (Requise pour App Password)
           .Item(Schema & "smtpauthenticate") = 1
     
            ' Identifiants de l'expéditeur
            ' CORRECTION IMPORTANTE : "sendusername" et non "senusername"
           .Item(Schema & "sendusername") = "votre.asso@gmail.com"
     
            ' MOT DE PASSE D'APPLICATION (16 caractères générés par Google)
            ' Ne jamais utiliser le mot de passe de connexion Gmail ici
           .Item(Schema & "sendpassword") = "xxxx xxxx xxxx xxxx"
     
           .Update
        End With
     
        ' --- CONSTRUCTION DE L'ENVELOPPE MESSAGE ---
        With iMsg
            Set.Configuration = iConf
           .To = Destinataire
           .From = "votre.asso@gmail.com"
           .CC = "" ' Copie carbone optionnelle
           .Subject = "CSD Tennis de Table – Facture " & Range("E5").Value
     
            ' Corps du message en texte brut
           .TextBody = "Bonjour," & vbCrLf & vbCrLf & _
                        "Veuillez trouver ci-joint votre facture relative à vos engagements." & vbCrLf & vbCrLf & _
                        "Ce message est généré automatiquement." & vbCrLf & _
                        "Cordialement," & vbCrLf & "L'équipe Tennis de Table"
     
            ' Attachement dynamique du fichier PDF généré précédemment
            If FichierJoint <> "" Then
               .AddAttachment FichierJoint
            End If
     
            ' --- TENTATIVE D'ENVOI AVEC GESTION D'ERREUR ---
            On Error Resume Next
           .Send
     
            If Err.Number <> 0 Then
                ' Analyse des erreurs fréquentes pour guider l'utilisateur
                Dim MsgErreur As String
                MsgErreur = "ÉCHEC DE L'ENVOI." & vbCrLf & vbCrLf & _
                            "Code Erreur : " & Err.Number & vbCrLf & _
                            "Description : " & Err.Description & vbCrLf & vbCrLf & _
                            "Pistes de résolution :" & vbCrLf & _
                            "1. Vérifiez que le 'Mot de passe d'application' est correct." & vbCrLf & _
                            "2. Vérifiez votre connexion internet." & vbCrLf & _
                            "3. Assurez-vous qu'aucun pare-feu ne bloque le port 465."
                MsgBox MsgErreur, vbCritical, "Erreur SMTP"
            Else
                MsgBox "La facture a été envoyée avec succès à :" & vbCrLf & Destinataire, vbInformation, "Succès"
            End If
            On Error GoTo 0
        End With
     
        ' Nettoyage mémoire (essentiel en VBA pour éviter les fuites)
        Set iMsg = Nothing
        Set iConf = Nothing
        Set Flds = Nothing
    End Sub
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  14. #14
    Membre Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 315
    Par défaut
    @Artemus24

    Citation Envoyé par Artemus24 Voir le message
    ...
    Il suffit de mettre ce PDF accessible depuis leur site web, avec une identification de l'utilisateur pour qu'il puisse la récupérer.
    ...
    L'utilisateur s'identifie auprès du site web, se retrouve sur une page web où il va cliquer sur un bouton pour obtenir sa facture.

    Pour revenir sur l'envoi de courriels, zaza62000 peut utiliser "PHPMAILER". C'est bien plus complet que d'utiliser la fonction mail() sous Php.
    ...
    OK, mais là on passe d'une simple macro en local à un développement Web, avec sécurisation des données.

    Citation Envoyé par Artemus24 Voir le message
    Il faut aussi se donner les moyen de ses ambitions, non ?
    Certes, mais de passer d'une macro à un site web et tout ce qui va avec pour éviter une centaine d'envoi avec pièce jointe, ça me semble un peu démesuré.
    JièL
    Membre des AMIS
    Anti Macro Inutilement Superfétatoire

  15. #15
    Membre Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 315
    Par défaut
    @fredd1599 la "Validation en Deux Étapes (2FA)" ne demande t'elle pas une vérification à chaque connexion ?
    JièL
    Membre des AMIS
    Anti Macro Inutilement Superfétatoire

  16. #16
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 746
    Par défaut
    La demande de connexion est que lorsque vous voulez votre mot de passe d'application, une fois que vous avez le mot de passe, plus besoin de se re-connecter à google.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  17. #17
    Membre Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 315
    Par défaut
    @zaza6200 si vous êtes encore intéressé, voici un code qui permet d'envoyer en utilisant le serveur SMTP de la connexion active
    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
    Sub mail()
     
        Set Message = CreateObject("cdo.Message")
     
        ' configuration de la messagerie
        With Message.Configuration.Fields
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = nom du serveur SMTP de la connexion active (ex : "smtp.free.fr")
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = Numéro du port d'envoi (465 généralement en SSL/TLS)
            .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
            .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = nom du compte utilisateur de la BàL utilisé pour l'envoi (ex : si "toto@free.fr", utiliser "toto")
            .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = mot de passe du compte utilisateur de la BàL utilisé pour l'envoi (ex : "password")
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
     
            .Update
        End With
     
        '  configuration du message
        With Message
            .Subject = "CSD Tennis de Table – Facture"
            .From = "Mon adresse mail@gmail.com"
            .To = Sheets("Modele Facture").Range("L10").Value
            '‘.CC = « ***@*** »
            .TextBody = "Veuillez trouver ci joint la facture relative à vos engagements. Cordialement"
            .AddAttachment ("chemin complet et nom du fichier")
     
            .Send
        End With
     
        Set Message = Nothing
     
        MsgBox "Message envoyé... ou pas :-D"
     
    End Sub
    JièL
    Membre des AMIS
    Anti Macro Inutilement Superfétatoire

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/06/2022, 10h37
  2. Exporter une page vers PDF
    Par Wnejla dans le forum SharePoint
    Réponses: 3
    Dernier message: 03/05/2013, 09h30
  3. Export une Gridview en PDF
    Par hmahmoudi dans le forum ASP.NET
    Réponses: 4
    Dernier message: 14/06/2012, 18h56
  4. Envoyer un fichier par mail sans Outlook
    Par kiki29 dans le forum Contribuez
    Réponses: 2
    Dernier message: 03/09/2007, 02h11

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