Autres ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

Roland_M

XLDnaute Barbatruc
Bien le bonjour à tous,

J'ai réalisé ce classeur qui pourrait certainement intéresser plusieurs personnes !?
à tester ! faire des remarques ! chez moi ça fonctionne parfaitement mais j'y travaille encore qq fois.

Classeur avec plusieurs macros pour envoyer des Mails avec ou sans pièce jointe ou dans le corps du msg

EDIT: dernière modif 23/11/2020 (simplifié)
 

Pièces jointes

  • FICH_EnvoiMail_CdoPerso.xlsm
    85.5 KB · Affichages: 55
Dernière édition:

titiborregan5

XLDnaute Accro
Re : ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

Re à tous,

je vais juste préciser qq points sur mon code...
Il sert à envoyer à plusieurs destinataires leur fichier... Il y a donc une boucle qui tourne sur le nom du service, cherche la PJ assimilé (le nom de la pj assimilé et son chemin sont écrits dans la colonne d'à coté) et envoie au(x) destinataire(s) de la ligne. ça fonctionne donc sous forme de tableau...
Un schéma valant mieux qu'un long discours, la PJ est jointe...

Pour ce qui est du CDO, je ne sais pas trop ce que c'est mais il me semble que je m'en sers, et ça marche depuis mon taf... Après, ce n'est peut-être pas aussi bridé que chez vous...

A+

tibo
 

Pièces jointes

  • exemple envoi.xls
    32.5 KB · Affichages: 109

Roland_M

XLDnaute Barbatruc
Re : ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

Bonjour,

@tititborregan :

et comme ceci, et en essayant de mettre l'init cdo avant la boucle !
sinon il suffit d'enlever les rems devant en bas c'est tout !

Code:
Sub Envoi_Mail()
'init
Dim Destin$, Service$, Chemin$, Nom_Fichier$, PathFichier$, NbrDestin%, NbrErreur%
Dim iMsg As Object, iConf As Object
Set iMsg = CreateObject("CDO.Message") '<<< soit ici
Set iConf = CreateObject("CDO.Configuration") '<<< soit ici
NbrDestin = 0: NbrErreur = 0

'boucle envoi
For I = 2 To Sheets(1).Range("d1").End(xlDown).Row
NbrDestin = NbrDestin + 1
Destin = Cells(I, 5)
Service = Cells(I, 2) & "-" & Cells(I, 1)
Chemin = "xxx\aez\"
Nom_Fichier = Cells(I, 4)
PathFichier = Chemin & Nom_Fichier
'test destinataire
If Trim(Destin) = "" Then
   MsgBox "Destinataire absent !?", vbExclamation, "envoi mail"
   NbrErreur = NbrErreur + 1: GoTo Suivant
End If
'test fichier
If Dir(PathFichier) = "" Then
   MsgBox "Fichier non trouvé !" & vbLf & PathFichier & vbLf & Destin & vbLf & Service, vbExclamation, "envoi mail"
   NbrErreur = NbrErreur + 1: GoTo Suivant
End If
'envoi
'Set iMsg = CreateObject("CDO.Message") '<<< soit ici
'Set iConf = CreateObject("CDO.Configuration") '<<< soit ici
With iMsg
 Set .Configuration = iConf
  If .Attachments.Count <> 0 Then .Attachments.Delete (1)
  .To = Destin
  .CC = ""
  .BCC = ""
  .From = "zzz@zz.fr"
  .Subject = "Comptabilité analytique " & Service
  .TextBody = "Bonjour," & Chr(10) & Service
  .addattachment PathFichier
  .Send
End With

'Set iMsg = Nothing: Set iConf = Nothing 'avec ceci ici
Suivant:
Next

Set iMsg = Nothing: Set iConf = Nothing
MsgBox NbrDestin - NbrErreur & " Mail(s) envoyé(s) !", vbInformation, "envoi mail"
End Sub
 
Dernière édition:

titiborregan5

XLDnaute Accro
Re : ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

hello,
Bonjour,

@tititborregan :

et comme ceci, et en essayant de mettre l'init cdo avant la boucle !
sinon il suffit d'enlever les rems devant en bas c'est tout !

euh, pourquoi faire?? :)
Pour une fois que j'ai qqch qui marche j'y touche plus ;)
En fait j'apportais juste des précisions sur le déroulé de ma macro qui pouvait paraître flou!!

A+
 

Roland_M

XLDnaute Barbatruc
Re : ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

re

euh ! simplement pour rendre service, faire plaisir, partager ...
pas obliger de le prendre mais avoir une réaction plus sympa serait bien venue !
on m'y reprendra ...

EDIT:
ceci pour te dire que si l'on veut progresser il savoir écouter et regarder !

exemple, ici je te conseil de mettre ceci à la fin, avant ou après ton message:

Set imsg = Nothing: Set iconf = Nothing
MsgBox "Votre mail a bien été envoyé"
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

Bonsoir à tous

Roland_M
J'ai testé et j'ai échoué :p
(j' ai regardé le code de ta PJ. Mais en l'état, ta PJ ne permettant pas de tester avec Exchange, j'ai utiliser le code ci-dessous pour néanmoins tester CDO avec Exchange)
L'erreur se fait sur .Send
(le message d'erreur est en fin de code dans les commentaires)
Donc j'ai testé en mettant le nom du serveur Exchange (enfin je crois ) soit de l'ordinateur i qui "héberge" le dit serveur.
et aussi avec l'adresse IP du dit serveur (ou alors c'était l'IP de l'ordi qui héberge le serveur)
Les comptes mail étant créés par le service informatique, je ne connais pas le mot de passe lié à mon email.
j'ai cherché à la pause de midi des infos sur le net (mais pas trouvé de quoi solutionner la chose)
Donc si un membre du forum plus pointu que lou su Exchange et CDO passe dans ce fil, qu'il n'hésite pas à se manifester ;)
Code:
Sub CDO_Tests()
Const confs As String = "http://schemas.microsoft.com/cdo/configuration/"
Dim CDO_Mail_Object As Object, CDO_Config As Object, SMTP_Config As Variant
Set CDO_Mail_Object = CreateObject("CDO.Message")
On Error GoTo debugs
Set CDO_Config = CreateObject("CDO.Configuration")
CDO_Config.Load -1
Set SMTP_Config = CDO_Config.Fields
With SMTP_Config
.Item(confs & "sendusing") = 2
'tests avec NOM Server ou adresse IP
.Item(confs & "smtpserver") = "SMTPNAMEouIP"
.Item(confs & "smtpserverport") = 25
.Update
End With
With CDO_Mail_Object
Set .Configuration = CDO_Config
End With
With CDO_Mail_Object
.Subject = "TEST CDO"
.From = "adressmail"
.To = "adressmail"
.TextBody = "Test Envoi Mail CDO"
.Send
End With
debugs:
If Err.Description <> "" Then Debug.Print Err.Number & Chr(13) & Err.Description
'-2147220973
'Le transport a échoué dans sa connexion au serveur.
End Sub
 

titiborregan5

XLDnaute Accro
Re : ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

re

euh ! simplement pour rendre service, faire plaisir, partager ...
pas obliger de le prendre mais avoir une réaction plus sympa serait bien venue !
on m'y reprendra ...

EDIT:
ceci pour te dire que si l'on veut progresser il savoir écouter et regarder !

exemple, ici je te conseil de mettre ceci à la fin, avant ou après ton message:

Set imsg = Nothing: Set iconf = Nothing
MsgBox "Votre mail a bien été envoyé"
Re Roland, merci pour ton retour...

Ma réponse n'était pas du tout négative bien au contraire... je disais tout ça en plaisantant rassure toi... loin de moi l'idée de mépriser tes apports...
En gros ma réponse synthétique et qui pouvait mal se prendre je l'accorde, si je la détaille ça donne ça à peu près:
Le truc que je ne comprends pas (ça vient peut-être du fait que le terme rems m'est inconnu): c'est pourquoi faut-il changer mon code par le tien? qu'apporte t il de plus que le mien?

Je suis à l'écoute de tout ce qui peut me permettre de progresser et ce forum m'a aidé de nombreuses fois...je n'ai sûrement pas encore les connaissances nécessaires sur le sujet traité ce qui ne m'a pas permis d'apprécier ta réponse à sa juste valeur...

A+
 

Roland_M

XLDnaute Barbatruc
Re : ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

re

@titiborregan5 OK ! no soussaille !

alors:
le fait que tu ne saches pas ce que veut dire "rem" me fait penser tu ne connais pas vba !?
il ne faut donc pas te lancer à essayer ma macro !
"rem" ou ce caractère ' c'est mettre une ligne en remarque
c'est à dire que ce n'est pas considéré par VB comme du code !
si je met
A = 10
A sera bien égal à 10
mais si je met
'A=10
il sera ignoré par VB

tout comme dans ta macro tu as ceci:
'MsgBox dest & "/" & service & "/" & chemin & nom_fichier
il ne se passe rien ! et bien enlèves la rem le signe ' qui est devant
MsgBox dest & "/" & service & "/" & chemin & nom_fichier
et là tu verras s'afficher le message !


dans ma macro c'était pour que tu essais l'envoi avec l'init CDO qu'une seule fois avant la boucle
et non pas répété à chaque fois dans la boucle d'envoi !

maintenant, pour un code propre, tu dois déclarer tes variables Object, et les vider de la mémoire à la fin comme il se doit !
pour ce faire c'est très simple:

au début du Sub avant Set .... CDO ... mettre cette ligne:
Dim imsg as Object, iconf as Object

et à la fin après le next mettre cette ligne:
Set imsg = Nothing: Set iconf = Nothing
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
Re : ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

bonsoir,

@Staple,

comme ça je ne vois pas !?

question:
y a t'il un message ? car j'ai un test d'erreur qui indique par exemple
que sendusing n'est pas valable !
ou smtpserverport no de port non valable pour le transport !
ou que smtpserver n'est pas correcte ...
Est-ce à la config ou à l'envoi !? souvent c'est à l'envoi .Send


si tu n'as pas de message je saurais pas te dire !
ou alors ça bloque au début de la routine !?
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
Re : ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

re

@Staple !

milles excuses ! pas fais attention (sur plusieurs chose à la fois)

message
'Le transport a échoué dans sa connexion au serveur.
ce message peut être du au no de port !

essayer comme j'ai indiqué 25 / 465 / 587

attention ! si ce n'est pas le bon ça met un certain à répondre !
mais il suffit de patienter 30 sec à 1 minute !?
 

Staple1600

XLDnaute Barbatruc
Re : ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

Re

Roland_M
Le souci c'est que contrairement à toi, je n'utilise pas le serveur SMTP du FAI, mais le serveur Exchange de la boite où je bosse.
J'ai beau chercher toute la littérature (et des exemples de codes CDO+MSExchange), je fais chou-blanc pour le moment.
C'est plus par challenge que par besoin que je cherche à trouver où le bat blesse. ;)

D’où mon appel* (pour le moment sans grand succès), aux membres du forum qui utilisent ou connaissent Exchange.

*: voir message ou je relate mes tests avec CDO.
 

JNR91

XLDnaute Nouveau
Re : ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

Bonjour

J'ai aussi fait plusieurs programmes d'envoi de méls avec pièces jointes avec Thunderbird en Windows XP.

Je me suis aperçu qu'il y avait une limitation du nombre de caractères de la variable strcommand de la ligne de commande

Call Shell(strcommand, vbNormalFocus) qui pilote la génération du courriel sauf son envoi final.

strcommand contient à la queue-leue-leue toutes les infos expéditeur,destinataire, sujet,body,.. etc .. et les chemins complets des fichiers joints. Le nombre total de caractères est limité à 1023. Si l'on dépasse ce nombre, le mél ne se génère pas et l'on ne comprend pas ce qui se passe.

Avez-vous testé les limitations de ce type de vos divers programmes ?

JNoël
 

titiborregan5

XLDnaute Accro
Re : ci-joint un classeur pour envoi mail en smtp avec cdo avec ou sans pièce jointe

re

@titiborregan5 OK ! no soussaille !

alors:
le fait que tu ne saches pas ce que veut dire "rem" me fait penser tu ne connais pas vba !?
il ne faut donc pas te lancer à essayer ma macro !
"rem" ou ce caractère ' c'est mettre une ligne en remarque
c'est à dire que ce n'est pas considéré par VB comme du code !
si je met
A = 10
A sera bien égal à 10
mais si je met
'A=10
il sera ignoré par VB

tout comme dans ta macro tu as ceci:
'MsgBox dest & "/" & service & "/" & chemin & nom_fichier
il ne se passe rien ! et bien enlèves la rem le signe ' qui est devant
MsgBox dest & "/" & service & "/" & chemin & nom_fichier
et là tu verras s'afficher le message !


dans ma macro c'était pour que tu essais l'envoi avec l'init CDO qu'une seule fois avant la boucle
et non pas répété à chaque fois dans la boucle d'envoi !

maintenant, pour un code propre, tu dois déclarer tes variables Object, et les vider de la mémoire à la fin comme il se doit !
pour ce faire c'est très simple:

au début du Sub avant Set .... CDO ... mettre cette ligne:
Dim imsg as Object, iconf as Object

et à la fin après le next mettre cette ligne:
Set imsg = Nothing: Set iconf = Nothing
J'ai jamais de chez jamais percuté que rem ou rems signifiait remarque... complètement à l'ouest...
Pour le VBA j'y touche un peu mais sûrement bien moins que toi...

Pour les variables, c'est une fâcheuse habitude que j'ai que de ne rien déclarer, sauf en cas de besoin (rappel d'une valeur dans un autre code)...
Et je vais voir pour sortir l'init de la boucle...

Merci pour tes retours...
A+
 

Discussions similaires

Réponses
10
Affichages
1 K

Statistiques des forums

Discussions
311 720
Messages
2 081 899
Membres
101 834
dernier inscrit
Jeremy06510