フォームをメールに送る2 分で読めます
Web サイトのフォームを Gmail に送る(mailto: がうまくいかない理由も)
mailto: リンクもアプリパスワードも Apps Script も使わずに、フォームの送信データを Gmail で受け取り、ラベルを付け、迷惑メールを避け、Gmail から返信します。
フォームをフォームバックエンドに送信し、Gmail のアドレスを受信者に追加します。訪問者のメールアプリを開くだけの mailto: の action は使いません。次に送信元に対する Gmail のフィルターを追加すれば、送信データは迷惑メールを避けて専用のラベルが付きます。Gmail で Reply を押すと、自分のアドレスから訪問者宛てに返信できます。
ここが違う
Gmail はメールボックスであって、サイト用の送信サービスではありません。フォームが送信できる URL がないので、Gmail へのどの経路も何か別のものを経由します。多くの人が最初に試すのが mailto: です:
<form action="mailto:you@gmail.com" method="post" enctype="text/plain">
<input name="name" />
<input name="email" type="email" />
<textarea name="message"></textarea>
<button>Send</button>
</form>自分のマシンでは確かに動きます。Send を押すとメールアプリが開き、本文にフィールドが入っていて、それを自分宛てに送ります。訪問者の体験は違います:
- 訪問者が Send を押します。ブラウザーはフォームをどこにも送信せず、mailto: リンクを OS に渡します。
- 会社のノートパソコンや、ブラウザーで Gmail を使う人によくあるように、メールアプリや Web のハンドラーが設定されていなければ、目に見えることは何も起きないか、どのアプリを使うかを OS が尋ねます。
- 設定されていれば、訪問者自身のメールアプリで下書きが開き、本文にフィールドが貼り付けられます。
- 訪問者は自分のアカウントから、もう一度 Send を押す必要があります。多くの人は代わりに下書きを閉じてしまい、試みたことすらあなたにはわかりません。
メッセージが届いたとしても、本文は生の name=value の行です。text/plain のエンコードではそうなるからです:
name=Ada Lovelace
email=ada@example.com
message=Hi, do you take on small bathroom jobs in March?Gmail へのほかの経路は動きますが、どれも自分で動かすサーバーが必要です:
| 経路 | 必要なもの | 注意点 |
|---|---|---|
| アプリパスワードを使う Gmail SMTP | コードを実行するサーバーと、Google アカウントの 2 段階認証プロセス | このパスワードがあればどこからでもあなたとしてメールを送れるので、絶対にブラウザーに渡してはいけません。また Google は個人アカウントが 1 日に送れる量を制限しています |
MailApp を使う Google Apps Script | Web アプリとしてデプロイしたスクリプト | 個人アカウントでスクリプトからメールを送れるのは 1 日 100 人まで。URL は公開されていてスパム対策がないので、ボット 1 つで使い切られます |
| フォームバックエンド | action にバックエンドの URL | メールは自分ではなくサービスのアドレスから届きます。大事な部分は返信先が解決します |
Apps Script は多くのチュートリアルが勧める経路なので、詳しく見ておきます。doPost 関数を書き、誰でも呼び出せる Web アプリとしてデプロイし、フォームの送信先をその URL にします。動きはしますが、通常のフォーム送信だと訪問者はあなたのドメインではなく Google のドメインから配信されるページに残され、URL を見つけたボットは誰でもその日の割り当てを使い切れ、スクリプトはあなたとして実行されるので、バグがあればあなたのアカウントから誰にでもメールを送れてしまいます。さらに、以降のフォームのフィールド変更もすべて自分で対応することになります。
フォームを Gmail に送る
小規模な施工業者向けのフォームの例です。job フィールドがあると受信トレイを見渡しやすく、email という名前にしているので返信は訪問者に届きます:
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
<label for="name">Your name</label>
<input id="name" name="name" autocomplete="name" required />
<label for="email">Email for our reply</label>
<input id="email" name="email" type="email" autocomplete="email" required />
<label for="job">What do you need?</label>
<select id="job" name="job" required>
<option value="">Choose one</option>
<option value="repair">A repair</option>
<option value="quote">A quote for a new job</option>
<option value="other">Something else</option>
</select>
<label for="message">Details</label>
<textarea id="message" name="message" rows="5" required></textarea>
<input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
<button>Send to our inbox</button>
</form>- Ikiform でフォームを作成し、
frm_xxxxxxxxxxxxxxxxをその ID に置き換えます。 - Gmail のアドレスで登録していれば、ワークスペースのオーナーとしてすでにメールを受け取れます。そうでなければフォームの Notifications 設定を開き、Add someone outside the workspace に Gmail のアドレスを入力して Send link を押します。
- Gmail で確認メールを開いて確認します。それまでアドレスには Waiting for confirmation と表示され、何も届きません。
- フォームの Allowed domains に自分のドメインを追加し、ページを公開してテストを送信します。
Gmail のフィルターで迷惑メールを避ける
新しい送信元からの最初のメールは、Spam(迷惑メール)や Promotions(プロモーション)に入ることがあります。送信元に対するフィルターを作れば、これを恒久的に防げます。Gmail で検索オプションを開き、From に notifications@ikiform.com を入れて Create filter を押し、Never send it to Spam、Apply the label、Always mark it as important、Categorize as: Primary にチェックを入れます。最後の設定で Promotions に入らなくなります。
またはフィルターをインポートします。これは Gmail 自身のフィルターの Export が書き出す形式です。Google はこれを別途ドキュメント化していないので、インポートに失敗したら上記のとおり手動でフィルターを作ってください。mailFilters.xml として保存し、Settings、See all settings、Filters and Blocked Addresses、Import filters の順に進みます:
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:apps="http://schemas.google.com/apps/2006">
<title>Mail Filters</title>
<entry>
<category term="filter"></category>
<title>Mail Filter</title>
<content></content>
<apps:property name="from" value="notifications@ikiform.com"/>
<apps:property name="label" value="Website"/>
<apps:property name="shouldNeverSpam" value="true"/>
<apps:property name="shouldAlwaysMarkAsImportant" value="true"/>
<apps:property name="smartLabelToApply" value="^smartlabel_personal"/>
</entry>
</feed>先に Website ラベルを作るか、ファイル内でラベル名を変えてください。通知はすべて同じアドレスから届くので、フィルター 1 つですべてのフォームをカバーできます。フォームごとにラベルを分けるなら、subject:("New submission: Quote request") のように件名でフィルターします。
you+site@gmail.com を追加すると通常の受信トレイに届き、To に対するフィルターでサイトからのメールをほかと区別できます。これは外部のアドレスとして扱われるので、ほかと同じくリンクで確認します。Gmail から返信する
Gmail は Reply-To ヘッダーに従うので、Reply は訪問者宛てになります。返信はあなたの Gmail アドレスから送られ、スレッドに Ikiform は一切現れません。
- 代わりに仕事用のアドレスから返信するには、Settings、Accounts and Import、Send mail as でそのアドレスを追加し、返信時に From 欄で選びます。
- 件名は常に
New submission:とフォーム名なので、Gmail は同じ件名の通知を 1 つのスレッドにまとめることがあります。メッセージごとに 1 行で表示したいなら、Gmail の設定で Conversation view(スレッド表示)をオフにしてください。 - 1 時間ごとのダイジェストは多くの訪問者をまとめたものなので、返信先がありません。ダイジェストにはダッシュボードのリンクから返信してください。
動作を確認する
- ページのフォームに入力して送信します。自分のサンクスページか、Ikiform のサンクスページに移動します。
- Gmail でメールを探します。ラベルが付いていて、Spam や Promotions には入っていません。
- Reply を押します。To 欄はフォームに入力されたアドレスです。
- ハニーポットを埋めて
_gotcha=botで送信します。成功の応答は返りますが、送信データはスパムとして保存され、メールも Webhook も送られません。 - 何も届かない場合は、ダッシュボードのステータスフィルターを Spam に切り替えてください。スパムにも本物の送信と同じ成功の応答が返ります。
ハマりどころ
- Google Workspace のエイリアス。 受信者がエイリアスや Google グループの場合、外部の送信者を受け付けるかどうかはグループ自体の設定で決まります。頼りにする前にテストを送ってください。
- 確認メールが迷惑メールに入る。 確認リンクのメールも Ikiform から届きます。見当たらなければ Spam を確認し、迷惑メールではないと報告してください。
- 複数の Gmail アドレス。 1 つのフォームがメールを送れるのは合計 10 アドレスまでで、外部のアドレスはそれぞれ個別に確認します。
- ほかの場所に残る mailto: リンク。 フッターにある
mailto:リンクは、リンクとしては問題ありません。問題なのは、フォームのactionにmailto:を使う場合だけです。
よくある質問
はい。Workspace のアドレスもほかの受信者と同じように使えます。Google グループやエイリアスの場合は、グループが外部の送信者からのメールを受け付けるか確認してから、テストを送ってください。
mailto: の action は何も送信しません。訪問者の端末に、下書き付きでメールアプリを開くよう頼むだけです。アプリが設定されていなければ目に見えることは何も起きず、設定されていても、訪問者がそのアプリでさらに Send を押す必要があります。
自分で動かすサーバーから、2 段階認証プロセスを有効にしたアカウントのアプリパスワードを使う場合に限ります。そのパスワードを絶対にブラウザーのコードに入れないでください。あなたとしてメールを送れてしまいます。
notifications@ikiform.com からのメールに対する Gmail のフィルターを作り、Never send it to Spam にチェックを入れます。同時にラベルも付けておけば、フォームのメッセージを見つけやすくなります。
はい。フォームのメールのフィールド名が email、email_address、your_email、reply_to、contact_email のいずれかか、フォームが _replyto フィールドを送る場合です。そうすれば Reply を押したとき、Gmail が訪問者を To 欄に入れます。
手順で詰まったときや、あなたの状況に合うガイドがほしいときはメールでどうぞ: hello@ikiform.com