Editer Ressource Composant - 31/05/2025 16:21:58

      #DECLARE($objet : Object; $attribut : Text; $chemin : Text; $typeValeur : Integer)
// Lire / écrire une ressource application
// par principe la donnée est éditée dans un formulaire
// $objet = objet où lire / écrire, $attribut = nom propriété de $objet, $chemin = chemin dans la ressource du composant {, $4 type valeur}
var $ptr : Pointer
var $result : cs._Trace
var $fct : cs.xSDK.ResourceALV

$fct:=cs.xSDK.ResourceALV.me

$result:=cs._Trace.me.Initialiser(Current method name)
dataTexte:=""
dataEntierLong:=0

// la données est typée dans le fichier .xml : trouver son type
// pas trouvé la commande 4D pour lire le type dans les propriétés formulaire
If (Count parameters=3)
	$typeValeur:=Is text  // par défaut
End if 

Case of 
	: ($typeValeur=Is text)
		$fct.SetVariable(Est ressource MAIL; $chemin; Is text; ->dataTexte)
		$ptr:=->dataTexte
		
	: (($typeValeur=Is integer) | ($typeValeur=Is longint))
		$fct.SetVariable(Est ressource MAIL; $chemin; Is longint; ->dataEntierLong)
		$ptr:=->dataEntierLong
		
	Else 
		$result.Error:=-3  // autre type
		$result.ErrorDescription:="type de donnée non testé"
End case 

Case of 
	: ($result.Error#0)
	: ($objet=Null)
		$result.Error:=-15086
		$result.ErrorDescription:="$objet est nul"
		
	: (Form event code=On Load)
		$objet[$attribut]:=$ptr->
		
	: (Form event code=On Data Change)
		$ptr->:=$objet[$attribut]
		$result.Error:=-16003*Num(Not($fct.SetResourceALV(Est ressource MAIL; $chemin; $ptr)))
End case 

$result.LeverException([msgk_event; msgk_log])

    

initProcess - 09/02/2026 10:20:06

Capable de process préemptif

      var ErrorNum : Integer

ErrorNum:=0
ON ERR CALL(Formula(traceHandler).source)

// init variables des méthodes renvoyant $0 typé (pour le mode interprété)
dataTexte:=""
dataEntierLong:=0
dataDate:=!00-00-00!
dataBooléen:=False


    

Bac à sable MAIL - 02/06/2025 12:40:31

      var $o; $oo : Object
var $x; $y : Text
var $commande; $i; $j : Integer
var $bool : Boolean

initProcess
$bool:=True
$o:=New object
$oo:=New object


$commande:=4

//$bool:=Afficher Evenement ALV 
//cs.$eMail.new().LireParametresSMTP($oo)


//$oo:=$o.wwwUtilisateurs.query("LogIn = :1";"auteur")
//$oo:=$o.wwwUtilisateurs.query("ID = :1";1000)
If ($commande ?? 0)
	// ouvrir l'éditeur des traductions
	cs.xSDK.TraductionsEditeur.new().ModifierTraductions()
End if 

If ($commande ?? 1)
	$o:=New object
	$o.host:="ssl0.ovh.net"  //Obligatoire
	$o.port:=465
	$o.user:="contact@ainsilavie.fr"
	$o.password:="9PbbCtV4-alv"
	$o.logFile:="LogTest.txt"  // Historique étendu à sauvegarder dans le dossier Logs
	
	$o:=SMTP New transporter($o)
End if 

If ($commande ?? 2)
	$oo:=New object
	$oo.subject:="mon premier e-mail "
	$oo.from:="contact@ainsilavie.fr"
	$oo.to:=""
	cs.$eMail.new().FixerAdresse($oo; "to")
	$oo.textBody:="Hello World"
	$oo.htmlBody:="<h1>Hello World</h1><h4>'Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...'</h4>"+\
		" <p>There are many variations of passages of Lorem Ipsum available."\
		+"The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.</p>"
	
	cs.$eMail.new().EnvoyerQuickMail($oo)
End if 


    

traceHandler - 23/12/2024 09:40:05

Capable de process préemptif

      cs._Trace.me.Intercepter()

    

COMPILER - 09/02/2026 10:19:58

      
//•••••  gestion de erreurs •••••


// variables des méthodes renvoyant $0 typé
var dataTexte : Text
var dataEntierLong : Integer
var dataDate : Date
var dataBooléen : Boolean


    

[class]_composant - 06/02/2026 17:57:32

      property trace : cs._Trace

Class constructor()
	
	This.trace:=cs._Trace.me
	
	
Function InitVariablesMAIL()
	// status
	// bit 0 : exécution dans base hote
	// bit 1 : est serveur Web
	
	var $data : Object
	
	Use (Storage)
		Storage["System"]:=New shared object
	End use 
	
	Use (Storage.System)
		// sert, rapidement, dans initExtensions
		Storage.System.Status:=0
		// sert, en particulier, pour les process de type monitoring
		Storage.System.ArrêtAPP:=False
		
		Storage.System.estExecuteDansHote:=False
	End use 
	
	// partager des ressources
	$data:=New object
	// fichier de ressources
	$data.chemin:=Get 4D folder(Current resources folder)+"DataMAIL.xml"
	// accès au worker du composant
	$data.nomWorker:="WK_Composant_MAIL"
	$data.méthodeWorker:="Installer eCourrier"
	// mémoriser
	cs.xSDK.ResourceALV.me.Inscrire(Est ressource MAIL; $data)
	
	
Function Installer()
	Use (Storage.System)
		Storage.System.estExécutéDansAPP:=cs.xSDK.EnvironnementALV.new().estExecuteDansAPP()
	End use 
	
	This.IntegerDansHote()
	
	
Function IntegerDansHote()
	// intégrer le composant dans la base hôte, pour les interfaces :
	If (Storage.System.estExecuteDansHote)
		// dans cette version rien à faire
		cs._Trace.me.EnvoyerMessages([msgk_event; msgk_log]; "Démarrage"; "Installer Courrier"; "Intégration dans base hôte")
		
		CALL WORKER("WK_Composant_MAIL"; Formula(initProcess); "[OK]")
	End if 
	
	
    

[class]$eMail - 02/06/2025 13:58:18

      property rsc : cs.xSDK.ResourceALV

Class extends _composant

Class constructor()
	
	Super()
	This.rsc:=cs.xSDK.ResourceALV.me
	
	
Function EnvoyerQuickMail($data : Object)
	var $hébergement; $identifiant; $MotDePasse; $attribut : Text
	var $smtp; $email; $status : Object
	var $transporter : 4D.SMTPTransporter
	var $c : Collection
	var $result : cs._Trace
	
	This.trace.Initialiser(Current method name)
	
	// information du serveur SMTP
	$hébergement:=""
	$identifiant:=""
	$MotDePasse:=""
	
	Case of 
		: (Asserted(This.rsc.SetVariable(Est ressource MAIL; "mail/adresseServeur"; Is text; ->$hébergement); "EnvoyerQuickMail : adresse mail serveur inconnue")=False)
		: (Asserted(This.rsc.SetVariable(Est ressource MAIL; "mail/authentificationUtilisateur"; Is text; ->$identifiant); "EnvoyerQuickMail : user authentification inconnu")=False)
		: (Asserted(This.rsc.SetVariable(Est ressource MAIL; "mail/authentificationMdP"; Is text; ->$MotDePasse); "EnvoyerQuickMail : mot de passe authentification inconnu")=False)
		Else 
			// c'est ok
			$smtp:=New object
			$smtp.host:=$hébergement  // Obligatoire
			$smtp.port:=465
			$smtp.user:=$identifiant
			$smtp.password:=$MotDePasse
			$smtp.logFile:="LogTest.txt"  // Historique étendu à sauvegarder dans le dossier Logs
			
			$transporter:=SMTP New transporter($smtp)
			
			// tester la présence des infos
			$email:=New object
			$c:=New collection("from"; "to"; "subject"; "textBody"; "htmlBody")
			This.trace.ErrorDescription:=""
			
			For each ($attribut; $c)
				If (OB Is defined($data; $attribut))
					// recopier
					$email[$attribut]:=$data[$attribut]
				Else 
					// initialiser
					$email[$attribut]:=""
					This.trace.Error:=-16502
					This.trace.ErrorDescription:=This.trace.ErrorDescription+"'"+$attribut+"'"+" est manquant - "
				End if 
			End for each 
			
			This.FixerAdresse($email; "from")
			This.FixerAdresse($email; "to")
			
			// en principe on a tout
			// on y va
			$status:=$transporter.send($email)
			This.trace.Error:=-16502*Num(Not($status.success))
			This.trace.ErrorDescription:=$status.statusText
	End case 
	
	This.trace.LeverException([msgk_event; msgk_log])
	
	
Function FixerAdresse($emailData : Object; $attribut : Text)
	// fixer les adresses Mail de la propriété $attribut de $emailData
	var $adresseEmail; $adresse; $identifiant : Text
	var $result : cs._Trace
	
	$result:=cs._Trace.me.Initialiser(Current method name)
	
	Case of 
		: (Not(OB Is defined($emailData; $attribut)))
			$result.Error:=-16501
			$result.ErrorDescription:="la propriété $attribut de $emailData n'existe pas"
			
		: (OB Get type($emailData; $attribut)=Is text)
			// calculer l'adresse Mail
			$adresse:=$emailData[$attribut]
			
			Case of 
					// contact du serveur Web
				: ($adresse="")
					This.rsc.SetVariable(Est ressource MAIL; "mail/contactServeur"; Is text; ->$identifiant)
					This.rsc.SetVariable(Est ressource MAIL; "mail/adresseMail"; Is text; ->$adresseEmail)
					$adresseEmail:=$identifiant+"@"+$adresseEmail
					
					// LogIn d'un UtilisateurALV
				: (Position("@"; $adresse)=0)
					// ajouter l'adresse hébergement
					This.rsc.SetVariable(Est Ressource APP; "mail/adresseMail"; Is text; ->$adresseEmail)
					$adresseEmail:=$adresse+"@"+$adresseEmail
					
				Else 
					// recopier
					$adresseEmail:=$adresse
			End case 
			$emailData[$attribut]:=$adresseEmail
			
			//: (OB Get type($emailData; $attribut)=Is object)
			
			//If ($emailData.getDataClass().getInfo().name="")
			//$result.ErrorDescription:="$emailData.$attribut n'est pas une entité de UtilisateursALV"
			
			//Else 
			//// on a une entité, normalement de UtilisateursALV
			//$adresseEmail:=$emailData[$attribut].Adresse_eMail
			//// remplacer par l'adresse
			//$emailData[$attribut]:=$adresseEmail
			//$result.Error:=0
			//End if 
			
		Else 
			$adresseEmail:=""
			$result.ErrorDescription:="type de $emailData.$attribut non reconnu"
	End case 
	
	$result.LeverException([msgk_event; msgk_log])
	
	
Function LireParametresSMTP($params : Object)
	var $hébergement; $identifiant; $MotDePasse : Text
	
	$hébergement:=""
	$identifiant:=""
	$MotDePasse:=""
	
	Case of 
		: (Asserted(This.rsc.SetVariable(Est ressource MAIL; "mail/adresseServeur"; Is text; ->$hébergement); Current method name+" : adresse mail serveur inconnue")=False)
		: (Asserted(This.rsc.SetVariable(Est ressource MAIL; "mail/authentificationUtilisateur"; Is text; ->$identifiant); Current method name+" : user authentification inconnu")=False)
		: (Asserted(This.rsc.SetVariable(Est ressource MAIL; "mail/authentificationMdP"; Is text; ->$MotDePasse); Current method name+" : mot de passe authentification inconnu")=False)
		Else 
			// c'est ok
			
			$params.smtp:=New object
			$params.smtp.host:=$hébergement  // Obligatoire
			$params.smtp.port:=465
			$params.smtp.user:=$identifiant
			$params.smtp.password:=$MotDePasse
	End case 
    

[class]_Trace - 30/12/2024 13:54:22

      property cible : cs.xSDK.Traces
property success : Boolean

singleton Class constructor()
	
	This.cible:=cs.xSDK.Traces.new()
	This.success:=False
	
	
Function set Error($numError : Integer)
	This.cible.Error:=$numError
	
Function get Error()->$result : Integer
	$result:=This.cible.Error
	
	
Function set ErrorDescription($description : Text)
	This.cible.ErrorDescription:=$description
	
Function get ErrorDescription()->$result : Text
	$result:=This.cible.ErrorDescription
	
	
Function Intercepter()
	ErrorNum:=This.cible.Intercepter("MAIL"; Error; Error method; Error line; Error formula)
	
	
Function Initialiser($nomMethode : Text)->$result : Object
	This.cible.CréerErreur("MAIL"; 0; $nomMethode; "")
	$result:=This
	
	
Function Créer($Error : Integer; $nomMethode : Text; $ErrorDescription : Text)->$result : Object
	This.cible.CréerErreur("MAIL"; $Error; $nomMethode; $ErrorDescription)
	$result:=This
	
	
Function FixerSuccess()
	This.cible.FixerSuccess()
	This.success:=This.cible.success
	
	
Function LeverException($options : Collection)
	// renseigner le label de l'erreur
	This.cible.ErrorLabel:=Localized string(String(This.cible.Error))
	// lancer le traitement de l'erreur
	This.cible.LeverException($options)
	
	
Function EnvoyerMessages($options : Collection; $libellé : Text; $source : Text; $description : Text)
	This.cible.EnvoyerMessages($options; "MAIL"; $libellé; $source; $description)
	
	
	
    

[ ]SF_Messagerie - 03/02/2023 14:33:48

      Pas de code
    

[ ]SF_Messagerie - objet ID connexion Messagerie - 07/12/2021 18:01:00

      
Editer Ressource Composant(Form; "IDconnexionMessagerie"; "mail/authentificationUtilisateur")

    

[ ]SF_Messagerie - objet adresseServeur - 03/02/2023 14:50:11

      
Editer Ressource Composant(Form; "adresseServeur"; "mail/adresseServeur")

    

[ ]SF_Messagerie - objet MdP connexion Messagerie - 07/12/2021 18:01:00

      
Editer Ressource Composant(Form; "MdPconnexionMessagerie"; "mail/authentificationMdP")

    

onStartup - 29/03/2025 17:19:43

      // ************
// Status
// bit 8 : exécution du serveur Web
// ************
// ne s'exécute pas dans une base hôte

ON ERR CALL(Formula(traceHandler).source; ek global)

// pour les tests hors base hôte
cs._composant.new().InitVariablesMAIL()

// pour les tests hors base hôte
CALL WORKER("WK_Composant_MAIL"; "initProcess")

    

onExit - 01/04/2025 19:51:37

      // ne s'exécute pas dans une base hôte

// exporter le code du composant si pas compilé
ON ERR CALL(Formula(traceHandler).source; ek local)

cs.xSDK.ExportCode4D.new().DémarrerComposant()


    

onHostDatabaseEvent - 06/02/2026 17:57:22

      #DECLARE($numEvent : Integer)

Case of 
	: ($numEvent=On before host database startup)
		
		ON ERR CALL(Formula(ErrorHandler).source; ek local)
		
		cs._composant.new().InitVariablesMAIL()
		
		Use (Storage.System)
			Storage.System.estExecuteDansHote:=True
		End use 
		
		// installer les ressources du composant
		Partager Ressources("Installer Ressources Composant"; New object("dossier"; Get 4D folder(Current resources folder); "IDnom"; "MAIL"))
		
		// déactiver les ASSERT si le composant est compilé (réactivable par les options d'appel du composant)
		SET ASSERT ENABLED(Not(Is compiled mode))
		CALL WORKER("WK_Composant_MAIL"; "initProcess")
		
	: ($numEvent=On after host database startup)
		// placer ici le code à exécuter après le "Sur ouverture" de la base hôte
		// à faire ici (storage.ressourcesALV est initialisé)
		ON ERR CALL(Formula(ErrorHandler).source; ek global)
		
		cs._composant.new().Installer()
		
		
	: ($numEvent=On before host database exit)
		// placer ici le code à exécuter avant le "Sur fermeture" de la base hôte
		
	: ($numEvent=On after host database exit)
		// placer ici le code à exécuter après le "Sur fermeture" de la base hôte
End case