
中小企業に多いと思われる代表メールアドレスに顧客からのメールが届くパターン。
「サーバー側」で「担当者」へ「自動転送」させて、メールチェックの手間と機会損失を防ぐお話。
Contents
- 1 理想の転送環境は作るしかなかった
- 2 それでもGmailを使って自動転送させる方法
- 2.1 準備するもの
- 2.2 転送フロー
- 2.3 代表メールの転送設定
- 2.4 Gmailの設定
- 2.5 GoogleScriptの作成
- 3 スクリプトに実行権限を与える
- 4 定期実行のためのトリガーを設定
- 5 運用上の注意点
- 6 保守の頻度
理想の転送環境は作るしかなかった
実現したい環境
- 代表アドレスに届いたメールのドメインを判定して、担当者や責任者に自動転送させる
現在の環境
- レンタルサーバーでのメール運用(お名前サーバー)
- Outlook2016での受信
現状では実現できない理由
- 会社で契約しているレンタルサーバーでは、全転送しかないため不可能。
- メールソフト側で転送設定しても、常時起動のパソコンで定期的にチェックさせる必要がある。
- Gmailに全転送して振り分けしても、アドレス指定の転送設定が20個しか作成できない。
- Gmailは転送先メールアドレスに確認コードを送らなければいけない。なるべく社員を巻き込むのは避けたい。
それでもGmailを使って自動転送させる方法
Gmailに全転送して、Scriptで自動転送を行う。
準備するもの
準備するものは3つだけ
- 会社用Gmailアカウント
- Google Spreadsheet
- Google Script
転送フロー
- 会社のメールサーバーで、代表アドレスに届いたメールをGmailに全転送
- Gmailで転送したいメールに「転送」というラベルを付ける
- 未送信の「転送ラベル」が付いたメールを抽出する(GoogleScript)
- 「転送条件」に応じて、宛先を変更した「転送メール」を作成(GoogleScript)
- 「転送メール」を送信(GoogleScript)
- 送信済みメールには「スター」を付け、同時にログをSpreadSheetに記録(GoogleScript)
代表メールの転送設定
メールサーバーによって転送の設定方法が異なるため、自分の契約しているところで確認して欲しい。
ちなみに「お名前」サーバーでは以下の通り。
ここが不要な場合は、Gmailの設定へ
サーバーの管理画面にアクセスして




Gmailの設定
Gmailでは、ラベルを作って、転送したいメールにフィルターで貼り付ける設定をするだけ。
ラベルの作成




フィルタの作成




以上で代表アドレスから転送されてきたメールのうち、
目的のドメイン(@マークの後ろの部分)の付いたメールにだけ「forward」というラベルが付きます。
GoogleScriptの作成
転送用メールの抽出と作成
今回のGoogleスクリプトは、転送ログをスプレッドシートに記録するためGoogleスプレッドシートから作成します。
Googleスプレッドシートを新規作成して


この時点で、エディタ画面には「function myFunction( )」というスクリプトがありますが、そのまま使ってもいいですが、後々わかりやすいように「function main( )」に変更します。
単純に「myFunction」を「main」に書き換えて上書き保存するだけでOK
今回のプロジェクトにはmainを含め5つのスクリプトを作ります。
- main( )
- 入口となるスクリプトです。これを起点にしてメール転送を行います。
- forward_mail( )
- 実際にメール転送するスクリプトです。
- get_forward_address( )
- 転送先メールアドレスを設定するスクリプトです。
- save_spreadsheet( )
- スプレッドシートに送信ログを記録するスクリプトです。
- fetch_file( )
- 送信ログを記録するスプレッドシートを特定するスクリプトです。
では、順番に作成していきます。
転送設定の本体 - function main()
function main(){
var start = 0;
var max = 100; //1回の動作で何通のメールを取得するか
//ラベル「forward」のメールを取得する
var label = GmailApp.getUserLabelByName('forward');
var threads = label.getThreads(start,max);
//threadsからメールを二次元配列に格納
var getMessages = GmailApp.getMessagesForThreads(threads);
//スターの付いていないメールが転送対象となるメールなので「スター」なしを抽出。
for(var i in getMessages){
for(var j in getMessages[i]){
if(!getMessages[i][j].isStarred()){
var values = {};
values.date = getMessages[i][j].getDate(); //受信日時取得
values.from = getMessages[i][j].getFrom(); //送信元取得
values.subject = getMessages[i][j].getSubject(); //件名取得
values.body = getMessages[i][j].getPlainBody(); //本文取得
values.attachment = getMessages[i][j].getAttachments(); //添付ファイル取得
//件名に必要ないものを消す場合の処理
//サーバー等で「***UNCHECKED***」という文字が付与される場合があるので
//個別事情なのでなくても良い
values.subject = values.subject.replace(/^\*.*\*/g,'')
//件名の先頭に空白文字がある場合は消す
values.subject = values.subject.replace(/^\s+/g,'')
//転送先の設定
var address = get_forward_address(values.from);
values.forward_to = address.to;
values.forward_bcc = address.bcc;
//本文に注釈を挿入
var info = "このメールは[○○○@△△△.co.jp]からの自動転送です。\n\nメール送信者:" + values.from + "\n\n---------以下、本文---------\n";
values.body = info + values.body + "\n---------本文ここまで---------\n※件名に付く「***UNCHECKED***」マークは、添付ファイルが暗号化により、ウィルス検索出来なかったことを意味しています。";
//送信処理
forwardMail(values);
//送信したメールに「スター」をつける
getMessages[i][j].star();
//添付ファイルをGoogleDriveに保存
for(var k in values.attachment){
var id = fetch_file(values.attachment[k]); //fetch_fileだけでもOK
values['id' + k] = id; //送信ログに添付ファイルの記録を残すためにファイルidをセット
}
//送信ログに不要なものを削除
delete values.body;
delete values.attachment;
delete values.forward_to;
delete values.forward_bcc;
//送信ログ記録用の配列を用意(別途作る必要はないかも)
var i = 0;
var setValues = [];
for(key in values){
setValues[i] = values[key];
i++;
}
//スプレッドシートにログを記録
saveSpreadSheet(setValues);
}
}
}
}
メールを送信する - function forward_mail(values)
main()から受信したメールを1通ずつ受け取って、送信するスクリプトです。
引数valuesがメール本体になります。
function forwardMail(values){
GmailApp.sendEmail(values.forward_to,
values.subject,
values.body,
{
//送信者名、送信者メアド、cc、bcc、添付ファイルの設定
attachments:values.attachment,
cc:values.foward_cc,
bcc: values.forward_bcc,
from: '○○○@△△△.co.jp', //Gmailのアドレスと違う場合はエイリアス設定が必要
//参考リンク参照
name: '会社転送メール'
});
}
送信先メールアドレスを作成する - function get_forward_address(values)
function get_forwardAddress(value){
//送信元アドレスで転送先を変更する処理
//戻り値は、JSONで返す。
var index = value.indexOf('@'); //メールのドメイン以降を抜き出すため@の位置を調べる
var from = value.slice(index+1).replace('>',''); //送信元アドレスが<>で括られるときがあるので消去
var forward;
//ドメインごとに送信先を変更する
if(from.match(/ドメインA/) != null){
forward = JSON.parse('{"to":["メアドA,メアドB"],"cc":["メアドC"],"bcc":["メアドD"]}');
}else if(from.match(/ドメインB/) != null){
forward = JSON.parse('{"to":["メアドB,メアドC"],"cc":["メアドD"]}');
}else if(from.match(/ドメインC/) != null) {
forward = JSON.parse('{"to":["メアドC"],"cc":["メアドD"]}');
}else{
forward = JSON.parse('{"to":["メアドE"],"cc":"メアドD"}');
}
return forward;
}
Googleスプレッドシートに送信ログを保存 - function save_spreadsheet(values)
function save_spreadsheet(values){
var ssId = "1ph*******************************w5w"; //スプレッドシートのID
var ss = SpreadsheetApp.openById(ssId).getSheets()[0]; //スプレッドシートのシートを取得
var row = ss.getLastRow() + 1; //新規行を取得
ss.appendRow(values); //転送メールの概要を入力
}
GoogleスプレッドシートのシートID取得方法
Googleスプレッドシートを開いてアドレス部分を確認する

添付ファイルの保存 - function fetch_file(object)
function fetch_file(object){
var folderId = "1H**********************z-"; //保存先のフォルダIDをセット
var attFolder = DriveApp.getFolderById(folderId); //保存先フォルダを取得
var fileObj = attFolder.createFile(object); //添付ファイルを保存
var fileId = fileObj.getId(); //保存したファイルIDを取得
return fileId; //ファイルIDを返す(ファイルIDをログに記録しないなら要らない)
}
GoogleドライブのフォルダID取得方法
Googleドライブでログを記録したすスプレッドシートを保存しているフォルダを開いて確認

スクリプトに実行権限を与える
スクリプトを作成して実行する場合、初回のみ承認作業が必要になる。






定期実行のためのトリガーを設定
定期的にスクリプトを実行させて、メール転送を行えるようにする。



運用上の注意点
Google Scriptには、「1日あたりの3つの制限」というモノがある。
- 実行回数の制限
- 実行時間の制限
- トリガー数の制限
- ファイル容量制限
今回の対象ユーザーは、中小企業の情シス、もしくは個人なので、あまり制限にかかることはないと思うが、気になる部分を紹介しておく。
ここに挙げた以外で、制限項目を知りたい場合は、下のURLで確認してもらいたい。
実行回数の制限
| 無料アカウント | |
| メールの読み書き (送信除く) | 20,000/日 |
転送されてきたメールを取得するので、1日あたり20,000通以上あると実行できないが、そんなにメールがくる中小企業は少ないと思われる。
実行時間の制限
| 無料アカウント | |
| スクリプト実行時間 | 6分/実行 |
| カスタム関数事項処理 | 30秒/実行 |
いずれも今回のスクリプトでは問題のないレベル
トリガー数の制限
| 無料アカウント | |
| トリガー | 20/ユーザー or 20/スクリプト |
このスクリプトのトリガーは、1つなので全く問題なし。
ファイルの容量制限
| 無料アカウント | |
| メール送信ファイル数 | 250/メッセージ |
| メールの本文サイズ | 200KB/メッセージ |
| メールの受信者数 | 50/メッセージ |
| メール添付ファイルの総サイズ | 25MB/メッセージ |
1メッセージあたりで、この制限にかかるのは、あまりないと思われる。
添付ファイルの総サイズには注意が必要か?
外部から来たメールの添付ファイルをそのまま転送するので、想定外があるかもしれない。
保守の頻度
管理者には、「転送先としての受信」と「転送元の直接受信」の両方できるようにしておけば、転送不具合に気付くのが早い。
が、それでは自動化した意味がないので、スクリプトのエラーメールを受け取れるようにしておこう。
運用が安定してくれば、1週間に1回程度のログファイルチェックで問題ない。
転送作業が自動化されるので、大幅に手間が省けるのは間違いない。
現状、時間ベースのトリガーでエラーが発生することがある。

メール転送は、正常に行われており、エラー内容がサーバーエラーなので、こちら側が原因ではないように思うが、原因調査中。

