summaryrefslogtreecommitdiff
path: root/lib/Minz
diff options
context:
space:
mode:
authorGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2019-08-15 17:19:12 +0200
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2019-08-15 17:19:12 +0200
commitde26531178c61c98dcb7b7634c9e5891c302f615 (patch)
tree9f425a4bd20959ee3452806955035e2c2c46e08c /lib/Minz
parent20c38d7083b188a70ac78362cc6af4c521a479c3 (diff)
tec: Provide a Minz_Mailer class (#2476)
* Add Minz_View::_path method (replace change_view) The `_path` method is more powerful since it allows to choose the file extension. It is also Minz_Request-agnostic, which is useful to reuse the Minz_View class in other places. `change_view` is now deprecated and a warning is logged if we use it. * Provide a Minz_Mailer to send emails It uses PHPMailer under the hood and only supports PHP >= 5.5
Diffstat (limited to 'lib/Minz')
-rw-r--r--lib/Minz/ActionController.php4
-rw-r--r--lib/Minz/Mailer.php117
-rw-r--r--lib/Minz/View.php21
3 files changed, 133 insertions, 9 deletions
diff --git a/lib/Minz/ActionController.php b/lib/Minz/ActionController.php
index 232a4ef9b..123b9054c 100644
--- a/lib/Minz/ActionController.php
+++ b/lib/Minz/ActionController.php
@@ -14,7 +14,9 @@ class Minz_ActionController {
* Constructeur
*/
public function __construct () {
- $this->view = new Minz_View ();
+ $this->view = new Minz_View();
+ $view_path = Minz_Request::controllerName() . '/' . Minz_Request::actionName() . '.phtml';
+ $this->view->_path($view_path);
$this->view->attributeParams ();
}
diff --git a/lib/Minz/Mailer.php b/lib/Minz/Mailer.php
new file mode 100644
index 000000000..0e88f71d9
--- /dev/null
+++ b/lib/Minz/Mailer.php
@@ -0,0 +1,117 @@
+<?php
+
+use PHPMailer\PHPMailer\PHPMailer;
+use PHPMailer\PHPMailer\Exception;
+
+require LIB_PATH . '/PHPMailer/PHPMailer.php';
+require LIB_PATH . '/PHPMailer/Exception.php';
+require LIB_PATH . '/PHPMailer/SMTP.php';
+
+/**
+ * Allow to send emails.
+ *
+ * The Minz_Mailer class must be inherited by classes under app/Mailers.
+ * They work similarly to the ActionControllers in the way they have a view to
+ * which you can pass params (eg. $this->view->foo = 'bar').
+ *
+ * The view file is not determined automatically, so you have to select one
+ * with, for instance:
+ *
+ * ```
+ * $this->view->_path('user_mailer/email_need_validation.txt')
+ * ```
+ *
+ * Minz_Mailer uses the PHPMailer library under the hood. The latter requires
+ * PHP >= 5.5 to work. If you instantiate a Minz_Mailer with PHP < 5.5, a
+ * warning will be logged.
+ *
+ * The email is sent by calling the `mail` method.
+ */
+class Minz_Mailer {
+ /**
+ * The view attached to the mailer.
+ * You should set its file with `$this->view->_path($path)`
+ *
+ * @var Minz_View
+ */
+ protected $view;
+
+ /**
+ * Constructor.
+ *
+ * If PHP version is < 5.5, a warning is logged.
+ */
+ public function __construct () {
+ if (version_compare(PHP_VERSION, '5.5') < 0) {
+ Minz_Log::warning('Minz_Mailer cannot be used with a version of PHP < 5.5.');
+ }
+
+ $this->view = new Minz_View();
+ $this->view->_layout(false);
+ $this->view->attributeParams();
+
+ $conf = Minz_Configuration::get('system');
+ $this->mailer = $conf->mailer;
+ $this->smtp_config = $conf->smtp;
+
+ // According to https://github.com/PHPMailer/PHPMailer/wiki/SMTP-Debugging#debug-levels
+ // we should not use debug level above 2 unless if we have big trouble
+ // to connect.
+ if ($conf->environment === 'development') {
+ $this->debug_level = 2;
+ } else {
+ $this->debug_level = 0;
+ }
+ }
+
+ /**
+ * Send an email.
+ *
+ * @param string $to The recipient of the email
+ * @param string $subject The subject of the email
+ *
+ * @return bool true on success, false if a SMTP error happens
+ */
+ public function mail($to, $subject) {
+ ob_start();
+ $this->view->render();
+ $body = ob_get_contents();
+ ob_end_clean();
+
+ $mail = new PHPMailer(true);
+ try {
+ // Server settings
+ $mail->SMTPDebug = $this->debug_level;
+ $mail->Debugoutput = 'error_log';
+
+ if ($this->mailer === 'smtp') {
+ $mail->isSMTP();
+ $mail->Hostname = $this->smtp_config['hostname'];
+ $mail->Host = $this->smtp_config['host'];
+ $mail->SMTPAuth = $this->smtp_config['auth'];
+ $mail->Username = $this->smtp_config['username'];
+ $mail->Password = $this->smtp_config['password'];
+ $mail->SMTPSecure = $this->smtp_config['secure'];
+ $mail->Port = $this->smtp_config['port'];
+ } else {
+ $mail->isMail();
+ }
+
+ // Recipients
+ $mail->setFrom($this->smtp_config['from']);
+ $mail->addAddress($to);
+
+ // Content
+ $mail->isHTML(false);
+ $mail->CharSet = 'utf-8';
+ $mail->Subject = $subject;
+ $mail->Body = $body;
+
+ $mail->send();
+ return true;
+ } catch (Exception $e) {
+ Minz_Log::error('Minz_Mailer cannot send a message: ' . $mail->ErrorInfo);
+ return false;
+ }
+ }
+}
diff --git a/lib/Minz/View.php b/lib/Minz/View.php
index 6f044c98e..5b6676690 100644
--- a/lib/Minz/View.php
+++ b/lib/Minz/View.php
@@ -26,22 +26,27 @@ class Minz_View {
* Constructeur
* Détermine si on utilise un layout ou non
*/
- public function __construct () {
- $this->change_view(Minz_Request::controllerName(),
- Minz_Request::actionName());
-
+ public function __construct() {
$this->_layout(self::LAYOUT_DEFAULT);
$conf = Minz_Configuration::get('system');
self::$title = $conf->title;
}
/**
- * Change le fichier de vue en fonction d'un controller / action
+ * [deprecated] Change the view file based on controller and action.
*/
public function change_view($controller_name, $action_name) {
- $this->view_filename = self::VIEWS_PATH_NAME . '/'
- . $controller_name . '/'
- . $action_name . '.phtml';
+ Minz_Log::warning('Minz_View::change_view is deprecated, it will be removed in a future version. Please use Minz_View::_path instead.');
+ $this->_path($controller_name. '/' . $action_name . '.phtml');
+ }
+
+ /**
+ * Change the view file based on a pathname relative to VIEWS_PATH_NAME.
+ *
+ * @param string $path the new path
+ */
+ public function _path($path) {
+ $this->view_filename = self::VIEWS_PATH_NAME . '/' . $path;
}
/**