From 7408fbb595056a9fe58bf41bfee450a87970c44c Mon Sep 17 00:00:00 2001 From: smarcet Date: Thu, 11 Apr 2019 11:25:20 -0300 Subject: [PATCH] Migrated Mail from native to Sendgrid API Change-Id: I751c20bdf77bd9612633f97a4ad61c47227def90 --- .env.example | 7 +- app/Http/Utils/Log/LaravelMailerHandler.php | 188 ++++++++++++++++++++ app/Providers/AppServiceProvider.php | 8 +- composer.json | 19 +- config/app.php | 1 + config/log.php | 5 +- config/services.php | 4 + 7 files changed, 211 insertions(+), 21 deletions(-) create mode 100644 app/Http/Utils/Log/LaravelMailerHandler.php diff --git a/.env.example b/.env.example index 6da2e962..5c8b9130 100644 --- a/.env.example +++ b/.env.example @@ -36,11 +36,8 @@ SESSION_COOKIE_SECURE=false QUEUE_DRIVER=sync -MAIL_DRIVER=smtp -MAIL_HOST=mailtrap.io -MAIL_PORT=2525 -MAIL_USERNAME=null -MAIL_PASSWORD=null +MAIL_DRIVER=sendgrid +SENDGRID_API_KEY='YOUR_SENDGRID_API_KEY' CORS_ALLOWED_HEADERS=origin, content-type, accept, authorization, x-requested-with CORS_ALLOWED_METHODS=GET, POST, OPTIONS, PUT, DELETE diff --git a/app/Http/Utils/Log/LaravelMailerHandler.php b/app/Http/Utils/Log/LaravelMailerHandler.php new file mode 100644 index 00000000..73b77ffe --- /dev/null +++ b/app/Http/Utils/Log/LaravelMailerHandler.php @@ -0,0 +1,188 @@ +from = $from; + $this->to = is_array($to) ? $to : array($to); + $this->subject = $subject; + $this->addHeader(sprintf('From: %s', $from)); + $this->maxColumnWidth = $maxColumnWidth; + } + + /** + * Add headers to the message + * + * @param string|array $headers Custom added headers + * @return self + */ + public function addHeader($headers) + { + foreach ((array) $headers as $header) { + if (strpos($header, "\n") !== false || strpos($header, "\r") !== false) { + throw new \InvalidArgumentException('Headers can not contain newline characters for security reasons'); + } + $this->headers[] = $header; + } + + return $this; + } + + /** + * Add parameters to the message + * + * @param string|array $parameters Custom added parameters + * @return self + */ + public function addParameter($parameters) + { + $this->parameters = array_merge($this->parameters, (array) $parameters); + + return $this; + } + + /** + * {@inheritdoc} + */ + protected function send($content, array $records) + { + $content = wordwrap($content, $this->maxColumnWidth); + + $subject = $this->subject; + if ($records) { + $subjectFormatter = new LineFormatter($this->subject); + $subject = $subjectFormatter->format($this->getHighestRecord($records)); + } + + foreach ($this->to as $to) { + Mail::raw($content, function(Message $message) use($to, $subject, $content){ + $message + ->to($to) + ->subject($subject) + ->setBody($content, 'text/html') + ->setFrom($this->from); + }); + } + } + + /** + * @return string $contentType + */ + public function getContentType() + { + return $this->contentType; + } + + /** + * @return string $encoding + */ + public function getEncoding() + { + return $this->encoding; + } + + /** + * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML + * messages. + * @return self + */ + public function setContentType($contentType) + { + if (strpos($contentType, "\n") !== false || strpos($contentType, "\r") !== false) { + throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection'); + } + + $this->contentType = $contentType; + + return $this; + } + + /** + * @param string $encoding + * @return self + */ + public function setEncoding($encoding) + { + if (strpos($encoding, "\n") !== false || strpos($encoding, "\r") !== false) { + throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection'); + } + + $this->encoding = $encoding; + + return $this; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 86ea2446..a46f699c 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -14,10 +14,9 @@ use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Log; use Illuminate\Support\ServiceProvider; -use Monolog\Handler\NativeMailerHandler; use Illuminate\Support\Facades\Validator; use Validators\CustomValidator; - +use App\Http\Utils\Log\LaravelMailerHandler; /** * Class AppServiceProvider * @package App\Providers @@ -43,9 +42,8 @@ class AppServiceProvider extends ServiceProvider $from = Config::get('log.from_email'); if (!empty($to) && !empty($from)) { - - $subject = 'openstackid error'; - $handler = new NativeMailerHandler($to, $subject, $from); + $subject = Config::get('log.email_subject', 'openstackid-resource-server error'); + $handler = new LaravelMailerHandler($to, $subject, $from); $handler->setLevel(Config::get('log.email_level', 'error')); $logger->pushHandler($handler); } diff --git a/composer.json b/composer.json index 682ff18c..ea0f1e66 100644 --- a/composer.json +++ b/composer.json @@ -13,22 +13,23 @@ "type": "project", "require": { "php": "^7.1.3", + "ext-json": "*", + "ext-pdo": "*", "fideloper/proxy": "^4.0", - "laravel/framework": "5.6.*", - "laravel/tinker": "^1.0", - "zendframework/zend-crypt": "3.3.0", - "zendframework/zend-math": "3.1.1", - "ircmaxell/random-lib": "1.1.*", + "glenscott/url-normalizer": "1.4.*", "greggilbert/recaptcha": "2.1.*", "guzzlehttp/guzzle": "6.3.3", - "smarcet/jose4php": "dev-feature/php7.2-migration", - "glenscott/url-normalizer": "1.4.*", + "ircmaxell/random-lib": "1.1.*", "jenssegers/agent": "2.3.*", + "laravel/framework": "5.6.*", + "laravel/tinker": "^1.0", "laravelcollective/html": "5.6.*", "phpseclib/phpseclib": "2.0.11", "predis/predis": "1.0.*", - "ext-json":"*", - "ext-pdo":"*" + "s-ichikawa/laravel-sendgrid-driver": "^2.0", + "smarcet/jose4php": "dev-feature/php7.2-migration", + "zendframework/zend-crypt": "3.3.0", + "zendframework/zend-math": "3.1.1" }, "require-dev": { "filp/whoops": "^2.0", diff --git a/config/app.php b/config/app.php index c9cce3de..d9bbc9ff 100644 --- a/config/app.php +++ b/config/app.php @@ -153,6 +153,7 @@ return [ Collective\Html\HtmlServiceProvider::class, \Providers\OAuth2\ClientAuthContextValidatorFactoryProvider::class, Greggilbert\Recaptcha\RecaptchaServiceProvider::class, + Sichikawa\LaravelSendgridDriver\SendgridTransportServiceProvider::class, ], /* diff --git a/config/log.php b/config/log.php index 8f8ad7bd..03d97d14 100644 --- a/config/log.php +++ b/config/log.php @@ -20,6 +20,7 @@ return array( //The sender of the mail 'from_email' => env('LOG_EMAIL_FROM'), //Log Level (debug, info, notice, warning, error, critical, alert) - 'level' => env('LOG_LEVEL', 'error'), - 'email_level' => env('LOG_EMAIL_LEVEL', 'error'), + 'level' => env('LOG_LEVEL', 'error'), + 'email_level' => env('LOG_EMAIL_LEVEL', 'error'), + 'email_subject' => env('LOG_EMAIL_SUBJECT', ''), ); \ No newline at end of file diff --git a/config/services.php b/config/services.php index 287b1186..06f9e7a1 100644 --- a/config/services.php +++ b/config/services.php @@ -35,4 +35,8 @@ return [ 'secret' => env('STRIPE_SECRET'), ], + 'sendgrid' => [ + 'api_key' => env('SENDGRID_API_KEY'), + ], + ];