# 웹사이트 폼을 Gmail로 보내기(그리고 mailto:가 실패하는 이유)

> mailto: 링크, 앱 비밀번호, Apps Script 없이 Gmail에서 폼 제출을 받고, 라벨을 붙이고, 스팸함을 피하고, Gmail에서 답장하세요.

2026-10-25 게시 · https://ikiform.com/ko/guides/send-form-to-email/gmail

폼을 폼 백엔드로 POST하고 Gmail 주소를 수신자로 추가하세요. 방문자의 메일 앱을 열기만 하는 `mailto:` action은 쓰지 마세요. 그다음 발신자에 대한 Gmail 필터를 추가하면 제출이 스팸함을 건너뛰고 전용 라벨이 붙습니다. Gmail에서 **Reply**를 누르면 여러분의 주소로 방문자에게 답장합니다.

## 이 경우가 다른 점

Gmail은 메일함이지 사이트용 발송 서비스가 아닙니다. 폼이 POST할 URL이 없으므로 Gmail로 가는 모든 경로는 다른 무언가를 거칩니다. 대부분의 사람이 처음 시도하는 것은 `mailto:`입니다.

`동작하는 것처럼 보이는 폼`:

```html
<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**를 누르면 본문에 필드가 담긴 메일 앱이 열리고, 자기 자신에게 보냅니다. 방문자의 경험은 다릅니다.

다이어그램: mailto: 폼이 방문자 기기에서 하는 일

1. 방문자가 Send를 누릅니다. 브라우저는 폼을 어디에도 POST하지 않고, mailto: 링크를 운영 체제에 넘깁니다.
2. 업무용 노트북이나 브라우저에서 Gmail을 쓰는 사람에게 흔하듯 메일 앱이나 웹 핸들러가 설정되어 있지 않으면, 눈에 보이는 일이 아무것도 일어나지 않거나 시스템이 어떤 앱을 쓸지 묻습니다.
3. 설정되어 있으면 방문자 자신의 메일 앱에 필드가 본문에 붙여 넣어진 초안이 열립니다.
4. 방문자는 자기 계정에서 Send를 한 번 더 눌러야 합니다. 많은 사람이 대신 초안을 닫고, 여러분은 그들이 시도했다는 사실조차 알 수 없습니다.

첫 단계 이후의 모든 일은 방문자의 기기에서 일어나므로, 사람들이 어디서 이탈하는지 볼 수 없습니다.

메시지가 도착하더라도 본문은 가공되지 않은 `name=value` 줄입니다. `text/plain` 인코딩이 그렇게 만들기 때문입니다.

`도착하는 내용`:

```text
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`은 답장이 방문자에게 가도록 이름을 붙였습니다.

`contact.html`:

```html
<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>
```

1. Ikiform에서 폼을 만들고 `frm_xxxxxxxxxxxxxxxx`를 그 ID로 바꾸세요.
2. Gmail 주소로 가입했다면 워크스페이스 소유자로서 이미 이메일을 받습니다. 그렇지 않다면 폼의 **Notifications** 설정을 열고 **Add someone outside the workspace**에 Gmail 주소를 입력한 뒤 **Send link**를 누르세요.
3. Gmail에서 확인 이메일을 열고 확인하세요. 그 전까지 주소에는 **Waiting for confirmation**이 표시되고 아무것도 받지 않습니다.
4. 폼의 **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**로 이동하세요.

`mailFilters.xml`:

```text
<?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")`처럼 제목으로 필터링하세요.

> Gmail은 @ 앞부분의 점과 더하기 기호 뒤의 내용을 무시합니다. `you+site@gmail.com`을 수신자로 추가하면 평소 받은편지함으로 배달되고, **To** 필터로 사이트 메일을 나머지와 구분할 수 있습니다. 외부 주소로 취급되므로 다른 주소처럼 링크로 확인합니다.

## Gmail에서 답장하기

Gmail은 회신 주소 헤더를 따르므로 **Reply**를 누르면 방문자에게 답장합니다. 답장은 여러분의 Gmail 주소에서 나가며, 스레드 어디에도 Ikiform은 없습니다.

- 대신 회사 주소로 답장하려면 **Settings**, **Accounts and Import**, **Send mail as**에서 추가하고, 답장할 때 **From** 줄에서 고르세요.
- 제목이 항상 `New submission:` 뒤에 폼 이름이 붙은 형태이므로, Gmail은 같은 제목의 알림을 대화 하나로 묶을 수 있습니다. 메시지마다 한 줄씩 보고 싶다면 Gmail 설정에서 **Conversation view**를 끄세요.
- 시간별 다이제스트는 여러 방문자를 다루므로 회신 주소가 없습니다. 이 경우에는 대시보드 링크에서 답장하세요.

## 동작 확인하기

1. 페이지에서 폼을 작성해 제출하세요. 여러분의 감사 페이지나 Ikiform의 호스팅 감사 페이지로 이동합니다.
2. Gmail에서 이메일을 찾으세요. 라벨이 붙어 있고 **Spam**이나 **Promotions**에 있지 않습니다.
3. **Reply**를 누르세요. **To** 줄에 폼에 입력한 주소가 있습니다.
4. 허니팟을 채워서 `_gotcha=bot`으로 POST하세요. 성공 응답은 받지만 제출은 스팸으로 저장되고 이메일도 웹훅도 보내지 않습니다.
5. 아무것도 도착하지 않았나요? 대시보드의 상태 필터를 **Spam**으로 바꿔 보세요. 스팸도 실제 제출과 같은 성공 응답을 받습니다.

## 주의할 점

- **Google Workspace 별칭.** 수신자가 별칭이나 Google 그룹이라면 외부 발신자를 허용할지는 그룹 자체 설정이 결정합니다. 믿고 쓰기 전에 테스트를 보내세요.
- **확인 메일이 스팸함으로 감.** 확인 링크 이메일도 Ikiform에서 옵니다. 보이지 않으면 **Spam**을 확인하고 스팸이 아님으로 표시하세요.
- **여러 Gmail 주소.** 폼마다 모두 합쳐 최대 10개 주소로 이메일을 보내며, 외부 주소는 각각 따로 확인합니다.
- **다른 곳에 남은 예전 mailto: 링크.** 푸터의 `mailto:` 링크는 링크로서는 괜찮습니다. 문제는 폼의 `action`에 쓴 `mailto:`뿐입니다.

## 질문

### Google Workspace 주소로 폼 제출을 보낼 수 있나요?

네. Workspace 주소도 다른 수신자처럼 동작합니다. Google 그룹이나 별칭이라면 그룹이 외부 발신자의 메일을 받는지 확인한 뒤 테스트를 보내세요.

### mailto: 폼은 왜 아무것도 보내지 않나요?

mailto: action은 절대 보내지 않습니다. 방문자의 기기에 초안이 담긴 메일 앱을 열어 달라고 요청할 뿐입니다. 설정된 앱이 없으면 눈에 보이는 일이 일어나지 않고, 있더라도 방문자가 그 앱에서 Send를 눌러야 합니다.

### Gmail SMTP로 폼 이메일을 보낼 수 있나요?

직접 운영하는 서버에서, 2단계 인증이 켜진 계정의 앱 비밀번호로만 가능합니다. 그 비밀번호는 여러분 명의로 메일을 보낼 수 있으니 절대 브라우저 코드에 넣지 마세요.

### 폼 이메일이 Gmail 스팸함에 들어가지 않게 하려면?

notifications@ikiform.com에서 오는 메일에 대한 Gmail 필터를 만들고 Never send it to Spam을 체크하세요. 동시에 라벨도 붙이면 폼 메시지를 쉽게 찾을 수 있습니다.

### 폼을 작성한 사람에게 Gmail에서 답장할 수 있나요?

네, 폼의 이메일 필드 이름이 email, email_address, your_email, reply_to, contact_email 중 하나이거나 폼이 _replyto 필드를 보내면 가능합니다. 그러면 Reply를 눌렀을 때 Gmail이 방문자를 To 줄에 넣습니다.

## 가이드 더 보기

- [폼을 이메일로 보내기](https://ikiform.com/ko/guides/send-form-to-email.md): 메일 서버 없이 모든 폼 제출을 받은편지함으로 받으세요. mailto:와 PHP mail()이 실패하는 이유와, 스팸을 거르고 바로 답장할 수 있는 설정을 다룹니다.
- [받은편지함에서 답장하기](https://ikiform.com/ko/guides/send-form-to-email/reply-to.md): 폼 알림에서 답장을 누르면 폼을 작성한 사람에게 가도록 하세요. 어떤 필드 이름이 동작하는지, _replyto는 언제 쓰는지, 답장이 엉뚱한 곳으로 가는 이유를 다룹니다.
- [PHP 없이](https://ikiform.com/ko/guides/send-form-to-email/without-php.md): mail()을 호출하는 contact.php 스크립트를 호스팅 엔드포인트로 POST하는 폼으로 바꾸세요. 필드 이름, 감사 페이지, 답장은 그대로 유지됩니다.
- [여러 수신자](https://ikiform.com/ko/guides/send-form-to-email/multiple-recipients.md): 폼이 직접 수신자를 고르게 하지 않고도, 폼 하나를 팀 전체에 이메일로 보내거나 주제별로 메시지를 적절한 사람에게 보내세요.
- [EmailJS 대안](https://ikiform.com/ko/guides/send-form-to-email/emailjs-alternative.md): 문의 폼을 EmailJS에서 옮기세요. 브라우저 측 이메일 키가 위험한 이유, 코드에서 바뀌는 점, 자동 응답처럼 포기하는 기능을 다룹니다.
- [Next.js](https://ikiform.com/ko/guides/send-form-to-email/nextjs.md): Server Action으로 Next.js 폼을 이메일로 보내는 두 가지 방법: Resend나 Nodemailer로 직접 보내기와 폼 백엔드로 전달하기를 솔직하게 비교합니다.
