定制 sprintcube/cakephp-sendgrid 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

sprintcube/cakephp-sendgrid

Composer 安装命令:

composer require sprintcube/cakephp-sendgrid

包简介

SendGrid plugin for CakePHP 4 - Send emails using SendGrid API

README 文档

README

CI codecov Software License Latest Stable Version Total Downloads

This plugin provides email delivery using SendGrid.

This branch is for use with CakePHP 5.0+. For other versions of CakePHP, please use the following version map.

SendGrid Plugin Branch CakePHP Core
1.x [EOL] cake-3.x 3.4+
4.x cake-4.x 4.0+
5.x (in progress) master 5.0+

Requirements

This plugin has the following requirements:

  • CakePHP 5.0 or greater.
  • PHP 8.1 or greater.

Installation

You can install this plugin into your CakePHP application using composer.

composer require sprintcube/cakephp-sendgrid

After installation, Load the plugin

Plugin::load('SendGrid');

Or, you can load the plugin using the shell command

$ bin/cake plugin load SendGrid

Setup

Set your SendGrid Api key in EmailTransport settings in app.php

'EmailTransport' => [
...
  'sendgrid' => [
      'className' => 'SendGrid.SendGrid',
      'apiKey' => 'your-api-key' // your api key
  ]
]

And create new delivery profile in Email settings.

'Email' => [
    'default' => [
        'transport' => 'default',
        'from' => 'you@localhost',
        //'charset' => 'utf-8',
        //'headerCharset' => 'utf-8',
    ],
    'sendgrid' => [
        'transport' => 'sendgrid'
    ]
]

Usage

You can now simply use the CakePHP Email to send an email via SendGrid.

$email = new SendGridMailer();
$email->setFrom(['you@yourdomain.com' => 'CakePHP SendGrid'])
    ->setTo('foo@example.com.com')
    ->addTo('bar@example.com')
    ->addCc('john@example.com')
    ->setSubject('Email from CakePHP SendGrid plugin')
    ->deliver('Message from CakePHP SendGrid plugin');

That is it.

Advance Use

You can also use few more options to send email via SendGrid APIs. To do so, just call the appropriate methods before sending the email.

Custom Headers

You can pass your own headers. It must be prefixed with "X-". Use the default Email::setHeaders method like,

$email = new SendGridMailer();
$email->setFrom(['you@yourdomain.com' => 'CakePHP SendGrid'])
    ->setTo('foo@example.com.com')
    ->setHeaders([
        'X-Custom' => 'headervalue',
        'X-MyHeader' => 'myvalue'
    ])
    ->setSubject('Email from CakePHP SendGrid plugin')
    ->deliver('Message from CakePHP SendGrid plugin');

When sending request, X- will be removed from header name e.g. X-MyHeader will become MyHeader

Attachments

Set your attachments using Email::setAttachments method.

$email = new SendGridMailer();
$email->setFrom(['you@yourdomain.com' => 'CakePHP SendGrid'])
    ->setTo('foo@example.com.com')
    ->setSubject('Email from CakePHP SendGrid plugin')
    ->setAttachments([
        'cake_icon1.png' => Configure::read('App.imageBaseUrl') . 'cake.icon.png',
        'cake_icon2.png' => ['file' => Configure::read('App.imageBaseUrl') . 'cake.icon.png'],
        WWW_ROOT . 'favicon.ico'
    ])
    ->deliver('Message from CakePHP SendGrid plugin');

To send inline attachment, use contentId parameter while setting attachment.

Template

You can use the template created in SendGrid backend. Get the template id by either using their API or from the URL. Set the template id using setTemplate method.

$email = new SendGridMailer();
$email->setTo('foo@example.com.com')
    ->setTemplate('d-xxxxxx')
    ->deliver();

Schedule

You can schedule the email to be sent in future date. You can set upto 72 hours in future as per SendGrid documentation. You need to pass a unix timestamp value.

$email = new SendGridMailer();
$email->setTo('foo@example.com.com')
    ->setSendAt(1649500630)
    ->deliver();

Webhooks

You can receive status events from SendGrid. This allows you ensure that SendGrid was able to send the email recording bounces etc.

Webhook Config

You will require a Table in the database to record the emails sent. You can use the lorenzo/cakephp-email-queue plugin to queue the emails and in that case you would use the email_queue table. However you can create your own table/Model as long as it has at least three columns. They can be called anything but they must have the correct types.

When you send the email the deliver function will return an array with a 'messageId' element if it successfully connected to SendGrid. This needs to be recorded in the status_id field.

  • status_id VARCHAR(100)
  • status VARCHAR(100)
  • status_message TEXT

You need to map this table and these fields in you app_local.php config

    'sendgridWebhook' => [
        'tableClass' => 'EmailQueue', // The table name that stores email data
        'uniqueIdField' => 'status_id', // The field name that stores the unique message ID VARCHAR(100)
        'statusField' => 'status', // The field name that stores the status of the email status VARCHAR(100)
        'statusMessageField' => 'status_message', // The field name that stores the status messages TEXT
        'debug' => 'true', // write incoming requests to debug log
        'secure' => 'true', // enable SendGrid signed webhook security. You should enable this in production
        'verification_key' => '<YOUR VERIFICATION KEY>', // The verification key from SendGrid
    ],

You will need to login to your SendGrid Account and configure your domain and the events that you want to track

https://app.sendgrid.com/settings/mail_settings/webhook_settings

The return url needs to be set to

The CSRF protection middleware needs to allow posts to the webhooks controller in Application.php Remove the current CSRF protection middleware and replace it with the following. If you already have CSRF exceptions then add the Webhooks one

  $csrf = new CsrfProtectionMiddleware();

  $csrf->skipCheckCallback(function ($request) {
         // Skip token check for API URLs.
        if ($request->getParam('controller') === 'Webhooks') {
           return true;
          }
  });

    // Ensure routing middleware is added to the queue before CSRF protection middleware.
  $middlewareQueue->add($csrf);

  return $middlewareQueue;

If the authentication plugin (https://book.cakephp.org/authentication/3/en/index.html) is used for authentication the webhook action should work OK. If you have a different authentication method then you will need to add an exception for the webhook action. /send-grid/webhooks/index

Webhook Signature Verification

SendGrid allows you to sign the webhook requests. This is a good idea in production to keep the webhook secure. You will need to enable this in your SendGrid account and then set secure to true and add your verification key to your app_local.php config file.

https://docs.sendgrid.com/for-developers/tracking-events/getting-started-event-webhook-security-features. Enable signed event webhook and follow the instructions to get the verification key.

Reporting Issues

If you have a problem with this plugin or any bug, please open an issue on GitHub.

sprintcube/cakephp-sendgrid 适用场景与选型建议

sprintcube/cakephp-sendgrid 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 54.78k 次下载、GitHub Stars 达 5, 最近一次更新时间为 2018 年 09 月 26 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「email」 「cakephp」 「sendgrid」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 sprintcube/cakephp-sendgrid 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 sprintcube/cakephp-sendgrid 我们能提供哪些服务?
定制开发 / 二次开发

基于 sprintcube/cakephp-sendgrid 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 54.78k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 5
  • 点击次数: 7
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 5
  • Watchers: 2
  • Forks: 7
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2018-09-26