Verified Commit fc7915ee authored by Korko's avatar Korko
Browse files

Improve email tracking system

parent 3d038a5b
Pipeline #377138 failed with stages
in 2 minutes and 45 seconds
......@@ -8,10 +8,13 @@ use App\Mail\DearSanta as DearSantaEmail;
use App\Models\DearSanta;
use App\Models\Mail as MailModel;
use App\Models\Participant;
use App\Traits\UpdatesMailDelivery;
use Metrics;
class DearSantaController extends Controller
{
use UpdatesMailDelivery;
public function view(Participant $participant)
{
return view('dearSanta', [
......@@ -21,6 +24,9 @@ class DearSantaController extends Controller
public function fetch(Participant $participant)
{
// The hash was validated in middleware so we can validate that the email was received
$this->updateDelivery($participant->mail, MailModel::RECEIVED);
return response()->json([
'participant' => $participant->only(['hash', 'name']),
'draw' => $participant->draw->mail_title,
......
<?php
namespace App\Http\Controllers;
use App\Models\Mail as MailModel;
use App\Traits\UpdatesMailDelivery;
use Illuminate\Http\Request;
class MailController extends Controller
{
use UpdatesMailDelivery;
public function updateStatus(MailModel $mail, Request $request)
{
$this->updateDelivery($mail, MailModel::RECEIVED, $request->route('version'));
return '';
}
}
......@@ -2,15 +2,16 @@
namespace App\Jobs;
use App\Mail\TrackedMailable;
use App\Models\Mail as MailModel;
use App\Services\EmailClient;
use App\Traits\UpdatesMailDelivery;
use Exception;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Webklex\PHPIMAP\Exceptions\MessageHeaderFetchingException;
use Webklex\PHPIMAP\Message as EmailMessage;
class ParseBounces implements ShouldQueue
......@@ -26,23 +27,37 @@ class ParseBounces implements ShouldQueue
{
$unseenMails = $emailClient->getUnseenMails();
foreach ($unseenMails as $unseenMail) {
$this->handleMail($unseenMail);
try {
$recipient = $this->getFirstRecipientAddress($unseenMail);
$unseenMail->move(config('imap.folders.trash'));
} catch(MessageHeaderFetchingException $e) {
// Ignore that error
}
}
}
// TODO: Determine depending on the bounce error, if the failure is temporary (4xx) or final (5xx)
// Auto-retry or not
$params = collect((array) sscanf(
$recipient,
str_replace('*', '%[0-9a-zA-Z]-%d', config('mail.return_path'))
));
protected function handleMail(EmailMessage $message): void
{
$recipient = $this->getFirstRecipientAddress($message);
$mail = MailModel::findByHashOrFail($params[0]);
$params = (array) sscanf(
$recipient,
str_replace('*', '%[a-z]-%[0-9a-zA-Z]-%d', config('mail.return_path'))
);
$this->updateDelivery($mail, MailModel::ERROR, $params[1]);
} catch (Exception $e) {
// Just ignore the exception
} finally {
$unseenMail->move(config('imap.folders.trash'));
if(!empty($params[0])) {
$mail = MailModel::findByHashOrFail($params[1]);
switch($params[0]) {
case TrackedMailable::BOUNCE:
// TODO: Determine depending on the bounce error, if the failure is temporary (4xx) or final (5xx)
// Auto-retry or not
$this->updateDelivery($mail, MailModel::ERROR, $params[2]);
break;
case TrackedMailable::CONFIRM:
$this->updateDelivery($mail, MailModel::RECEIVED, $params[2]);
break;
}
}
}
......@@ -52,10 +67,13 @@ class ParseBounces implements ShouldQueue
$recipient = collect($message->getTo())
->first();
if (! is_object($recipient)) {
throw new Exception('No recipient available');
}
return is_object($recipient) ? $recipient->mailbox : '';
}
protected function parseBounce($recipient): ?array
{
return $recipient->mailbox;
return $params[0] ? $params : null;
}
}
......@@ -7,18 +7,29 @@ use App\Jobs\UpdateMailDelivery;
use App\Models\Mail as MailModel;
use App\Traits\UpdatesMailDelivery;
use Illuminate\Foundation\Bus\DispatchesJobs;
use URL;
class TrackedMailable extends Mailable
{
use DispatchesJobs, UpdatesMailDelivery;
public $returnPath;
const BOUNCE = 'bounce';
const CONFIRM = 'confirm';
public $bounceReturnPath;
public $confirmReturnPath;
public $trackedPixel;
protected function track(MailModel $mail)
{
$this->store($mail);
$this->returnPath = str_replace('*', $mail->hash.'-'.$mail->version, config('mail.return_path'));
$this->bounceReturnPath = str_replace('*', self::BOUNCE.'-'.$mail->hash.'-'.$mail->version, config('mail.return_path'));
$this->confirmReturnPath = str_replace('*', self::CONFIRM.'-'.$mail->hash.'-'.$mail->version, config('mail.return_path'));
$this->trackedPixel = URL::signedRoute('pixel', [
'mail' => $mail,
'version' => $mail->version,
]);
}
public function failed()
......@@ -37,11 +48,16 @@ class TrackedMailable extends Mailable
{
$mail = $this->delayedUpdateDelivery(MailModel::SENDING);
dispatch((new UpdateMailDelivery($mail, MailModel::SENT))->delay(120));
dispatch((new UpdateMailDelivery($mail, MailModel::SENT))->delay(10));
$this->withSwiftMessage(function ($message) use ($mail) {
$message->getHeaders()->addPathHeader('Return-Path', $this->returnPath);
$message->getHeaders()->addDateHeader('X-Updated-At', $mail->updated_at);
// In case of Bounce
$message->getHeaders()->addPathHeader('Return-Path', $this->bounceReturnPath);
// To assert Reception
$message->getHeaders()->addPathHeader('X-Confirm-Reading-To', $this->confirmReturnPath);
$message->getHeaders()->addPathHeader('Return-Receipt-To', $this->confirmReturnPath);
$message->getHeaders()->addPathHeader('Disposition-Notification-To', $this->confirmReturnPath);
});
parent::send($mailer);
......
......@@ -13,9 +13,7 @@ class Draw extends Model
// Remove everything N weeks after the expiration_date
const WEEKS_BEFORE_DELETION = 3;
use HashId {
resolveRouteBinding as resolveHash;
}
use HashId;
protected $hashConnection = 'draw';
......@@ -70,22 +68,4 @@ class Draw extends Model
{
return $this->expires_at->addWeeks(self::WEEKS_BEFORE_DELETION);
}
/**
* Retrieve the model for a bound value.
*
* @param mixed $value
* @param string|null $field
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveRouteBinding($value, $field = null)
{
$draw = $field === 'hash' ?
$this->resolveHash($value) :
parent::resolveRouteBinding($value, $field);
abort_if($draw === null, 404);
return $draw;
}
}
......@@ -40,6 +40,12 @@ trait HashId
*/
public function resolveRouteBinding($value, $field = null)
{
return $this->findByHashOrFail($value);
$model = $field === 'hash' ?
$this->findByHashOrFail($value) :
parent::resolveRouteBinding($value, $field);
abort_if($model === null, 404);
return $model;
}
}
......@@ -32,12 +32,14 @@ class Mail extends Model
public const SENDING = 'sending';
public const SENT = 'sent';
public const ERROR = 'error';
public const RECEIVED = 'received';
public static $deliveryStatuses = [
self::CREATED,
self::SENDING,
self::SENT,
self::ERROR,
self::RECEIVED,
];
public function updateDeliveryStatus($status)
......
......@@ -11,7 +11,7 @@ class Participant extends Model
{
use Notifiable;
use HashId {
resolveRouteBinding as resolveHash;
resolveRouteBinding as public baseResolver;
}
protected $hashConnection = 'santa';
......@@ -91,11 +91,9 @@ class Participant extends Model
*/
public function resolveRouteBinding($value, $field = null)
{
$participant = $field === 'hash' ?
$this->resolveHash($value) :
parent::resolveRouteBinding($value, $field);
$participant = $this->baseResolver($value, $field);
abort_if($participant === null || $participant->draw->expired, 404);
abort_if($participant->draw->expired, 404);
return $participant;
}
......
This diff is collapsed.
......@@ -2296,7 +2296,8 @@ __webpack_require__.r(__webpack_exports__);
"created": "En attente d'envoi",
"sending": "Envoi en cours",
"sent": "Envoyé",
"error": "Erreur"
"error": "Erreur",
"received": "Reçu"
}
}
},
......@@ -2316,6 +2317,7 @@ __webpack_require__.r(__webpack_exports__);
"Je me suis trompé dans mon adresse email quand j'ai organisé mon secret santa, comment faire ?": "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"J'ai supprimé mon email d'accès au panneau d'organisateur, comment faire ?": "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"Je me suis trompé dans l'adresse d'un participant": "Lorsque vous avez organisé votre secret santa, vous avez dû recevoir un email avec un lien vers un panneau d'organisateur. Vous pourrez modifier l'adresse email de chaque participant depuis cette interface.",
"Un des participants n'a pas reçu l'email, que faire ?": "Alors même que l'adresse renseignée est bonne, il arrive que l'email se perde, finisse en spam ou qu'un problème survienne faisant que l'email n'est pas arrivé. Depuis votre panneau d'organisateur, vous pouvez retrouver un bouton à côté du status de réception de l'email du participant pour pouvoir réenvoyer le-dit email. Comme ça, le participant pourra enfin savoir qui est sa cible et comment parler à son Santa.",
"Quand sont supprimés mes données personnelles ?": "Toutes vos données d'un tirage sont supprimées 7 jours après la date d'expiration. Ce délai a été fixé afin d'envoyer à l'organisateur la liste des participants avec leur cible piochée par mail afin d'aider à l'organisation d'un secretsanta avec les mêmes personnes plus tard en évitant de retomber sur les mêmes cibles.",
"J'ai oublié un participant, comment je peux le rajouter ?": "Malheureusement, de par sa conception, SecretSanta.fr ne permet pas de rajouter quelqu'un une fois le tirage effectué. Il vous reste cependant une option, autre que relancer le tirage : vous pouvez attribuez à cette personne votre propre cible et offrir vous même un cadeau à ce nouveau participant.",
"Qui peut savoir la liste des cibles ?": "Pour faire court : personne. Pour faire long : "
......
......@@ -2124,6 +2124,7 @@ __webpack_require__.r(__webpack_exports__);
created: "fas fa-spinner",
sending: "fas fa-spinner",
sent: "fas fa-check",
received: "fas fa-check",
error: "fas fa-exclamation-triangle"
}[this.delivery_status];
}
......@@ -6866,7 +6867,7 @@ exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loa
 
 
// module
exports.push([module.i, "\n.input-group-append[data-v-babfc29a] {\n display: inline;\n margin-left: 10px;\n}\n.error[data-v-babfc29a] {\n color: red;\n}\n.sent[data-v-babfc29a] {\n color: green;\n}\n", ""]);
exports.push([module.i, "\n.input-group-append[data-v-babfc29a] {\n display: inline;\n margin-left: 10px;\n}\n.error[data-v-babfc29a] {\n color: red;\n}\n.sent[data-v-babfc29a] {\n color: orange;\n}\n.received[data-v-babfc29a] {\n color: green;\n}\n", ""]);
 
// exports
 
......@@ -19784,7 +19785,8 @@ __webpack_require__.r(__webpack_exports__);
"created": "En attente d'envoi",
"sending": "Envoi en cours",
"sent": "Envoyé",
"error": "Erreur"
"error": "Erreur",
"received": "Reçu"
}
}
},
......@@ -19804,6 +19806,7 @@ __webpack_require__.r(__webpack_exports__);
"Je me suis trompé dans mon adresse email quand j'ai organisé mon secret santa, comment faire ?": "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"J'ai supprimé mon email d'accès au panneau d'organisateur, comment faire ?": "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"Je me suis trompé dans l'adresse d'un participant": "Lorsque vous avez organisé votre secret santa, vous avez dû recevoir un email avec un lien vers un panneau d'organisateur. Vous pourrez modifier l'adresse email de chaque participant depuis cette interface.",
"Un des participants n'a pas reçu l'email, que faire ?": "Alors même que l'adresse renseignée est bonne, il arrive que l'email se perde, finisse en spam ou qu'un problème survienne faisant que l'email n'est pas arrivé. Depuis votre panneau d'organisateur, vous pouvez retrouver un bouton à côté du status de réception de l'email du participant pour pouvoir réenvoyer le-dit email. Comme ça, le participant pourra enfin savoir qui est sa cible et comment parler à son Santa.",
"Quand sont supprimés mes données personnelles ?": "Toutes vos données d'un tirage sont supprimées 7 jours après la date d'expiration. Ce délai a été fixé afin d'envoyer à l'organisateur la liste des participants avec leur cible piochée par mail afin d'aider à l'organisation d'un secretsanta avec les mêmes personnes plus tard en évitant de retomber sur les mêmes cibles.",
"J'ai oublié un participant, comment je peux le rajouter ?": "Malheureusement, de par sa conception, SecretSanta.fr ne permet pas de rajouter quelqu'un une fois le tirage effectué. Il vous reste cependant une option, autre que relancer le tirage : vous pouvez attribuez à cette personne votre propre cible et offrir vous même un cadeau à ce nouveau participant.",
"Qui peut savoir la liste des cibles ?": "Pour faire court : personne. Pour faire long : "
......
......@@ -2712,7 +2712,8 @@ __webpack_require__.r(__webpack_exports__);
"created": "En attente d'envoi",
"sending": "Envoi en cours",
"sent": "Envoyé",
"error": "Erreur"
"error": "Erreur",
"received": "Reçu"
}
}
},
......@@ -2732,6 +2733,7 @@ __webpack_require__.r(__webpack_exports__);
"Je me suis trompé dans mon adresse email quand j'ai organisé mon secret santa, comment faire ?": "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"J'ai supprimé mon email d'accès au panneau d'organisateur, comment faire ?": "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"Je me suis trompé dans l'adresse d'un participant": "Lorsque vous avez organisé votre secret santa, vous avez dû recevoir un email avec un lien vers un panneau d'organisateur. Vous pourrez modifier l'adresse email de chaque participant depuis cette interface.",
"Un des participants n'a pas reçu l'email, que faire ?": "Alors même que l'adresse renseignée est bonne, il arrive que l'email se perde, finisse en spam ou qu'un problème survienne faisant que l'email n'est pas arrivé. Depuis votre panneau d'organisateur, vous pouvez retrouver un bouton à côté du status de réception de l'email du participant pour pouvoir réenvoyer le-dit email. Comme ça, le participant pourra enfin savoir qui est sa cible et comment parler à son Santa.",
"Quand sont supprimés mes données personnelles ?": "Toutes vos données d'un tirage sont supprimées 7 jours après la date d'expiration. Ce délai a été fixé afin d'envoyer à l'organisateur la liste des participants avec leur cible piochée par mail afin d'aider à l'organisation d'un secretsanta avec les mêmes personnes plus tard en évitant de retomber sur les mêmes cibles.",
"J'ai oublié un participant, comment je peux le rajouter ?": "Malheureusement, de par sa conception, SecretSanta.fr ne permet pas de rajouter quelqu'un une fois le tirage effectué. Il vous reste cependant une option, autre que relancer le tirage : vous pouvez attribuez à cette personne votre propre cible et offrir vous même un cadeau à ce nouveau participant.",
"Qui peut savoir la liste des cibles ?": "Pour faire court : personne. Pour faire long : "
......
......@@ -1981,6 +1981,7 @@ __webpack_require__.r(__webpack_exports__);
created: "fas fa-spinner",
sending: "fas fa-spinner",
sent: "fas fa-check",
received: "fas fa-check",
error: "fas fa-exclamation-triangle"
}[this.delivery_status];
}
......@@ -8743,7 +8744,7 @@ exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loa
 
 
// module
exports.push([module.i, "\n.input-group-append[data-v-babfc29a] {\n display: inline;\n margin-left: 10px;\n}\n.error[data-v-babfc29a] {\n color: red;\n}\n.sent[data-v-babfc29a] {\n color: green;\n}\n", ""]);
exports.push([module.i, "\n.input-group-append[data-v-babfc29a] {\n display: inline;\n margin-left: 10px;\n}\n.error[data-v-babfc29a] {\n color: red;\n}\n.sent[data-v-babfc29a] {\n color: orange;\n}\n.received[data-v-babfc29a] {\n color: green;\n}\n", ""]);
 
// exports
 
......@@ -22382,7 +22383,8 @@ __webpack_require__.r(__webpack_exports__);
"created": "En attente d'envoi",
"sending": "Envoi en cours",
"sent": "Envoyé",
"error": "Erreur"
"error": "Erreur",
"received": "Reçu"
}
}
},
......@@ -22402,6 +22404,7 @@ __webpack_require__.r(__webpack_exports__);
"Je me suis trompé dans mon adresse email quand j'ai organisé mon secret santa, comment faire ?": "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"J'ai supprimé mon email d'accès au panneau d'organisateur, comment faire ?": "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"Je me suis trompé dans l'adresse d'un participant": "Lorsque vous avez organisé votre secret santa, vous avez dû recevoir un email avec un lien vers un panneau d'organisateur. Vous pourrez modifier l'adresse email de chaque participant depuis cette interface.",
"Un des participants n'a pas reçu l'email, que faire ?": "Alors même que l'adresse renseignée est bonne, il arrive que l'email se perde, finisse en spam ou qu'un problème survienne faisant que l'email n'est pas arrivé. Depuis votre panneau d'organisateur, vous pouvez retrouver un bouton à côté du status de réception de l'email du participant pour pouvoir réenvoyer le-dit email. Comme ça, le participant pourra enfin savoir qui est sa cible et comment parler à son Santa.",
"Quand sont supprimés mes données personnelles ?": "Toutes vos données d'un tirage sont supprimées 7 jours après la date d'expiration. Ce délai a été fixé afin d'envoyer à l'organisateur la liste des participants avec leur cible piochée par mail afin d'aider à l'organisation d'un secretsanta avec les mêmes personnes plus tard en évitant de retomber sur les mêmes cibles.",
"J'ai oublié un participant, comment je peux le rajouter ?": "Malheureusement, de par sa conception, SecretSanta.fr ne permet pas de rajouter quelqu'un une fois le tirage effectué. Il vous reste cependant une option, autre que relancer le tirage : vous pouvez attribuez à cette personne votre propre cible et offrir vous même un cadeau à ce nouveau participant.",
"Qui peut savoir la liste des cibles ?": "Pour faire court : personne. Pour faire long : "
......
......@@ -11483,7 +11483,8 @@ __webpack_require__.r(__webpack_exports__);
"created": "En attente d'envoi",
"sending": "Envoi en cours",
"sent": "Envoyé",
"error": "Erreur"
"error": "Erreur",
"received": "Reçu"
}
}
},
......@@ -11503,6 +11504,7 @@ __webpack_require__.r(__webpack_exports__);
"Je me suis trompé dans mon adresse email quand j'ai organisé mon secret santa, comment faire ?": "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"J'ai supprimé mon email d'accès au panneau d'organisateur, comment faire ?": "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"Je me suis trompé dans l'adresse d'un participant": "Lorsque vous avez organisé votre secret santa, vous avez dû recevoir un email avec un lien vers un panneau d'organisateur. Vous pourrez modifier l'adresse email de chaque participant depuis cette interface.",
"Un des participants n'a pas reçu l'email, que faire ?": "Alors même que l'adresse renseignée est bonne, il arrive que l'email se perde, finisse en spam ou qu'un problème survienne faisant que l'email n'est pas arrivé. Depuis votre panneau d'organisateur, vous pouvez retrouver un bouton à côté du status de réception de l'email du participant pour pouvoir réenvoyer le-dit email. Comme ça, le participant pourra enfin savoir qui est sa cible et comment parler à son Santa.",
"Quand sont supprimés mes données personnelles ?": "Toutes vos données d'un tirage sont supprimées 7 jours après la date d'expiration. Ce délai a été fixé afin d'envoyer à l'organisateur la liste des participants avec leur cible piochée par mail afin d'aider à l'organisation d'un secretsanta avec les mêmes personnes plus tard en évitant de retomber sur les mêmes cibles.",
"J'ai oublié un participant, comment je peux le rajouter ?": "Malheureusement, de par sa conception, SecretSanta.fr ne permet pas de rajouter quelqu'un une fois le tirage effectué. Il vous reste cependant une option, autre que relancer le tirage : vous pouvez attribuez à cette personne votre propre cible et offrir vous même un cadeau à ce nouveau participant.",
"Qui peut savoir la liste des cibles ?": "Pour faire court : personne. Pour faire long : "
......
......@@ -16,6 +16,7 @@
created: "fas fa-spinner",
sending: "fas fa-spinner",
sent: "fas fa-check",
received: "fas fa-check",
error: "fas fa-exclamation-triangle"
}[this.delivery_status];
}
......@@ -42,6 +43,9 @@
color: red;
}
.sent {
color: orange;
}
.received {
color: green;
}
</style>
\ No newline at end of file
......@@ -21,7 +21,8 @@ export default {
"created": "En attente d'envoi",
"sending": "Envoi en cours",
"sent": "Envoyé",
"error": "Erreur"
"error": "Erreur",
"received": "Reçu"
}
}
},
......@@ -41,6 +42,7 @@ export default {
"Je me suis trompé dans mon adresse email quand j'ai organisé mon secret santa, comment faire ?": "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"J'ai supprimé mon email d'accès au panneau d'organisateur, comment faire ?": "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"Je me suis trompé dans l'adresse d'un participant": "Lorsque vous avez organisé votre secret santa, vous avez dû recevoir un email avec un lien vers un panneau d'organisateur. Vous pourrez modifier l'adresse email de chaque participant depuis cette interface.",
"Un des participants n'a pas reçu l'email, que faire ?": "Alors même que l'adresse renseignée est bonne, il arrive que l'email se perde, finisse en spam ou qu'un problème survienne faisant que l'email n'est pas arrivé. Depuis votre panneau d'organisateur, vous pouvez retrouver un bouton à côté du status de réception de l'email du participant pour pouvoir réenvoyer le-dit email. Comme ça, le participant pourra enfin savoir qui est sa cible et comment parler à son Santa.",
"Quand sont supprimés mes données personnelles ?": "Toutes vos données d'un tirage sont supprimées 7 jours après la date d'expiration. Ce délai a été fixé afin d'envoyer à l'organisateur la liste des participants avec leur cible piochée par mail afin d'aider à l'organisation d'un secretsanta avec les mêmes personnes plus tard en évitant de retomber sur les mêmes cibles.",
"J'ai oublié un participant, comment je peux le rajouter ?": "Malheureusement, de par sa conception, SecretSanta.fr ne permet pas de rajouter quelqu'un une fois le tirage effectué. Il vous reste cependant une option, autre que relancer le tirage : vous pouvez attribuez à cette personne votre propre cible et offrir vous même un cadeau à ce nouveau participant.",
"Qui peut savoir la liste des cibles ?": "Pour faire court : personne. Pour faire long : "
......
......@@ -26,6 +26,7 @@ return [
'sending' => 'Envoi en cours',
'sent' => 'Envoyé',
'error' => 'Erreur',
'received' => 'Reçu',
],
],
];
......@@ -18,6 +18,7 @@ return [
"Je me suis trompé dans mon adresse email quand j'ai organisé mon secret santa, comment faire ?" => "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"J'ai supprimé mon email d'accès au panneau d'organisateur, comment faire ?" => "Pour corriger ce problème, soit vous organizer un autre tirage, soit vous demandez à un des participant de vous transmettre l'adresse web qui lui permet d'écrire à son père noël secret et vous l'envoyez par mail à l'adresse suivante : help@secretsanta.fr. Après vérification et durant son temps libre, le développeur pourra peut-être vous aider.",
"Je me suis trompé dans l'adresse d'un participant" => "Lorsque vous avez organisé votre secret santa, vous avez dû recevoir un email avec un lien vers un panneau d'organisateur. Vous pourrez modifier l'adresse email de chaque participant depuis cette interface.",
"Un des participants n'a pas reçu l'email, que faire ?" => "Alors même que l'adresse renseignée est bonne, il arrive que l'email se perde, finisse en spam ou qu'un problème survienne faisant que l'email n'est pas arrivé. Depuis votre panneau d'organisateur, vous pouvez retrouver un bouton à côté du status de réception de l'email du participant pour pouvoir réenvoyer le-dit email. Comme ça, le participant pourra enfin savoir qui est sa cible et comment parler à son Santa.",
'Quand sont supprimés mes données personnelles ?' => "Toutes vos données d'un tirage sont supprimées 7 jours après la date d'expiration. Ce délai a été fixé afin d'envoyer à l'organisateur la liste des participants avec leur cible piochée par mail afin d'aider à l'organisation d'un secretsanta avec les mêmes personnes plus tard en évitant de retomber sur les mêmes cibles.",
"J'ai oublié un participant, comment je peux le rajouter ?" => "Malheureusement, de par sa conception, SecretSanta.fr ne permet pas de rajouter quelqu'un une fois le tirage effectué. Il vous reste cependant une option, autre que relancer le tirage : vous pouvez attribuez à cette personne votre propre cible et offrir vous même un cadeau à ce nouveau participant.",
'Qui peut savoir la liste des cibles ?' => 'Pour faire court : personne. Pour faire long : ',
......
@extends('emails/layout')
@extends('emails/tracked_layout')
@section('content')
<tr>
<td class="h2" style="font-size:35px; line-height:46px; text-align:center; font-style:italic; padding-bottom:15px;">
Message de {{ $targetName }}
</td>
<td class="h2" style="font-size:35px; line-height:46px; text-align:center; font-style:italic; padding-bottom:15px;">
Message de {{ $targetName }}
</td>
</tr>
<tr>
<td style="text-align:center; font-style:italic; padding-bottom:15px;">
<td style="text-align:center; font-style:italic; padding-bottom:15px;">
<p style="border:1px solid #000000;background-color:#dddddd;">Ceci est un message automatique, merci de ne pas y répondre.</p>
<p style="border:1px solid #000000;background-color:#dddddd;">Ceci est un message automatique, merci de ne pas y répondre.</p>
<blockquote>{!! nl2br(htmlentities( $content )) !!}</blockquote>
<blockquote>{!! nl2br(htmlentities( $content )) !!}</blockquote>
<hr />
<hr />
<p style="padding-bottom:10px !important">Secrètement votre,</p>
<p style="padding-bottom:10px !important">Secrètement votre,</p>
<p><a href="{{ config('app.url') }}">{{ config('app.name') }}</a></p>
<p><a href="{{ config('app.url') }}">{{ config('app.name') }}</a></p>
</td>
</td>
</tr>
@endsection
Ceci est un message automatique, merci de ne pas y répondre.
---
@extends('emails/layout_plain')
@section('content')
{{ $content }}
---
Secrètement votre,
{{ config('app.name') }} - {{ config('app.url') }}
@endsection
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment