[Basic] Envoi de courriel Aoo4 et LibO4

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 01:17
Localisation : gâtine deux-sèvrienne

[Basic] Envoi de courriel Aoo4 et LibO4

Message par luky-luke »

Bonjour,

Pour faire suite à ce fil [Python]envoi de courriel, la nouvelle branche 4.0 d'ApacheOpenOffice apporte une nouveauté. Il est possible (enfin) de rédiger entièrement un courriel avec corps de texte et pièce jointe.
Un point sur les services utilisés.

Pour un envoi qui demande une confirmation d'envoi (ouverture de la fenêtre message)
  • Seulement pour Aoo4 Windows/GNU-Linux -
    com.sun.star.system.SystemMailProvider
    Ce nouveau Service autorise l'envoi d'un corps de texte, ce qui n'est pas possible avec l'ancienne méthode.

    Code : Tout sélectionner

    Sub NewMethode
    Dim Messagerie As Object, Client As Object, Courrier As Object
    	Messagerie = CreateUnoService("com.sun.star.system.SystemMailProvider")'Version Windows/Linux Aoo4
    	Client = Messagerie.queryMailClient()
    	Courrier = Client.createMailMessage()	
    		Courrier.Subject = "Test LibO4 et SystemMailProvider"'Sujet	
    		Courrier.Recipient = "Leochopoto@wanadoo.fr"'Adresse
    		Courrier.CcRecipient = ""'Copie A
    		Courrier.BccRecipient = ""'Copie Caché
    		Courrier.Attachement = ""'Piece Jointe()
    		Courrier.body = "ceci est un test"'Texte
    		Client.sendMailMessage(Courrier,0)'Flag inopérant
    End Sub
  • pour Aoo3 LibO3 & 4 Windows -
    com.sun.star.system.SimpleSystemMail
  • pourAoo3 Libo3 & 4 GNU-Linux -
    com.sun.star.system.SimpleCommandMail
    Donc avec ces services pas de corps de Texte

    Code : Tout sélectionner

    Sub OldMethode
    Dim Messagerie As Object, Client As Object, Courrier As Object
    	If GetGUIType = 1 Then
    		Messagerie = CreateUnoService("com.sun.star.system.SimpleSystemMail")'version Windows Aoo3/Libo3 & LibO4
    	Else
    		Messagerie = CreateUnoService("com.sun.star.system.SimpleCommandMail")'Version Linux Aoo3/LibO3 & LibO4
    		Client = Messagerie.querySimpleMailClient()
     		Courrier = Client.createSimpleMailMessage()
    	
    		Courrier.Subject = "Test LibO4 et SystemMailProvider"'Sujet	
    		Courrier.Recipient = "Leochopoto@wanadoo.fr"'Adresse
    		Courrier.CcRecipient = Array("EtienneDuParc@LesAccacia.fr")'CopieA
    		Courrier.BccRecipient = Array("MaxLaMenace@Tapedur.fr")'CopieA
    		Courrier.Attachement = Array("")'PcsJt()
    		Client.sendSimpleMailMessage(Courrier,0)
    	End if
    End sub

Pour un envoi qui ne demande pas une confirmation d'envoi (ouverture de la fenêtre message)

c'est beaucoup plus simple ou presque. :lol:
Quelque soit la suite utilisée (Aoo ou LibO version 3 et 4) et quelque soit le système d'exploitation (OS). Un seul service
com.sun.star.mail.MailServiceProvider
Un fichier test fonctionnel est accessible ici sur le site Apache . Il comporte néanmoins un petit HIC ! Les destinataires en copie et copie cachée ne fonctionne pas. Encore un problème Python :lol:
On retrouve l'auteur sur le forum anglais http://www.oooforum.org/forum/viewtopic ... 63#462063) . Allez jusqu'à la fin du fil.

Le code en pièce jointe MailServiceProvider_EnvoiAuto est assez simple à adapter. Il suffit de collecter les bon Arguments pour la fonction SendMail dans le module du même nom.
Pensez à écrire les paramètres de connexion dans la macro et des adresses valide dans la feuille1 pour un test.
Le clic sur le bouton provoque l'ouverture d'une boite de dialogue. La multiple sélection de destinataire est possible et l'envoi de pièces jointes n'est pas limité en taille.

Les deux fichiers on été testé sur différente configuration et semble ne plus comporté de bogues...hum ! j'espère...
 Ajout : 6 novembre 2015 
Pour faire suite à ce fil Envoi de courriel : objet non défini, un nouveau fichier ( MailserviceProvider_EnvoiAuto_2.ods ) vient de remplacer le précédent, ajout d'une gestion d'erreur dans la fonction AddAttachments et unification du nom de la variable des URL des fichiers joints.
Le fichier est testé pour les versions AOO 4.1.1 et LibO 4.3.6.2 (officiel) avec Thunderbird par défaut, c'est glop !. Par contre avec LibO 4.4.2.2 (officiel), une erreur sur l'authentification, stop l'envoi, pas glop !

Pour LibO 4.4.2.2, J'ai pas trouvé, mais je vais encore chercher :fou:


Cordialement
Luke
Pièces jointes
MailserviceProvider_EnvoiAuto_2.ods
(18.59 Kio) Téléchargé 695 fois
BoiteCourriel_WIndows_Linux_NoAuto.ods
Envoi avec ouverture du courrielleur par défault
(19.21 Kio) Téléchargé 679 fois
Dernière modification par luky-luke le 06 nov. 2015 19:04, modifié 3 fois.
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
steph A
Membre OOrganisé
Membre OOrganisé
Messages : 55
Inscription : 09 mars 2012 15:34

Re: [Basic] Envoi de courriel Aoo4 et LibO4

Message par steph A »

Bonjour lucky-luke et un grand merci pour ces codes! :super:

Surtout celui de MailServiceProvider_EnvoiAuto dont j'aime le fonctionnement "autonome" et qui va, je le sens,
encore me faire passer des nuits blanches pour l'adapter ("adapter" veut dire "compredre" chez moi :-) ) !!!
Ça a d'ailleurs commencé puisque je questionne déjà le forum ici. :lol:

Je voulais te signaler qu'une petite erreur (un oubli plutôt) s'est glissée dans la macro "Destinataire" du module "Ref_courriel"
du fichier MailServiceProvider_EnvoiAuto :
il y a la déclaration d'une feuille qui n'existe pas et qui ne sert pas dans la macro :
...
Sub Destinataire
Dim Feuille As Object, Dest As Object, Sel() As String
Feuille = ThisComponent.sheets.GetByName("Courrier_Variable")
...

Du coup je l'ai enlevée (la déclaration et sa valeur, pas la macro !!! :lol: )

Je joins donc, sous ton contrôle, une version "corrigée" à ce message.
Si tu as l'occasion et le temps d'y jeter un œil pour validation...

Encore merci lucky-luke!

À plus.

Stéphane
Pièces jointes
MailserviceProvider_EnvoiAuto_Correction1.ods
Envoi de mail via une boîte de dialogue.
(29.94 Kio) Téléchargé 559 fois
LibreOffice 7.0.4.2 sur Debian 11 Gnome Shell ou Windows 11
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 01:17
Localisation : gâtine deux-sèvrienne

Re: [Basic] Envoi d'un PDF par courriel

Message par luky-luke »

Bonjour

Un nouveau fichier pour enregistrer une sélection au format PDF et envoyer par courriel le fichier PDF créé en pièce jointe.
L'adresse d'envoi, l'objet et le corps de texte sont écris sur la feuille1 et récupérés par la macro. Les coordonnées sont modifiables dans le module1, Sub Destinataire, Object, CorpsDeTexte.
Une boite de dialogue s'ouvre et demande quelle feuille doit être exportée.
La zone d’impression est définie par macro et facilement modifiable. Cette même zone est supprimée en fin de routine.
Dans le module Utils la macro Zone_impress () défini une zone d'impréssion et la macro Delete_impresse la supprime.
Si un zone d’impression est déjà définie dans la feuilles, la définition dans les macros peut être supprimée et l'appel Delete_Impress dans la macro main doit être supprimer également.
Ne pas oublier de configurer les paramètres de messagerie dans le module SendMail.

L'envoi de courrier utilise le service com.sun.star.mail.MailServiceProvider, et fonctionne chez moi sous Aoo et LibO 4.3.x.x mais pas avec LibO 4.4.2.2 qui provoque une erreur d'authentification (pas Glop !)
 Ajout : 2 décembre 2015
après un peu de ménage sur mon disque dur et l'installation de LibO 4.4.6 officiel le fichier ci-dessous fonctionne avec.
J'ai fais du ménage dans le module SendMail en supprimant des fonctions et en regroupant les listeners dans la même macro. C'est un peu plus lisible :fou:. Les inconvénients sont qu'il n'y a plus qu'un seul destinataire, une seule pièce jointe et que le nom de l'expéditeur n’apparaît plus chez le destinataire.
Courriel_envoi_simple.ods
(12.73 Kio) Téléchargé 616 fois
 
Cordialement
Luke
Pièces jointes
Courriel_Export_Selection.ods
(15.43 Kio) Téléchargé 519 fois
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 01:17
Localisation : gâtine deux-sèvrienne

Re: [Basic] Envoi d'une selection dans le corps de texte

Message par luky-luke »

Bonjour

Suite à une bonne idée de Dude dans ce fil Selection de données et envoi par courriel
Pour un fichier Calc
Envoyer une sélection faite par l'utilisateur, dans le corps de texte du message et au format HTML
Envoi_TableauHTML_CorpsDeTexte.ods
(10.65 Kio) Téléchargé 439 fois

Code : Tout sélectionner

Option Explicit

REM =====================
'Configuration des parametres compte courrier
Const smtpPassword$ = "Mon_Mot_De_Passe" 
Const UserName$ = "Mon_Nom_D'utilisateur" ' Nom d'utilisateur
Const Useradress$ = "MonAdresse@moi.fr" ' L'adresse de l'expediteur
Const ServerName$ = "smtp.moi.fr" ' Le serveur SMTP
Const ServerPort = 25        'le cas le plus général
Const ServerSecure$ = "SSL"  '"Insecure" 'ou  "STARTTLS"
REM =====================

Sub EnvoiCourriel
Dim oMSP As Object, oDisp As Object, oDude As object, oCont As Object, oAuth As Object   
Dim oPrepa As Object, oMel As Object, oSMTP As Object
Dim oDoc As Object, oCC As Object, oCadre As Object, oSel As Object
Dim oCorps As Object

oMSP = CreateUNOService("com.sun.star.mail.MailServiceProvider")
oDisp = CreateUNOService("com.sun.star.frame.DispatchHelper")
oDude = CreateUNOService("com.sun.star.datatransfer.clipboard.SystemClipboard")
oCont = CreateUNOListener("Context_","com.sun.star.uno.XCurrentContext")
oAuth = CreateUNOListener("Authent_","com.sun.star.mail.XAuthenticator")

'Utilisation du presse-papier pour le corps du message
'avec copie de la plage concernée
	oDoc = ThisComponent
	oCC = oDoc.CurrentController
	oCadre = oCC.Frame
REM Selection definie
'	oFeuille = oDoc.Sheets.getByIndex(0) '2e feuille
'	oPlage = oFeuille.getCellRangeByPosition(0,0,3,3) 'A1 à D4
'	oCC.Select(oPlage)
REM  Selection faite par l'utilisateur
	oSel = oDoc.CurrentSelection 
	oDisp.executeDispatch(oCadre, ".uno:Copy", "", 0, Array())
	sCorps = oDude.getContents()

	oPrepa = com.sun.star.mail.MailMessage
'Paramètres : destinataire, expéditeur, sujet, corps
	oMel = oPrepa.create( "LeDestinatire@Elysee.fr", _
	Useradress, _
	"Eh Dude, voici un tableau !", sCorps )
	
	oSMTP = oMSP.Create("com.sun.star.mail.SMTP")
	oSMTP.Connect(oCont, oAuth)
       if oSMTP.isConnected then oSMTP.SendMailMessage(oMel)
       	oSMTP.Disconnect()
End Sub

Function Context_GetValueByName(oEve) as Any
	Select Case oEve
       Case "ServerName"
         Context_GetValueByName = ServerName   'SMPTP.moi.fr
       Case "Port"
         Context_GetValueByName = ServerPort   '25 
       Case "ConnectionType"
         Context_GetValueByName = ServerSecure 'SSL, Insecure ou STARTTSL
	End Select
End Function

Function Authent_GetUserName() as Any
	Authent_GetUserName = UserName ' "identifiant"
End Function

Function Authent_GetPassword() as Any
	Authent_GetPassword = smtpPassword ' "motDePasse"
End Function  
Et pour un fichier Writer
Envoyer une sélection faite par l'utilisateur, dans le corps de texte du message, au format HTML
Envoi_Selection_Texte_CorpsDeTexte_HTML.odt
(12.25 Kio) Téléchargé 441 fois

Code : Tout sélectionner

Sub EnvoiCourriel
oMSP = CreateUNOService("com.sun.star.mail.MailServiceProvider")
oDisp = CreateUNOService("com.sun.star.frame.DispatchHelper")
oDude = CreateUNOService("com.sun.star.datatransfer.clipboard.SystemClipboard")
oCont = CreateUNOListener("Context_","com.sun.star.uno.XCurrentContext")
oAuth = CreateUNOListener("Authent_","com.sun.star.mail.XAuthenticator")

'Utilisation du presse-papier pour le corps du message
'avec copie de la plage concernée
	oDoc = thisComponent
	oCC = oDoc.CurrentController
	oCadre = oCC.Frame
	oTexte = oDoc.CurrentSelection
	oMonTexte = oTexte(0).Text
	oMonCurseur = oMonTexte.CreateTextCursorByRange(oTexte(0))
	oDisp.executeDispatch(oCadre, ".uno:Copy", "", 0, Array())
	sCorps = oDude.getContents()

	oPrepa = com.sun.star.mail.MailMessage
'Paramètres : destinataire, expéditeur, sujet, corps
	oMel = oPrepa.create( "LeonBlum@Elysee.fr", _
	"JeanJaures@Pantheon.fr", _
	"Un texte au format HTML !", sCorps )
	
	oSMTP = oMSP.Create("com.sun.star.mail.SMTP")
	oSMTP.Connect(oCont, oAuth)
       if oSMTP.isConnected then oSMTP.SendMailMessage(oMel)
       	oSMTP.Disconnect()
End Sub

Function Context_GetValueByName(oEve) as Any
	Select Case oEve
       Case "ServerName"
         Context_GetValueByName = "smtp.Elysee.fr"
       Case "Port"
         Context_GetValueByName = 25
       Case "ConnectionType"
         'SSL, Insecure ou STARTTSL
         Context_GetValueByName = "STARTTSL"
	End Select
End Function

Function Authent_GetUserName() as Any
	Authent_GetUserName = "Leonblum" ' "identifiant"
End Function

Function Authent_GetPassword() as Any
	Authent_GetPassword = "congespaye" ' "motDePasse"
End Function  
Dude a écrit :Il n'en reste qu'il faut quand même que le destinataire accepte les courriels dans ce format.
Les paramètres de configuration du compte courrier sont, soit définis en début de macro (Calc), soit à l'intérieur même du Sub(Writer). A vous de choisir ce qui vous parait le plus simple :wink:

Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Répondre