localtools / laravel-gmail
Laravel 的 Gmail API 包
Requires
- php: ^8.0
- ext-json: *
- google/apiclient: ^2.14
- illuminate/auth: ^9.0|^10.0|^11.0
- illuminate/config: ^9.0|^10.0|^11.0
- illuminate/database: ^9.0|^10.0|^11.0
- illuminate/routing: ^9.0|^10.0|^11.0
- illuminate/session: ^9.0|^10.0|^11.0
- illuminate/support: ^9.0|^10.0|^11.0
- symfony/mime: ^5.4|^6.0
Requires (Dev)
- google/apiclient-services: ^0.300.0
- mockery/mockery: ^1.0
- orchestra/testbench: ^v4.18.0|^v5.20.0|^v6.25.0|^8.0
- php-http/guzzle7-adapter: ^1.0
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^9.3|^10.4
- squizlabs/php_codesniffer: ~3.4
- typesense/typesense-php: ^4.9.2
Suggests
- google/apiclient-services: Required to use the Google API services (^0.300).
- orchestra/testbench: Required to use the Orchestra Testbench (^v4.18|^v5.20|^v6.25|^8.0).
- php-http/guzzle7-adapter: Required to use the Guzzle 7 adapter (^1.0).
- phpstan/phpstan: Required to use the PHPStan (^1.10).
- typesense/typesense-php: Required to use the Typesense engine (^4.9).
README
本项目是 dacastro4/laravel-gmail 的分支
Gmail
Laravel 10 的 Gmail API
您需要在 Google Console 中创建一个应用程序。请参考这里的指南。
需求
- PHP ^8.0
- Laravel 10
安装
运行 composer update 来拉取最新版本。
或者运行
composer require localtools/laravel-gmail
现在打开 config/app.php
文件并将服务提供者添加到 providers 数组中。
'providers' => [ Localtools\LaravelGmail\LaravelGmailServiceProvider::class, ]
现在添加别名。
'aliases' => [ 'LaravelGmail' => Localtools\LaravelGmail\Facade\LaravelGmail::class, ]
对于 laravel >=5.5,这样就完成了。此包支持 Laravel 新的 Package Discovery。
为了与 <= PHP 7.4 兼容,请使用版本 v5.0
从 5.0 迁移到 6.0
需要 Laravel 9,并且您需要将依赖项更改为 "laravel/laravel": "^9.0"
请参考从 8.x 升级到 9.0 的指南
从 4.0 迁移到 5.0
需要 Laravel 8,并且您需要将依赖项更改为 "laravel/laravel": "^8.0"
请参考从 7.x 升级到 8.0 的指南
从 3.0 迁移到 4.0
需要 Laravel 7,并且您需要将依赖项更改为 "laravel/laravel": "^7.0"
请参考从 6.x 升级到 7.0 的指南
从 2.0 迁移到 3.0
需要 Laravel 6,并且您只需要将依赖项更改为 "laravel/laravel": "^6.0"
从 1.0 迁移到 2.0
唯一更改的是多凭据功能。
- 将您的 composer.json 从
"localtools/laravel-gmail": "^1.0"
更改为"localtools/laravel-gmail": "^2.0"
我必须更改版本,因为存在一个错误,这可能会破坏调用这些属性的应用程序。
所有包含单词 "threat" 的变量都更改为 "thread"(是的,我知道……对不起)
邮件类 $threatId
=> $threadId
可回复类 $mail->setReplyThreat()
=> $mail->setReplyThread()
等等。
从 0.6 迁移到 1.0
唯一更改的是多凭据功能。
- 将您的 composer.json 从
"localtools/laravel-gmail": "^0.6"
更改为"localtools/laravel-gmail": "^1.0"
如果您不需要多用户凭据,您不需要执行任何其他操作;如果您需要,您将需要再次登录以创建每个用户的新的凭据文件。
配置
您只需在您的 .env
文件中设置以下变量,然后就可以开始了。
GOOGLE_PROJECT_ID= GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= GOOGLE_REDIRECT_URI= GOOGLE_ALLOW_MULTIPLE_CREDENTIALS GOOGLE_ALLOW_JSON_ENCRYPT
要修改作用域和凭据文件名,只需运行
运行 php artisan vendor:publish --provider="Localtools\LaravelGmail\LaravelGmailServiceProvider"
并修改配置文件 config/gmail.php
。
允许多用户凭据
要允许多用户凭据,请在您的配置文件中将 allow_multiple_credentials
更改为 true
或在您不使用配置文件的情况下设置 .env 变量 GOOGLE_ALLOW_MULTIPLE_CREDENTIALS
为 true。
允许对 JSON 文件进行加密
要允许对json文件进行加密,请在配置文件中将allow_json_encrypt
设置为true
,或者如果您没有使用配置文件,请将.env变量GOOGLE_ALLOW_JSON_ENCRYPT
设置为true。
可用的作用域
- all (在Gmail作用域中不存在,我已添加。)
- compose
- insert
- labels
- metadata
- modify
- readonly
- send
- settings_basic
- settings_sharing
注意:要更改作用域,用户必须注销并重新登录。
额外的作用域
如果您出于某种原因需要添加额外的作用域。
在config/gmail.php中按URL样式添加额外的作用域。
'additional_scopes' => [
'https://www.googleapis.com/auth/drive',
'https://www.googleapis.com/auth/documents',
'https://www.googleapis.com/auth/spreadsheets'
],
示例
欢迎Blade
<body> <h1>{{ LaravelGmail::user() }}</h1> @if(LaravelGmail::check()) <a href="{{ url('oauth/gmail/logout') }}">logout</a> @else <a href="{{ url('oauth/gmail') }}">login</a> @endif </body>
路由
Route::get('/oauth/gmail', function (){ return LaravelGmail::redirect(); }); Route::get('/oauth/gmail/callback', function (){ LaravelGmail::makeToken(); return redirect()->to('/'); }); Route::get('/oauth/gmail/logout', function (){ LaravelGmail::logout(); //It returns exception if fails return redirect()->to('/'); });
然后在您的控制器或您想要执行逻辑的地方,您可以这样做:
$messages = LaravelGmail::message()->subject('test')->unread()->preload()->all(); foreach ( $messages as $message ) { $body = $message->getHtmlBody(); $subject = $message->getSubject(); }
注意:如果您没有预加载消息,您必须这样做: $body = $message->load()->getSubject();
然后您不必再次调用它。
分页
使用$messages->hasNextPage()
来检查是否有下一页可用。使用$messages->next()
来获取下一页的结果,它使用与加载第一页时相同的参数(每页结果、过滤器等)。使用$messages->getPageToken()
来获取下一页令牌的唯一标识符。这在将结果存储在缓存中时创建唯一的标识符很有用。一般来说,使用API进行分页是一种不好的做法。它很慢且成本高昂。因此,建议在页之间检索缓存的结果,并且只有在必须时才刷新缓存。
文档
基本
LaravelGmail::getAuthUrl
获取用户认证的URL。
LaravelGmail::redirect
您可以使用此直接方法 <a href="{{ LaravelGmail::redirect() }}">登录</a>
LaravelGmail::makeToken()
将AccessToken设置并保存到json文件中(在回调中很有用)
LaravelGmail::logout
注销用户
LaravelGmail::check
检查用户是否已登录
LaravelGmail::setUserId($account_id)->makeToken()
为$account_id设置并保存AccessToken(自v5.1.2添加)
发送
use Localtools\LaravelGmail\Services\Message\Mail;
...
$mail = new Mail;
对于to
、from
、cc
和bcc
,您可以设置一个包含电子邮件和名称的数组,或者设置一个包含电子邮件和名称的字符串。
$mail->using( $token )
如果您不想使用令牌文件,可以使用此函数来设置请求中要使用的令牌。它不会刷新。
$mail->to( $to, $name = null )
设置收件人电子邮件和名称,名称为可选
$mail->from( $from, $name = null )
设置发送者的电子邮件
$mail->cc( $cc, $name = null )
设置抄送
$mail->bcc( $bcc, $name = null )
设置密送
$mail->subject( $subject )
设置电子邮件的主题
$mail->message( $message )
设置电子邮件正文
$mail->view( 'view.name', $dataArray )
从blade文件设置正文
$mail->markdown( 'view.name', $dataArray )
从markdown文件设置正文
$mail->attach( ...$path )
向电子邮件添加文件附件
$mail->priority( $priority )
设置电子邮件优先级,从1到5
$mail->reply()
回复现有电子邮件
$mail->send()
发送新电子邮件
$mail->setHeader( $header, $value )
设置电子邮件头
邮件
$mail->getId
返回电子邮件的ID
$mail->getInternalDate
返回UNIX格式的日期
$mail->getDate
从电子邮件头返回Carbon日期
$mail->getLabels
返回电子邮件的所有标签的数组
$mail->getHeaders
返回头的集合。每个头都是一个包含两行的数组,键和值
$mail->getSubject
返回主题的字符串
$mail->getFrom
返回包含发送者名称和电子邮件的数组
$mail->getFromName
返回名称的字符串
$mail->getFromEmail
返回电子邮件字符串
$mail->getTo
返回包含所有收件人姓名和电子邮件的数组
$mail->getDeliveredTo
返回接收者的电子邮件地址
$mail->getPlainTextBody
返回电子邮件的纯文本版本
$mail->getRawPlainTextBody
返回基于base64加密的正文原始版本
$mail->hasAttachments
如果电子邮件包含附件,则返回布尔值
$mail->load
加载电子邮件的所有信息(标签、正文、标题)。您在一个单独的电子邮件上调用此函数。要从开头加载,请参阅 preload()
$mail->getHeader( $headerName, $regex = null )
返回具有名称的标题。可选地,您可以在值上执行正则表达式
标签
$mail->markAsRead
从电子邮件中删除“未读”标签。
$mail->markAsUnread
向电子邮件添加“未读”标签。
$mail->markAsImportant
向电子邮件添加“重要”标签。
$mail->markAsNotImportant
从电子邮件中删除“重要”标签。
$mail->addStar
向电子邮件添加“星标”标签。
$mail->removeStar
从电子邮件中删除“星标”标签。
$mail->sendToTrash
向电子邮件添加“垃圾邮件”标签。
$mail->removeFromTrash
从电子邮件中删除“垃圾邮件”标签。
$mail->addLabel($string|$array)
向电子邮件添加多个或单个标签
$mail->removeLabel($string|$array)
从电子邮件中删除多个或单个标签
$mail->getAttachments()
获取电子邮件上的所有附件集合
$mail->getAttachmentsWithData()
获取电子邮件上的所有附件集合,包括数据
列表
:列出电子邮件的所有标签
https://developers.google.com/gmail/api/reference/rest/v1/users.labels/list
示例
$mailbox = new LaravelGmailClass(config(), $account->id); $labels = $mailbox->labelsList($userEmail);
创建
:在电子邮件上使用标签名称创建新标签
https://developers.google.com/gmail/api/reference/rest/v1/users.labels/create
示例
$mailbox = new LaravelGmailClass(config(), LaravelGmail::user()); $label = new \Google_Service_Gmail_Label($this); $label->setMessageListVisibility('show'); `show || hide` $label->setLabelListVisibility('labelShow'); `labelShow || labelShowIfUnread || labelHide` $label->setName('labelName'); $mailbox->createLabel($userEmail, $label);
FirstOrCreateLabel
:如果不存在,则在电子邮件上使用标签名称创建新标签
https://developers.google.com/gmail/api/reference/rest/v1/users.labels/create
示例
$mailbox = new LaravelGmailClass(config(), LaravelGmail::user()); $label = new \Google_Service_Gmail_Label($this); $label->setMessageListVisibility('show'); `show || hide` $label->setLabelListVisibility('labelShow'); `labelShow || labelShowIfUnread || labelHide` $label->setName('labelName'); $mailbox->firstOrCreateLabel($userEmail, $label);
附件
use Localtools\LaravelGmail\Services\Message\Attachment
...
$attachment = new Attachment;
$attachment->getId
返回附件的ID
$attachment->getFileName
返回附件的文件名
$attachment->getMimeType
返回MIME类型,例如:application/pdf
$attachment->getSize
返回附件的大小(字节)
$attachment->getData
从附件获取所有信息。如果您调用 getAttachmentsWithData
,则不需要此方法。
$attachment->saveAttachmentTo($path = null, $filename = null, $disk = 'local')
在存储文件夹中保存附件。您可以传递路径、名称和使用磁盘。
消息
LaravelGmail::message()->all( $pageToken = null )
返回收件箱中的所有电子邮件
LaravelGmail::message()->take(2)->all( $pageToken = null )
take
方法通过设置的数字限制查询返回的电子邮件数量
LaravelGmail::message()->get( $id )
返回具有所有信息的单个电子邮件
修饰符
您可以使用这些方法修改您的查询。例如
获取所有未读电子邮件:LaravelGmail::message()->unread()->all()
message()->unread()
message()->from( $email )
message()->in( $box = 'inbox' )
message()->hasAttachment()
message()->subject($subject)
->after($date)
和 ->before($date)
message()->raw($query)
用于自定义查询
所有可能的过滤器都在 Filterable 特性
当然,您可以使用流畅的API。
LaravelGmail::message() ->from('someone@gmail.com') ->unread() ->in('TRASH') ->hasAttachment() ->all()
附件
use Localtools\LaravelGmail\Services\Message\Attachment
...
$attachment = new Attachment;
$attachment->getId
返回附件的ID
$attachment->getFileName
返回附件的文件名
$attachment->getMimeType
返回MIME类型,例如:application/pdf
$attachment->getSize
返回附件的大小(字节)
$attachment->getData
从附件获取所有信息。如果您调用 getAttachmentsWithData
,则不需要此方法。
$attachment->saveAttachmentTo($path = null, $filename = null, $disk = 'local')
在存储文件夹中保存附件。您可以传递路径、名称和使用磁盘。
消息
LaravelGmail::message()->all( $pageToken = null )
返回收件箱中的所有电子邮件
LaravelGmail::message()->take(2)->all( $pageToken = null )
take
方法通过设置的数字限制查询返回的电子邮件数量
LaravelGmail::message()->get( $id )
返回具有所有信息的单个电子邮件
修饰符
您可以使用这些方法修改您的查询。例如
获取所有未读电子邮件:LaravelGmail::message()->unread()->all()
message()->unread()
message()->from( $email )
message()->in( $box = 'inbox' )
message()->hasAttachment()
message()->subject($subject)
->after($date)
和 ->before($date)
message()->raw($query)
用于自定义查询
所有可能的过滤器都在 Filterable 特性
当然,您可以使用流畅的API。
LaravelGmail::message() ->from('someone@gmail.com') ->unread() ->in('TRASH') ->hasAttachment() ->all()
预加载
您只需调用此方法即可预加载每封电子邮件的正文、标题和其他内容。
LaravelGmail::preload()
示例
LaravelGmail::message() ->from('someone@gmail.com') ->unread() ->in('TRASH') ->hasAttachment() ->preload() ->all()
监控
https://developers.google.com/gmail/api/reference/rest/v1/users/watch
示例
$mailbox = new LaravelGmailClass(config(), $account->id); // One watch per account + need reinit every 24h+ $mailbox->stopWatch('example@gmail.com'); // Set watch for topic $rq = new \Google_Service_Gmail_WatchRequest(); $rq->setTopicName('projects/YOUR_PROJECT_ID/topics/gmail'); $mailbox->setWatch('example@gmail.com', $rq);
历史记录
https://developers.google.com/gmail/api/reference/rest/v1/users.history
示例
$historyList = (new LaravelGmailClass(config(), $account->id)) ->historyList($data['emailAddress'], [ 'startHistoryId' => $startHistoryId, ]); foreach ($historyList->history as $chunk) { foreach ($chunk->messages as $msg) { ... } }
常见问题
登录要求
如果您收到“登录要求”错误,请尝试在 /storage/app/gmail/tokens/
下创建 gmail-json.json
文件。