Skip to content
Snippets Groups Projects
Commit aefd43b6 authored by Thibaut Vallee's avatar Thibaut Vallee
Browse files

Merge branch '5.x' of https://git.unicaen.fr/lib/unicaen/mail into HEAD

parents a5867580 98479089
No related branches found
No related tags found
No related merge requests found
Pipeline #23302 passed
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/mail.iml" filepath="$PROJECT_DIR$/.idea/mail.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MessDetectorOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PHPCSFixerOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PHPCodeSnifferOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.0" />
<component name="PhpStanOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PsalmOptionsConfiguration">
<option name="transferred" value="true" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
\ No newline at end of file
6.0.6
* Possibilité de désactiver l'envoi de mail
* "do_not_send" est renommé en "redirect"
* un nouveau paramètre "do_not_send" n'envoie pas le mail
\ No newline at end of file
create table unicaen_mail_mail create table if not exists unicaen_mail_mail
( (
id serial not null constraint umail_pkey primary key, id serial not null constraint umail_pkey primary key,
date_envoi timestamp not null, date_envoi timestamp not null,
...@@ -11,7 +11,4 @@ create table unicaen_mail_mail ...@@ -11,7 +11,4 @@ create table unicaen_mail_mail
log text log text
); );
create unique index ummail_id_uindex on unicaen_mail_mail (id); create unique index if not exists ummail_id_uindex on unicaen_mail_mail (id);
\ No newline at end of file
-- MAIL -- MAIL
INSERT INTO unicaen_privilege_categorie (id ,code, libelle, ordre, namespace) VALUES (next_val('unicaen_privilege_categorie_id_seq'), 'mail', 'UnicaenMail - Gestion des mails', 9000, 'UnicaenMail\Provider\Privilege'); INSERT INTO UNICAEN_PRIVILEGE_CATEGORIE (
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'mail_index', 'Affichage de l''index', 10); CODE,
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'mail_afficher', 'Afficher un mail', 20); LIBELLE,
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'mail_reenvoi', 'Ré-envoi d''un mail', 30); NAMESPACE,
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'mail_supprimer', 'Suppression d''un mail', 40); ORDRE)
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'mail_test', 'Envoi d''un mail de test', 100); values
\ No newline at end of file ('mail', 'UnicaenMail - Gestion des mails', 'UnicaenMail\Provider\Privilege', 1051)
ON CONFLICT (CODE) DO
UPDATE SET
LIBELLE=excluded.LIBELLE,
NAMESPACE=excluded.NAMESPACE,
ORDRE=excluded.ORDRE;
WITH d(code, lib, ordre) AS (
SELECT 'mail_index', 'Affichage de l''index', 1 UNION
SELECT 'mail_afficher', 'Afficher un mail', 2 UNION
SELECT 'mail_reenvoi', 'Ré-envoi d''un mail', 30 UNION
SELECT 'mail_supprimer', 'Suppression d''un mail', 4 UNION
SELECT 'mail_test', 'Envoi d''un mail de test', 5
)
INSERT INTO unicaen_privilege_privilege(CATEGORIE_ID, CODE, LIBELLE, ORDRE)
SELECT cp.id, d.code, d.lib, d.ordre
FROM d
JOIN unicaen_privilege_categorie cp ON cp.CODE = 'mail'
ON CONFLICT (CATEGORIE_ID, CODE) DO
UPDATE SET
LIBELLE=excluded.LIBELLE,
ORDRE=excluded.ORDRE;
insert into unicaen_privilege_privilege_role_linker
(role_id, privilege_id)
(select role.id, privilege.id from unicaen_utilisateur_role role,
unicaen_privilege_privilege privilege
join unicaen_privilege_categorie cp on privilege.categorie_id = cp.id
where role.role_id = 'Admin_tech'
and cp.code in('mail'))
on conflict do nothing;
\ No newline at end of file
<?php <?php
/** /**
* Configuration locale du module UnicaenMail. * Configuration locale du module UnicaenMail.
*
* If you have a ./config/autoload/ directory set up for your project,
* drop this config file in it and change the values as you wish.
*/ */
use UnicaenMail\Entity\Db\Mail; use UnicaenMail\Entity\Db\Mail;
return [ return [
'unicaen-mail' => [ 'unicaen-mail' => [
/** /**
* Classe de entité * Classe de entité
**/ **/
...@@ -21,16 +23,36 @@ return [ ...@@ -21,16 +23,36 @@ return [
'port' => 'XX', 'port' => 'XX',
], ],
/** /**
* Adresses des redirection si do_not_send est à true * Adresses des redirections si do_not_send est à true
*/ */
'module' => [
'default' => [
'redirect_to' => ['XXX@XXX.XX',], 'redirect_to' => ['XXX@XXX.XX',],
'do_not_send' => true, 'do_not_send' => true,
'redirect' => true,
/**
* Configuration de l'expéditeur
*/
'subject_prefix' => 'XXX', 'subject_prefix' => 'XXX',
'from_name' => 'XXX : XXXX XX XXXXXXX', 'from_name' => 'XXX | XXXXX',
'from_email' => 'ne-pas-repondre@XXXX.XX' 'from_email' => 'XXX@XXX.XX',
], ],
/** On peut ajouter un clef de module pour la référencer dans la méthode sendMail afin d'exploiter les données passée en valeur. */
// 'MonPetitModule' => [
// 'redirect_to' => ['XXX@XXX.XX',],
// 'do_not_send' => true,
// 'subject_prefix' => 'Mes petit module',
// 'from_name' => 'mon-ptit-module',
// 'from_email' => 'assistance.mon-petit-module@XXX.XX',
// ]
]
],
'server_url' => 'https://xxx.xxx',
// 'service_manager' => [
// 'delegators' => [
// TreeRouteStack::class => [
// TreeRouteStackConsoleDelegatorFactory::class,
// ],
// ]
// ],
]; ];
...@@ -90,6 +90,7 @@ return [ ...@@ -90,6 +90,7 @@ return [
*/ */
'redirect_to' => ['john-doe@mail.fr', ], 'redirect_to' => ['john-doe@mail.fr', ],
'do_not_send' => true, 'do_not_send' => true,
'redirect' => true,
/** /**
* Configuration de l'expéditeur * Configuration de l'expéditeur
......
...@@ -39,9 +39,11 @@ class MailController extends AbstractActionController { ...@@ -39,9 +39,11 @@ class MailController extends AbstractActionController {
return ['title' => "Envoyer un mail de test", 'error' => "L'adresse mail saisie n'est pas valide."]; return ['title' => "Envoyer un mail de test", 'error' => "L'adresse mail saisie n'est pas valide."];
} }
$mail = $this->getMailService()->sendMail($data['mail-to'], 'Mail de test', 'Ceci est un mail de test. <br/> <hr/>Merci de ne pas en tenir compte.'); $mail = $this->getMailService()->sendMail($data['mail-to'], 'Mail de test', 'Ceci est un mail de test. <br/> <hr/>Merci de ne pas en tenir compte.');
if ($mail){
$mail->setMotsClefs(['TEST']); $mail->setMotsClefs(['TEST']);
$this->getMailService()->update($mail); $this->getMailService()->update($mail);
} }
}
return ['title' => "Envoyer un mail de test"]; return ['title' => "Envoyer un mail de test"];
} }
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<entity name="UnicaenMail\Entity\Db\Mail" table="unicaen_mail_mail"> <entity name="UnicaenMail\Entity\Db\Mail" table="unicaen_mail_mail">
<id name="id" type="integer" column="id"> <id name="id" type="integer" column="id">
<generator strategy="IDENTITY"/> <generator strategy="AUTO"/>
</id> </id>
<field name="dateEnvoi" type="datetime" column="date_envoi" nullable="false"/> <field name="dateEnvoi" type="datetime" column="date_envoi" nullable="false"/>
......
<?php
namespace UnicaenMail\Exception;
use Exception;
class NotFoundConfigException extends Exception {}
\ No newline at end of file
...@@ -16,6 +16,7 @@ use Laminas\Mime\Message as MimeMessage; ...@@ -16,6 +16,7 @@ use Laminas\Mime\Message as MimeMessage;
use Laminas\Mime\Mime; use Laminas\Mime\Mime;
use Laminas\Mime\Part; use Laminas\Mime\Part;
use Laminas\Mvc\Controller\AbstractActionController; use Laminas\Mvc\Controller\AbstractActionController;
use UnicaenMail\Exception\NotFoundConfigException;
/** /**
* @property EntityManager $objectManager * @property EntityManager $objectManager
...@@ -24,6 +25,7 @@ class MailService { ...@@ -24,6 +25,7 @@ class MailService {
use ProvidesObjectManager; use ProvidesObjectManager;
private ?string $entityClass = null; private ?string $entityClass = null;
private array $config = [];
/** /**
* @param string $entityClass * @param string $entityClass
...@@ -35,6 +37,11 @@ class MailService { ...@@ -35,6 +37,11 @@ class MailService {
return $this; return $this;
} }
public function setConfig(array $config) : void
{
$this->config = $config;
}
public function createMailEntity() : Object public function createMailEntity() : Object
{ {
$entity = new $this->entityClass(); $entity = new $this->entityClass();
...@@ -42,45 +49,10 @@ class MailService { ...@@ -42,45 +49,10 @@ class MailService {
} }
private ?TransportInterface $transport; private ?TransportInterface $transport;
private array $redirectTo;
private bool $doNotSend;
/** information sur l'expediteur */
private ?string $fromName;
private ?string $fromEmail;
private ?string $subjectPrefix;
public function __construct(TransportInterface $transport, $redirectTo, $doNotSend, $fromName, $fromEmail, $subjectPrefix) public function __construct(TransportInterface $transport)
{ {
$this->transport = $transport; $this->transport = $transport;
$this->redirectTo = $redirectTo;
$this->doNotSend = $doNotSend;
$this->fromName=$fromName;
$this->fromEmail=$fromEmail;
$this->subjectPrefix=$subjectPrefix;
}
public function setRedirectTo(?array $redirectTo): void
{
$this->redirectTo = $redirectTo;
}
public function setDoNotSend(bool $doNotSend): void
{
$this->doNotSend = $doNotSend;
}
public function setFromName(?string $fromName): void
{
$this->fromName = $fromName;
}
public function setFromEmail(?string $fromEmail): void
{
$this->fromEmail = $fromEmail;
}
public function setSubjectPrefix(?string $subjectPrefix): void
{
$this->subjectPrefix = $subjectPrefix;
} }
/** GESTION DES ENTITES *******************************************************************************************/ /** GESTION DES ENTITES *******************************************************************************************/
...@@ -156,7 +128,7 @@ class MailService { ...@@ -156,7 +128,7 @@ class MailService {
try { try {
$result = $qb->getQuery()->getOneOrNullResult(); $result = $qb->getQuery()->getOneOrNullResult();
} catch (NonUniqueResultException $e) { } catch (NonUniqueResultException $e) {
throw new RuntimeException("Plusieurs Mail partagent le même id [".$id."]"); throw new RuntimeException("Plusieurs Mail partagent le même id [".$id."]",0,$e);
} }
return $result; return $result;
} }
...@@ -171,14 +143,38 @@ class MailService { ...@@ -171,14 +143,38 @@ class MailService {
/** FACADE ********************************************************************************************************/ /** FACADE ********************************************************************************************************/
/** /**
* @param $to * @throws NotFoundConfigException
* @param $subject
* @param $texte
* @param null $attachement_path
* @return Mail
*/ */
public function sendMail($to, $subject, $texte, $attachement_path = null) : Mail public function fetchValueFromConfig(string $key, ?string $module = null)
{ {
$config = $this->config['module'];
$value = ($module)?$config[$module][$key]:null;
if ($value === null) $value = $config['default'][$key];
if ($value === null) $value = $config[$key];
if ($value === null) {
throw new NotFoundConfigException("Aucun valeur de trouver dans la configuration de UnicaenMail pour la clef [".$key."]");
}
return $value;
}
/**
* @throws NotFoundConfigException
*/
public function sendMail($to, $subject, $texte, ?string $module = null, $attachement_path = null) : ?Mail
{
$fromEmail = $this->fetchValueFromConfig('from_email', $module);
$fromName = $this->fetchValueFromConfig('from_name', $module);
$doNotSend = $this->fetchValueFromConfig('do_not_send', $module);
$redirect = $this->fetchValueFromConfig('redirect', $module);
$redirectTo = $this->fetchValueFromConfig('redirect_to', $module);
$subjectPrefix = $this->fetchValueFromConfig('subject_prefix', $module);
if ($doNotSend === true)
{
return null;
}
if (is_string($to)) $to=explode(',', $to); if (is_string($to)) $to=explode(',', $to);
if (!is_array($to)) $to = [$to]; if (!is_array($to)) $to = [$to];
...@@ -187,36 +183,34 @@ class MailService { ...@@ -187,36 +183,34 @@ class MailService {
$mail->setDateEnvoi(new DateTime()); $mail->setDateEnvoi(new DateTime());
$mail->setStatusEnvoi(Mail::PENDING); $mail->setStatusEnvoi(Mail::PENDING);
$mail->setDestinataires(is_array($to) ? implode(",", $to) : $to); $mail->setDestinataires(is_array($to) ? implode(",", $to) : $to);
$initialTo = $to; if ($redirect) {
if ($this->doNotSend) {
$mail->setDestinatairesInitials(implode(",",$to)); $mail->setDestinatairesInitials(implode(",",$to));
$mail->setDestinataires(implode(",",$this->redirectTo)); $mail->setDestinataires(implode(",", $redirectTo));
$to = $this->redirectTo;
} else { } else {
$mail->setDestinataires(implode(",",$to)); $mail->setDestinataires(implode(",",$to));
} }
$mail->setSujet($subject); $mail->setSujet($subject);
$sujet = '['.$this->subjectPrefix.'] ' . $subject; $sujet = '['.$subjectPrefix.'] ' . $subject;
if ($this->doNotSend) { if ($redirect) {
$sujet .= ' {REDIR}'; $sujet .= ' {REDIR}';
} }
// echo substr($subject, 88) ." : ini=".count($initialTo) . "/ cur=". count($to)."\n";
// foreach ($initialTo as $item) echo $item . "\n";
// echo "\n";
$message = (new Message())->setEncoding('UTF-8'); $message = (new Message())->setEncoding('UTF-8');
$message->setFrom($this->fromEmail, $this->fromName); $message->setFrom($fromEmail, $fromName);
if ($redirect) {
$message->setTo($redirectTo);
} else {
$message->setTo($to); $message->setTo($to);
}
$message->setSubject($sujet); $message->setSubject($sujet);
$texte = "<p><i>Ce courrier électronique vous a été adressé <strong>automatiquement</strong> par l'application ".$this->subjectPrefix.". </i></p>" . $texte; $texte = "<p><i>Ce courrier électronique vous a été adressé <strong>automatiquement</strong> par l'application ".$subjectPrefix.". </i></p>" . $texte;
$mail->setCorps($texte); $mail->setCorps($texte);
$this->create($mail); $this->create($mail);
if ($this->doNotSend) { if ($redirect) {
$texte .= "<br/><br/><hr/><br/>"; $texte .= "<br/><br/><hr/><br/>";
$texte .= "Initialement envoyé à :"; $texte .= "Initialement envoyé à :";
$texte .= "<ul>"; $texte .= "<ul>";
...@@ -248,6 +242,12 @@ class MailService { ...@@ -248,6 +242,12 @@ class MailService {
$body->setParts($parts); $body->setParts($parts);
$message->setBody($body); $message->setBody($body);
// var_dump($fromEmail);
// var_dump($fromName);
// var_dump($doNotSend);
// var_dump($redirectTo);
// var_dump($subjectPrefix);
// die();
$this->transport->send($message); $this->transport->send($message);
$mail->setStatusEnvoi(Mail::SUCCESS); $mail->setStatusEnvoi(Mail::SUCCESS);
...@@ -256,6 +256,7 @@ class MailService { ...@@ -256,6 +256,7 @@ class MailService {
return $mail; return $mail;
} }
/** TODO : Le reenvoi ne tient pas compte du module ... */
public function reenvoi(Mail $mail) : Mail public function reenvoi(Mail $mail) : Mail
{ {
//todo les pieces jointes //todo les pieces jointes
......
...@@ -27,10 +27,8 @@ class MailServiceFactory { ...@@ -27,10 +27,8 @@ class MailServiceFactory {
*/ */
$entityManager = $container->get('doctrine.entitymanager.orm_default'); $entityManager = $container->get('doctrine.entitymanager.orm_default');
$service = new MailService($transport, $service = new MailService($transport);
$config['redirect_to'], $config['do_not_send'], $service->setConfig($config);
$config['from_name'], $config['from_email'], $config['subject_prefix']
);
$service->setEntityClass($config['mail_entity_class']); $service->setEntityClass($config['mail_entity_class']);
$service->setObjectManager($entityManager); $service->setObjectManager($entityManager);
return $service; return $service;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment