メモ > 技術 > サービス: Google > Gmail
■Gmail
■一つのGmailアドレスから複数のアドレス(エイリアス)を作る
example@gmail.com というメールアドレスがあった場合、
example+test1@gmail.com
example+test2@gmail.com
のようなアドレス(アカウント名の末尾に「+」と任意の英数字を追加)でもメールを受信できる
何かしらのWebサービスにメールを登録する場合、エイリアスのアドレスを登録すれば、万が一メールアドレスが流出したときに流出元が判る
また、テストのために複数のメールアドレスが必要な場合などにも使える
Gmailのエイリアス機能とは──複数アドレスを設定する方法と注意点 | アプリオ
https://appllio.com/gmail-alias
■ロリポップのメールをGmailで送受信
公式の解説が詳しい
Gmailの設定について / メール / マニュアル - レンタルサーバーならロリポップ!
https://lolipop.jp/manual/mail/gmail/
■GmailのSMTPでメール送信
Homestead+Laravel環境で、GmailのSMTPでメールを送信したときのメモ
専用のアプリパスワードを発行し、それを使ってメールを送信できる
Laravel側の設定は Laravel.txt も参照
[Laravel5]gmailが送信できない? : ラブサファリ
http://lovesafari.blog.jp/archives/21272100.html
以下はアプリパスワードについては触れられていないが、プログラムは参考になる
Laravelでメール送信機能を実装する方法【Gmailを利用】
https://manablog.org/laravel-send-email/
以下、実際に設定したときのメモ
アプリパスワードは、二段階認証を設定していないと「お探しの設定はお使いのアカウントでは利用できません。」となって設定できない
まずは、以下のページから二段階認証を設定する
https://support.google.com/accounts/answer/185839?hl=ja
その後、以下のページからアプリパスワードを設定する
https://security.google.com/settings/security/apppasswords
アプリパスワードの設定画面で2段階認証すると、「アプリ パスワード」というページに遷移した
アプリ: 「その他(名前を入力)」を選択
アプリ名: Laravel
と入力して「生成」ボタンを押すとアプリパスワードが生成されるので、この値を使用する
なお、使い方の文章も以下のように表示される
使い方
設定しようとしているアプリケーションまたはデバイスの Google アカウントの設定画面を開きます。
パスワードを上に表示されている 16 文字のパスワードに置き換えます。
このアプリ パスワードは、通常のパスワードと同様に Google アカウントへの完全なアクセス権が付与されます。
このパスワードを覚えておく必要はないので、メモしたり誰かと共有したりしないでください。
この場合、以下の情報で送信できる
HOST: smtp.gmail.com
PORT: 465
USERNAME: Gmailのメールアドレス
PASSWORD: 生成されたアプリパスワード
ENCRYPTION: ssl
■メールの転送
Gmailで受け取ったメールを転送する2つの方法
https://digitor.jp/textbook/gmail-send-on/
Gmail のメールを他のアカウントに自動転送する - Gmail ヘルプ
https://support.google.com/mail/answer/10957?hl=ja
■メールを複数のアドレスに転送
Gmailで特定のメールを複数のアドレスに自動転送する方法 | Free Style
https://blanche-toile.com/tools/gmail-auto-forwarding
■GmailのAPIでメール取得
PHPとGmail APIでメールを取得する - ハマログ
https://blog.e2info.co.jp/2019/06/14/php-gmail-api-mail/
以下のページから開始
PHP Quickstart | Gmail API | Google Developers
https://developers.google.com/gmail/api/quickstart/php
ページの中ほどにある「Enable the Gmail API」ボタンをクリック
任意のプロジェクト名を入力し、規約に同意して「NEXT」ボタンをクリック
「Configure your OAuth client」ボタンが表示される
「Web server」を選択する
「Authorized redirect URIs」は http://localhost/~test/mail/google_api/oauth2callback.php とした(手元の環境に合わせて入力する)
登録すると「You're all set!」と表示される
「DOWNLOAD CLIENT CONFIGURATION」ボタンをクリックすると credentials.json をダウンロードできるので、ローカルに保存しておく
また以下のように「Client ID」と「Client Secret」も表示されているので確認する
Client ID
1234567890-xxxxxxxxxx.apps.googleusercontent.com
Client Secret
XXXXXXXXXX
Composerを導入し、以下を実行する
composer require google/apiclient:^2.0
quickstart.php を作成し、紹介されているプログラムを入力する
また、同じ場所に oauth2callback.php も作成する。内容は以下にしておく
<?php
echo 'code = ' . $_GET['code'] . '<br>';
echo 'scope = ' . $_GET['scope'] . '<br>';
以下を実行する
>php quickstart.php
Open the following link in your browser:
https://accounts.google.com/o/oauth2/auth?response_type=code&access_type=offline&client_id=1...
Enter verification code:
コードの入力待ちになるので、表示されたURLにアクセスする
Googleにログインしていない場合、ログイン画面が表示されるのでログインする
二段階認証後に表示されるコードを入力して進む
「このアプリは Google で確認されていません」
と表示された
「詳細」リンクをクリックし、表示される「Quickstart(安全ではないページ)に移動」リンクをクリック
「Quickstart への権限の付与」というダイアログが表示され、以下が表示されている
メール メッセージと設定の表示
メール メッセージの表示
メール メッセージの検索
設定(フィルタ、ラベルなど)の表示
「許可」ボタンをクリック
Quickstart に以下を許可しています。
・メール メッセージと設定の表示
Quickstart を信頼できることを確認
お客様の情報をこのサイトやアプリと共有する場合があります。
Quickstart の利用規約とプライバシー ポリシーで、ユーザーのデータがどのように取り扱われるかをご確認ください。
アクセス権の確認、削除は、Google アカウント https://myaccount.google.com/permissions でいつでも行えます。
リスクの詳細 https://support.google.com/accounts?p=oauth_consent
内容を確認されるので、再度「許可」ボタンをクリック
http://localhost/~test/mail/google_api/oauth2callback.php?code=YYYYYYYYYY&scope=https://www.goog...
に遷移し、先に作成したプログラムによって画面に以下が表示される
code = YYYYYYYYYY
scope = https://www.googleapis.com/auth/gmail.readonly
コードの入力待ちになっているプロンプトで、codeの値を入力する
以下が表示される
PHP Warning: count(): Parameter must be an array or an object that implements Countable in C:\localhost\home\test\public_html\mail\google_api\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php on line 67
Warning: count(): Parameter must be an array or an object that implements Countable in C:\localhost\home\test\public_html\mail\google_api\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php on line 67
Labels:
- CHAT
- SENT
- INBOX
- IMPORTANT
- TRASH
- DRAFT
- SPAM
- CATEGORY_FORUMS
- CATEGORY_UPDATES
- CATEGORY_PERSONAL
- CATEGORY_PROMOTIONS
- CATEGORY_SOCIAL
- STARRED
- UNREAD
メールのラベルが一覧表示されているみたい
認証した情報は「token.json」というファイルが作成されて保存されている(アクセストークンや有効期限が保存されている)
よって次回は、認証なしにメールのラベルが一覧表示される
※アクセストークンには有効期限が設けられている(1時間くらい?)
期限が切れたら再度「php quickstart.php」を実行する必要がある
すんなりトークンが更新されることもあるが、再度Googleへのログインと二段階認証を求められることもある
よってプログラムのみで完全自動更新するのは難しそう
一例だが、以下のプログラムによって、ブラウザにGmailのラベルを一覧表示できる
<?php
if (version_compare(PHP_VERSION, '7.2.0', '>=')) {
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
}
require __DIR__ . '/vendor/autoload.php';
$client = getClient();
$service = new Google_Service_Gmail($client);
$user = 'me';
$results = $service->users_labels->listUsersLabels($user);
echo "<!DOCTYPE html>\n";
echo "<html>\n";
echo "<head>\n";
echo "<meta charset=\"utf-8\">\n";
echo "<title>Gmail</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<h1>Gmail</h1>\n";
echo "<h2>Labels</h2>\n";
echo "<p>ラベルは以下のとおりです。</p>\n";
echo "<ul>\n";
foreach ($results->getLabels() as $label) {
echo "<li>" . $label->getId() . ' ... ' . $label->getName() . "</li>\n";
}
echo "</ul>\n";
echo "</body>\n";
echo "</html>\n";
exit;
function getClient()
{
$client = new Google_Client();
$client->setApplicationName('Gmail API PHP Quickstart');
$client->setScopes(Google_Service_Gmail::GMAIL_READONLY);
$client->setAuthConfig('credentials.json');
$client->setAccessType('offline');
$client->setPrompt('select_account consent');
$tokenPath = 'token.json';
if (file_exists($tokenPath)) {
$accessToken = json_decode(file_get_contents($tokenPath), true);
$client->setAccessToken($accessToken);
}
if ($client->isAccessTokenExpired()) {
exit('Access token is expired!');
}
return $client;
}
error_reporting の指定があるのは、PHP Warning の対策
本筋の対応では無いかもしれないが、詳細は以下
Laravel 5.5 + PHP 7.2 で count のエラー (Warning) が発生
https://mseeeen.msen.jp/warning-with-count-in-laravel-55-on-php-72/
ライブラリ内で出力されるが、「google/apiclient:^2.0」とバージョンを指定しているのが問題か(公式の解説が更新されていない?)
また一例だが、以下のプログラムによって、ブラウザにGmailのメッセージを一覧表示できる
<?php
if (version_compare(PHP_VERSION, '7.2.0', '>=')) {
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
}
require __DIR__ . '/vendor/autoload.php';
$client = getClient();
$service = new Google_Service_Gmail($client);
$user = 'me';
$optParams = array(
'maxResults' => '10',
'labelIds' => 'INBOX', // ラベルのidはlistUsersLabels()で取得できる
//'pageToken' => 'ページトークン',
//'q' => 'is:unread', // Gmailのメール検索時の形式で条件を指定できる
//'q' => 'from:someuser@example.com after:2018-02-20',
);
$messages = $service->users_messages->listUsersMessages($user, $optParams);
echo "<!DOCTYPE html>\n";
echo "<html>\n";
echo "<head>\n";
echo "<meta charset=\"utf-8\">\n";
echo "<title>Gmail</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<h1>Gmail</h1>\n";
echo "<h2>Messages</h2>\n";
echo "<p>メッセージは以下のとおりです。</p>\n";
foreach ($messages->getMessages() as $message) {
$message_id = $message->getID();
$message_contents = $service->users_messages->get($user, $message_id);
$snippet = $message_contents['snippet'];
if (mb_strlen($snippet, 'UTF-8') > 40) {
$snippet = mb_substr($snippet, 0, 40, 'UTF-8') . '...';
}
echo "<div=\"message_" . $message_id . "\">\n";
echo "<h3>" . $snippet . "</h3>\n";
echo "<dl>\n";
foreach ($message_contents['payload']['headers'] as $header) {
if (!preg_match('/^(From|Date|Subject|To)$/', $header['name'])) {
continue;
}
echo "<dt>" . $header['name'] . "</dt><dd>" . $header['value'] . "</dd>\n";
}
echo "</dl>\n";
if (!empty($message_contents['payload']['body']['data'])) {
$body = $message_contents['payload']['body']['data'];
$body = str_replace(array('-', '_'), array('+', '/'), $body);
$body = base64_decode($body);
echo "<pre>" . $body . "</pre>\n";
}
echo "</div>\n";
}
echo "</body>\n";
echo "</html>\n";
exit;
function getClient()
{
$client = new Google_Client();
$client->setApplicationName('Gmail API PHP Quickstart');
$client->setScopes(Google_Service_Gmail::GMAIL_READONLY);
$client->setAuthConfig('credentials.json');
$client->setAccessType('offline');
$client->setPrompt('select_account consent');
$tokenPath = 'token.json';
if (file_exists($tokenPath)) {
$accessToken = json_decode(file_get_contents($tokenPath), true);
$client->setAccessToken($accessToken);
}
if ($client->isAccessTokenExpired()) {
exit('Access token is expired!');
}
return $client;
}
■外部POP3の受信遅延を短くする
設定 → アカウントとインポート → 他のアカウントでメールを確認 → メールを今すぐ確認する
とすれば即座に確認されるみたい
ただし毎回クリックするのは大変
GMail POP3 Checker で対応できるみたい(未検証)
ただしTampermonkeyでサードパーティー製プラグインを入れる必要があり、
また寄付しないと12分までくらいしか短くならないらしい
少し様子見したい
Gmailの異常に遅い外部POP3受信のストレスを解消する方法 | オランダで生きていく
https://nldot.info/how-to-speed-up-gmail-external-pop3/
Gmailの外部アカウントのPOP3受信の遅延を無くす最強の方法 - 余白の書きなぐり
http://auewe.hatenablog.com/entry/2014/05/18/024715
■Gmailの容量を確保する
Gmailの容量は15GBだが、仕事アカウントで13GB近く消費していたので作業
以下、仕事メールで実際にメールを削除した時のメモ
作業前
12.82 GB/15 GB(85%)を使用中
不要な通知メールを大量に削除(思ったより容量削減にはならなかった)
11.12 GB/15 GB(74%)を使用中
【Gmailの使用容量を減らす】一括削除の大掃除をする方法
https://www.sho-design.net/gmail-cleanup/
上記を参考に、重いファイルが添付されているメールを削除する
size:30m older_than:1y
の結果に表示されたメールを削除
10.96 GB/15 GB(73%)を使用中
size:20m older_than:1y
の結果に表示されたメールを削除
10.74 GB/15 GB(71%)を使用中
size:10m older_than:1y
の結果に表示されたメールを削除
9.17 GB/15 GB を使用中
それなりに削減された
テキストメールを削除するよりは、こちらの方が効果がありそう
また容量が少なくなってきたら、同様に重いファイルが添付されているメールを削除する
■メールを送信できなくなった
Gmailを使用していると、メール送信後に
example@example.com にアクセスできなくなりました。
このメールを送信するには、別の「送信元」アドレスを選択してからもう一度お試しください。
詳しくは、https://support.google.com/mail/answer/22370?hl=ja をご覧ください
と届くようになった
特に前触れなどは無く突然
どうやらメールの送信ができなくなっている
別のアドレスやエイリアスからメールを送信する - Gmail ヘルプ
https://support.google.com/mail/answer/22370?hl=ja
Gmail上で独自ドメインなどの別メールアドレスから突然送信できなくなる現象と、その解決法 | しらこのナレッジ
https://tecchan.jp/entry/211019-gmailsmtp/
突如、gmailで送信ができなくなりました。受信は問題なくできます。 - Gmail コミュニティ
https://support.google.com/mail/thread/130942160/%E7%AA%81%E5%A6%82%E3%80%81gmail%E3%81%A7%E9%80%81%...
上記にあるとおり、メールの送信設定を削除して再設定すれば解消した
署名は再設定が必要だった
ただし原因は不明のまま