GMAIL to Discord Channel Webhook Tutorial
Tags: discord, gmail, slack, teams
Published: 2022-08-19 15:46:48

## Abstract

프로젝트를 진행하면서 `Slack`, `Microsoft Teams`, `Discord` 등 커뮤니케이션 툴은 원활한 프로젝트 진행을 위해 필수적인 요소 중에 하나다.

특히, 게임 보조 도구로 알려진 `Discord`의 경우 퍼포먼스에 민감한 게이머들을 만족시키는 강력한 커뮤니케이션 기능을 가지고 있다보니 이를 프로젝트 메인 커뮤니케이션 툴로 사용하는 경우도 점점 증가하고 있다.

이번 포스팅에서는 팀 메일이나 공식 메일이 올때마다 메일을 확인하는 것이 아닌 `Discord`의 하나의 채널에서 알림이 올수 있도록 웹훅 설정을 하는 과정을 소개하고자 한다.

Discord DOCs 링크: https://discord.com/developers/applications

---

## Getting Started

### Prerequisite

- 여기서는 Discord 계정이 있고 서버를 생성한 상태를 가정한다
- 서버에 해당하는 웹훅 권한이 필요하다

#### 웹훅 권한 설정

![gmail_discord_1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1f9tjf714evsgr1wveiu.png)

---

### Setting Discord Webhook

`Integrations` 메뉴에서 `Webhooks` 생성을 클릭

##### Integrations 메뉴

![gmail_discord_2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ooqhuf5k4gza5jtvw0l9.png)

---

`New Webhook`을 선택해서 새로운 `Webhook`을 생성한 뒤 필요한 정보(`Bot Name`, `Channel`)를 입력해서 `Noti-Bot`을 생성

`Discord` 세팅은 여기까지 완료

##### Webhook 생성

![gmail_discord_3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ap4eg0yyelzcozbocb8a.png)

---

### Setting up Google App Script

구글 앱 스크립트 페이지 접속:
https://www.google.com/script/start/

새 프로젝트 생성

##### 구글 앱 스크립트 메인 화면

![gmail_discord_4](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1oz63zaz1dza1a74sm3v.png)

##### 메인 대쉬보드

![gmail_discord_5](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2w26b5y6k0uk7rw8k17p.png)

---

새로운 프로젝트에 다음과 같이 코드를 작성

> #### Note
>
> - `webhooks` 변수에는 `Discord`의 `Webhook URL`을 입력
>
> ##### Webhook 생성 화면
>
> ![gmail_discord_6](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y8wytv8e858qpy0lx2k2.png)
>
> - `channel` 변수에는 채널 이름을 등록
>
> ##### Discord 채널명
>
> ![gmail_discord_7](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kqljhqgl67gj3oweu8zi.png)
>
> - `searchQuery` 에는 구글 메일에서 쓰는 검색 쿼리를 사용한다. (하기 이미지 참조)
>
> ##### Gmail 쿼리 검색
>
> ![gmail_discord_8](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q8cnshrx5e1jei8epv7s.png)
>
> - `Gmail`에서는 `Discord`에 **2000** 자 이상되는 내용을 게시할수 없기 때문에 **2000** 자 넘는경우 제한하는 로직이 필요하다.

##### code.gs

```js
function postDiscord(postMessage) {
	const webhooks = 'https://discord.com/api/webhooks/webhooks/{webhook.id}/{webhook.token}';
	const channel = '{channel name}';
	const parse = 'full';
	const method = 'post';

	const payload = {
		channel: channel,
		content: postMessage,
		parse: parse,
	};

	const params = {
		method: method,
		payload: payload,
		muteHttpExceptions: true,
	};

	response = UrlFetchApp.fetch(webhooks, params);
}

function sendMailsToDiscord() {
	const searchQuery = '{gmail query}';
	const date = new Date();
	const checkSpan = 30;
	date.setMinutes(date.getMinutes() - checkSpan);

	const threads = GmailApp.search(searchQuery);
	const msgs = GmailApp.getMessagesForThreads(threads);

	for (let i = 0; i < msgs.length; i++) {
		const lastMsgDate = threads[i].getLastMessageDate();

		if (lastMsgDate.getTime() < date.getTime()) break;

		for (let j = 0; j < msgs[i].length; j++) {
			const msgDate = msgs[i][j].getDate();
			const msgBody = msgs[i][j].getPlainBody();
			const subject = msgs[i][j].getSubject();

			const postMessage =
				'From mailing list' +
				'\n' +
				Utilities.formatDate(msgDate, 'America/New_York', 'MM/DD/yyyy hh:mm:ss') +
				'\n' +
				'Title:' +
				subject +
				'\n' +
				'[hr]' +
				msgBody;

			// 2000 Characters limits
			if (postMessage.length > 2000) {
				const stopPos = 1900; //
				const msg = '"Exceeded 2000 character limit."';
				postMessage = postMessage.substring(0, stopPos) + '\n' + msg;
			}

			postDiscord(postMessage);
		}
	}
}
```

---

`trigger` 를 설정

이후 새로운 메일이 올 경우 지정한 채널에 새로운 메세지가 푸시될 것이다.

> #### Note
>
> - 실행할 함수를 선택: `sendMailsToDiscord`
>
> - 실행할 배포: `Head`
>
> - 이벤트 소스 선택: `시간 기반`
>
> - 트리거 기반 시간 유형 선택: `분 단위 타이머`
>
> - 분 간격 선택: `30분마다`
>
> - 트리거 실패 알림 설정: `즉시 알림`

###### trigger 화면

![gmail_discord_9](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/srgwl5wgj5q0x4dpaugy.png)

---

## Conclusion

본 포스팅에서는 `GMAIL`에서 `Discord` 채널에 새로운 메일이 올때마다 푸시하는 `webhook`을 `Google App Script`를 통해 **Set up**해 보았다.

`Discord`는 퍼포먼스에 민감한 게이머를 만족시킬수 있을정도의 수준의 서비스를 제공하고 있고 앞으로 여러 프로젝트에서도 많이 쓰일 것이다. 여기에 전 세계 메일의 표준이라고도 할수 있는 `GMAIL`을 연동하는 것은 가장 많이 사용하는 `Webhook` 중 하나가 될것이며 본 포스팅이 그런 부분에 많은 도움이 되었으면 하는 바램이다.

본 포스팅에 쓰인 **Method**가 궁금하다면 하기의 `Google App Script` 링크에서 자세한 내용을 참고

Link: https://developers.google.com/apps-script/reference/document