폼을 이메일로 보내기4분 분량
웹사이트 폼을 Gmail로 보내기(그리고 mailto:가 실패하는 이유)
mailto: 링크, 앱 비밀번호, Apps Script 없이 Gmail에서 폼 제출을 받고, 라벨을 붙이고, 스팸함을 피하고, Gmail에서 답장하세요.
폼을 폼 백엔드로 POST하고 Gmail 주소를 수신자로 추가하세요. 방문자의 메일 앱을 열기만 하는 mailto: action은 쓰지 마세요. 그다음 발신자에 대한 Gmail 필터를 추가하면 제출이 스팸함을 건너뛰고 전용 라벨이 붙습니다. Gmail에서 Reply를 누르면 여러분의 주소로 방문자에게 답장합니다.
이 경우가 다른 점
Gmail은 메일함이지 사이트용 발송 서비스가 아닙니다. 폼이 POST할 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를 누릅니다. 브라우저는 폼을 어디에도 POST하지 않고, mailto: 링크를 운영 체제에 넘깁니다.
- 업무용 노트북이나 브라우저에서 Gmail을 쓰는 사람에게 흔하듯 메일 앱이나 웹 핸들러가 설정되어 있지 않으면, 눈에 보이는 일이 아무것도 일어나지 않거나 시스템이 어떤 앱을 쓸지 묻습니다.
- 설정되어 있으면 방문자 자신의 메일 앱에 필드가 본문에 붙여 넣어진 초안이 열립니다.
- 방문자는 자기 계정에서 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은 개인 계정이 하루에 보낼 수 있는 양도 제한합니다 |
MailApp을 쓰는 Google Apps Script | 웹 앱으로 배포한 스크립트 | 개인 계정은 스크립트로 하루 100명의 수신자에게 이메일을 보낼 수 있습니다. URL은 스팸 방지 없이 공개되어 있어 봇 하나가 할당량을 다 써 버릴 수 있습니다 |
| 폼 백엔드 | action에 백엔드 URL | 이메일은 여러분이 아니라 서비스의 주소에서 옵니다. 중요한 부분은 회신 주소가 해결합니다 |
Apps Script는 대부분의 튜토리얼이 권하는 경로이니 좀 더 자세히 살펴볼 만합니다. doPost 함수를 작성하고, 누구나 호출할 수 있는 웹 앱으로 배포한 뒤, 폼을 그 URL로 지정합니다. 동작은 하지만, 일반 폼 POST를 하면 방문자는 여러분의 도메인이 아닌 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 라벨을 만들거나 파일에서 이름을 바꾸세요. 모든 알림이 같은 주소에서 오므로 필터 하나로 모든 폼을 처리합니다. 폼마다 다른 라벨로 나누려면 subject:("New submission: Quote request")처럼 제목으로 필터링하세요.
you+site@gmail.com을 수신자로 추가하면 평소 받은편지함으로 배달되고, To 필터로 사이트 메일을 나머지와 구분할 수 있습니다. 외부 주소로 취급되므로 다른 주소처럼 링크로 확인합니다.Gmail에서 답장하기
Gmail은 회신 주소 헤더를 따르므로 Reply를 누르면 방문자에게 답장합니다. 답장은 여러분의 Gmail 주소에서 나가며, 스레드 어디에도 Ikiform은 없습니다.
- 대신 회사 주소로 답장하려면 Settings, Accounts and Import, Send mail as에서 추가하고, 답장할 때 From 줄에서 고르세요.
- 제목이 항상
New submission:뒤에 폼 이름이 붙은 형태이므로, Gmail은 같은 제목의 알림을 대화 하나로 묶을 수 있습니다. 메시지마다 한 줄씩 보고 싶다면 Gmail 설정에서 Conversation view를 끄세요. - 시간별 다이제스트는 여러 방문자를 다루므로 회신 주소가 없습니다. 이 경우에는 대시보드 링크에서 답장하세요.
동작 확인하기
- 페이지에서 폼을 작성해 제출하세요. 여러분의 감사 페이지나 Ikiform의 호스팅 감사 페이지로 이동합니다.
- Gmail에서 이메일을 찾으세요. 라벨이 붙어 있고 Spam이나 Promotions에 있지 않습니다.
- Reply를 누르세요. To 줄에 폼에 입력한 주소가 있습니다.
- 허니팟을 채워서
_gotcha=bot으로 POST하세요. 성공 응답은 받지만 제출은 스팸으로 저장되고 이메일도 웹훅도 보내지 않습니다. - 아무것도 도착하지 않았나요? 대시보드의 상태 필터를 Spam으로 바꿔 보세요. 스팸도 실제 제출과 같은 성공 응답을 받습니다.
주의할 점
- Google Workspace 별칭. 수신자가 별칭이나 Google 그룹이라면 외부 발신자를 허용할지는 그룹 자체 설정이 결정합니다. 믿고 쓰기 전에 테스트를 보내세요.
- 확인 메일이 스팸함으로 감. 확인 링크 이메일도 Ikiform에서 옵니다. 보이지 않으면 Spam을 확인하고 스팸이 아님으로 표시하세요.
- 여러 Gmail 주소. 폼마다 모두 합쳐 최대 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.