들어가기 전에
자 일단 고객센터 이메일이란 것은 그냥 비유적인 표현일 뿐입니다. 우리의 목표는 Google Workspace 구성원들과 함께 쓸 수 있는 별도의 이메일 계정을 하나 만들어 관리하는 것입니다. 이 메일은 고객센터 이메일 될 수도 있고, 홍보 이메일 발송용이 될 수도 있고 여러가지 비즈니스 목적에 따라 다양해질 수 있겠지요. 여기서의 핵심은 새로운 사용자를 추가하는 것이 아니라 Groups for Business 를 통해 사용자의 구성으로부터 자유로운 별도의 이메일을 만드는 것입니다. 물론 과금도 추가되지 않습니다.
우리는 그 동시에 Node.js 의 googleapis 를 활용해 해당 Groups 이메일로 프로그래밍틱하게 보내는 방법까지 정리해 볼 것입니다. 여기는 api의 영역이고, 참으로 힘듭니다. 기나긴 여정이 될 것임을 먼저 말씀드립니다…
우선 본 글은 Google Workspace 에 도메인을 먼저 연결해놓았다고 가정했습니다. 별도의 도메인이 있지 않으면 이메일을 활용하기가 힘드니까요. 그리고 구글 api 관련 설정이나 Workspace 설정은, 다른 조직 관리 툴과 마찬가지로 굉장히 빠르게 많은 것들이 바뀌므로 글을 쓰는 시점을 명확히 전해드립니다. 2021년 2월입니다! 큰 맥락으로는 크게 바뀌는 점이 없겠지만, 금새(?) 본 방법이 유효해지지 않을 수도 있다는 점을 미리 알려드립니다. 필자 또한 열심히 구글링하여 찾은 정보를 바탕으로 하고 있으므로 확실하지 않은 정보가 있을 수 있고, 한계를 적극적으로 이야기할 것입니다. 그럼에도 불구하고 잘못된 정보는 댓글로 언제나 제보 환영입니다.
사용자의 이메일 별칭 (email alias) 을 설정하는 방법도 있으나, 이 별칭은 해당 사용자에게 귀속되므로 해당 이메일을 공유하면서 사용할 수 없습니다. 실제로 해보면 같은 별칭을 여러 명이서 사용할 수 없도록 되어있음을 확인할 수 있습니다.
본 글에서는 사용자를 새롭게 만드는 것이 아니므로 메일박스도 새롭게 만들어지는 것이 없습니다. (Groups 는 메일박스 개념이 아닙니다.) 그러므로 api를 통해서 보낸 메일은, 그룹스 이메일로 표시해서 보냈다 하더라도, 해당 api에 연결되어있는 계정의 보낸 메일함에 차곡차곡 쌓이게 됩니다. 이러한 동작을 원하지 않는다면, 새로운 계정을 만들거나 다른 서비스를 찾아 이용하는 수 밖에요… 어떤 서비스가 있는지 잘 모르겠지만… 하하…
Groups for Business 만들기
우선 그룹을 만듭시다. 그룹을 만들면서 공용으로 관리할 고객센터 이메일을 지정할 수 있습니다.
admin.google.com
에 접속
우선 관리자 콘솔에 접속합니다.
메뉴 – 디렉터리 – 그룹 들어가기

그룹 만들기 – 정보 채워넣기
우선 상단에 그룹 만들기
를 클릭합니다. 그럼 하단의 이미지처럼 창이 뜹니다.

여기서 그룹 이메일을 설정할 수 있습니다. 고객센터를 운영할 것이라면 support
등으로 이메일을 설정해주도록 합시다. 그룹 소유자는 본 그룹을 관리할 계정으로 진행하면 되겠습니다. 추후 변경할 수 있으므로 크게 신경쓰지 않아도 됩니다.
권한 설정하기

그룹 설정에서 게시물 게시를 외부에서도 허용하도록 수정합니다. 여기서 “게시물을 외부에서 게시할 수 있다
“라는 말은, “외부에서 이메일로 해당 그룹스에 메시지를 전달할 수 있다
“는 이야기입니다. 그래서 게시물 게시, 그룹 가입, 대화 보기 등등의 외부 권한이 모두 다르게 설정될 수 있지요. (그룹에 가입하지 않고 있더라도 그룹의 이메일만 알고 있다면 그룹에 메시지를 전달할 수 있으니까요.) 일반적인 사이트에서의 게시판/게시물을 생각하지 마세요. 구글의 단어 선택은 종종 우리를 혼란에 빠지도록 만듭니다.
“대화”라는 것도 저의 뇌피셜로는 그냥 그룹스에 올라온 글들을 이야기하는 것 같습니다.
위 설정에서 “소유자에게 문의”가 어떤 식으로 이루어지는지는 저도 아직 발견하지 못했습니다. 정말 물음표가 많이 필요한 시점이네요.
이 글에서는 Worksapce 구성원이 그룹에 가입되어 있어도 이메일을 수신하지 않는 방법에 대해서는 다루지 않고, 필자도 다뤄본 적이 없습니다. 필요한 기능일 수 있겠지만 이 글의 주제에 좀 벗어난 것 같습니다. 그룹 관리자를 아예 이전하던가, 아니면 아예 Gmail 에서 별도의 메일함으로 관리하도록 하는 게 어떨지 생각만 해봅니다.
이메일 수신 테스트
자 그렇다면 이제 그룹스 관련 설정은 끝이 났습니다. 외부 이메일에서 해당 그룹스 이메일로 메일을 한번 보내봅시다.


메일이 두 군데에서 수신되고 있다는 점을 확인할 수 있습니다. 일단 그룹스에서 메시지를 확인할 수 있고 Gmail 에서도 확인할 수 있습니다.
다른 주소에서 메일 보내기 추가후 이메일 작성
이제 해당 메일로 다른 곳으로 메일을 보낼 수 있어야겠지요. 어떻게 하면 될까요~ 불행히도 그룹스 내부에서 어떤 메일이나 메시지를 보내는 방법을 찾지 못했습니다. 그렇다면 남은 방법은 바로 개인 Workspace 계정에서 특정한 방법으로 보내면 됩니다. (왜 그룹스 자체에서 보낼 때 그룹스의 이메일로 보내는 기능은 없을까요? 호호~ 모르겠다.)
Gmail 접속 – 오른쪽 위 톱니바퀴(설정) – 모든 설정 보기 – 계정 – 다른 주소에서 메일 보내기 – 다른 이메일 주소 추가
https://mail.google.com 에 접속하여 해당 경로대로 들어갑니다. “다른 이메일 주소 추가”를 누르면 새로운 창이 뜨게 됩니다.
새 이메일 설정

이름은 보여지는 이름이고, 이메일은 그룹스 이메일을 넣습니다. 별칭은 그냥 체크로 둡니다. (Gmail 별칭 처리 – 원하는 서비스 – 그룹 메일링 리스트에서 보내기 참조)
확인 메일 보내기

그냥 하라는 대로 하면 됩니다. 확인 이메일을 보내면 해당 groups 로 메일이 날라갈 것입니다.

날라온 이메일에 적힌 코드를 입력하거나 링크를 클릭하면 끝입니다.
이메일 작성

이제 이메일을 작성할 때 보낸 사람에서 해당 그룹스 이메일로 작성할 수 있게 되었습니다!
Google Cloud 에서 서비스 계정 설정하기
자 이제 서론은 끝났습니다. 이제부터 정말이거든요. 이미지는 귀찮으니까 이제 되도록 말로 설명하겠습니다.
클라우드 플랫폼 접속 및 새 프로젝트 추가하기
본 단계는 이미 프로젝트가 만들어져 있는 상태라면 건너뛰어도 좋습니다. 본 단계는 그리 중요하지 않습니다.
우선 https://console.cloud.google.com/home/ 에 접속합니다. 처음 접속했다면 아래와 같이 약관 동의 페이지가 뜹니다. 서비스 약관을 모두 동의하고 계속합니다.

상단 메뉴바에서 Google Cloud Platform 우측에 “프로젝트 선택”을 클릭합니다. (프로젝트가 선택되어 있을 경우 프로젝트 명으로 나옵니다.)
그 다음 프로젝트 선택 창에서 우측 상단의 새 프로젝트
를 누릅니다. 그렇다면 아래와 같이 새로운 프로젝트를 생성하는 창으로 전환될 텐데요,

프로젝트 이름을 적절히 하고 만듭니다. 조직에서 본인의 Workspace 로 잘 설정되었는지를 확인합니다.
서비스 계정 만들기 및 설정
아래 이미지와 같이 메뉴
– API 및 서비스
– 사용자 인증 정보
에 진입합니다.

그 다음 상단에 사용자 인증 정보 만들기
– 서비스 계정
을 선택합니다.

위와 같은 화면이 뜹니다. 서비스 계정의 이름, ID, 설명을 설정합니다. 여기서의 ID는 아무런 상관이 없습니다! 이메일도 신경쓰지 마세요. 이 api 계정은 우리가 실제로 사용하는 Workspace 계정을 대신해서 이메일을 보내주는 권한 덩어리일 뿐입니다. 그 권한도 추후 설정할 것이니 아무런 설정하지 말고 바로 완료 버튼을 누릅니다.
만드는 것이 완료되었다면, 서비스 계정을 클릭하여 자세한 설정으로 들어가보도록 합시다. 그렇다면 아래 화면이 뜰 것입니다.

서비스 계정 상태 설정
에서 도메인 수준 위임 표시
를 클릭하여 해당 설정을 보이게 한 뒤, G Suite 도메인 전체 위임 사용 설정
을 클릭합니다.
그 다음 키 추가
– 새 키
를 누릅니다. 그렇다면 아래 이미지와 같은 창이 뜰 것입니다. JSON
– 만들기
로 갑니다. 키가 성공적으로 만들어졌다면 어떤 json 파일이 다운로드될 것입니다. 잘 가지고 있읍시다. 이것으로 우리가 추후 node.js 에서 이메일을 보낼 때 authentication 에 이용할 파일입니다.

그 다음 저장
을 누릅니다.
그렇게 된다면 자동으로 OAuth 2.0 클라이언트 ID 에 새로운 것이 생겨났다는 것을 확인할 수 있습니다. 바로 뒤 우리가 Workspace 의 API 관리에서 도메인 위임 설정을 할 때 클라이언트 ID가 필요한데, 바로 이 클라이언트 ID이므로 잘 복사해놓고 있읍시다. 아래 이미지에서 푸른색 사각형을 클릭하면 클라이언트 ID를 복사할 수 있습니다.

여기까지 했다면 https://console.cloud.google.com/home/ 에서 설정할 수 있는 건 다 했습니다.
Workspace 에서 API 설정하기
다시 https://admin.google.com/ 으로 접속합니다. 상단 검색창에서 api 관리
를 검색하여 API 관리
에 들어갑니다.
페이지 최하단에 도메인 전체 위임 관리
로 들어갑니다.
그 다음 API 클라이언트를 새로 추가해줍니다. 아래와 같은 새로운 창이 뜰 것입니다.

금방 복사했던 클라이언트 ID를 붙여넣어줍니다. OAuth 범위(쉼표로 분리)
에는 아래 내용을 다 집어넣어줍니다. 여기에서는 API 의 권한 범위를 설정할 수 있는데, 어떤 권한이 어떤 역할이 있는지 일일히 찾아나가기가 너무 번거롭기 때문에 일단 전부 다 추가해주도록 합니다. 각 Scope 가 어떤 역할을 하는지에 대해서는 공식 문서에 잘 나와있으니 참고해주시면 되겠습니다. 권한은 추후 조정해도 늦지 않아요.
https://mail.google.com/,
https://www.googleapis.com/auth/gmail.labels,
https://www.googleapis.com/auth/gmail.send,
https://www.googleapis.com/auth/gmail.readonly,
https://www.googleapis.com/auth/gmail.compose,
https://www.googleapis.com/auth/gmail.insert,
https://www.googleapis.com/auth/gmail.modify,
https://www.googleapis.com/auth/gmail.metadata,
https://www.googleapis.com/auth/gmail.settings.basic,
https://www.googleapis.com/auth/gmail.settings.sharing,
설정이 완료되면 승인
을 누릅니다.
Node.js 에서 메일 보내기
간단한 환경 세팅
어차피 빠르게 테스트로 진행해볼 거니까 새로운 프로젝트를 파서 진행해보자구요. 원하는 폴더에 들어가 node.js 프로젝트 초기화를 해주고 필요한 패키지를 설치합니다.
npm init
# 엔터 계속 눌러요
npm install --save googleapis nodemailer
googleapis
: 구글 API 를 사용하기 위해 필요합니다.nodemailer
: Gmail API 에 데이터를 전달할 때 그 형식은 (불편하게도) MIMEText(RFC 2822) 를 만족하는 base64 인코딩된 문자열입니다. 그 형식을 맞춰주기 위해 nodemailer의 서브 모듈인 MailComposer 를 사용할 계획입니다.
그리고 아까 다운로드 받아놓았던 credentials json 파일을 해당 프로젝트 폴더 안에 넣습니다. 그리고 코딩을 위해 index.js
파일도 만듭니다. 그렇다면 이제 폴더의 구조도는 아래와 같이 되겠지요!
node_modules
index.js
mailer-credentials.json
package-lock.json
package.json
코딩
코드 이해는 알아서 하길 빕니다.
const path = require("path");
const { google } = require("googleapis");
const MailComposer = require("nodemailer/lib/mail-composer");
const SCOPES = [
"https://mail.google.com/",
"https://www.googleapis.com/auth/gmail.labels",
"https://www.googleapis.com/auth/gmail.send",
"https://www.googleapis.com/auth/gmail.readonly",
"https://www.googleapis.com/auth/gmail.compose",
"https://www.googleapis.com/auth/gmail.insert",
"https://www.googleapis.com/auth/gmail.modify",
"https://www.googleapis.com/auth/gmail.metadata",
"https://www.googleapis.com/auth/gmail.settings.basic",
"https://www.googleapis.com/auth/gmail.settings.sharing",
];
const ACCOUNT = "관리자 및 api 발급한 계정 이메일";
const SUPPORT_ACCOUNT = "그룹스 이메일";
const sendMail = async () => {
try {
const auth = new google.auth.GoogleAuth({
keyFile: path.resolve(__dirname, "mailer-credentials.json"),
scopes: SCOPES,
clientOptions: {
subject: ACCOUNT,
},
});
const gmail = google.gmail({
auth,
version: "v1",
});
const msg = new MailComposer({
from: {
name: "보내는사람 이름",
address: SUPPORT_ACCOUNT,
},
to: {
name: "받는사람이름",
address: "eszqsc113@naver.com",
},
subject: "[테스트 메시지42] 제목입니다.",
html: "<b>이것은 굵게입2니4다.</b><u></u>",
});
const buf = await msg.compile().build();
const encoded = buf.toString("base64");
console.log('# CHECK Encoded');
console.log(encoded);
const sendRes = await gmail.users.messages.send({
userId: ACCOUNT,
requestBody: {
raw: encoded,
},
});
console.log('# res data');
console.dir(sendRes.data);
} catch (e) {
console.log("# getMessgaeList Failed");
console.error(e);
}
};
sendMail();
# CHECK Encoded
Q29udGVu..Xh0L2h0bW..0/VVRGLTg/Q..lCN1ptVTY..WWo0OGRUNDhMM1UrDQo=
# res data
{
id: '177be05397cfa5c8',
threadId: '177be05397cfa5c8',
labelIds: [ 'SENT' ]
}
위 코드에서 가장 핵심은 바로 GoogleAuth 를 만드는 부분입니다. 저기서 저 clientOptions.subject
까지 써줘야 완벽하게 동작합니다. 저게 없으면 자꾸 Precondition check failed 오류가 발생합니다. 아.. 정말 힘든 여정이었습니다. 저걸 왜 명시해야 하는지는 저도 잘 모릅니다. 겨우겨우 구글링해서 github 에 올라온 글을 참조했으나, 여기서는 뜬금없이 JWT
가 쓰였습니다. 해당 코드도 잘 작동했습니다! 오예~ 그걸 살짝 수정해서 아래 코드로 하면 될 것 같았더니, 되었습니다.
const auth = new google.auth.GoogleAuth({
keyFile: path.resolve(__dirname, "mailer-credentials.json"),
scopes: SCOPES,
clientOptions: {
subject: ACCOUNT,
},
});
유의해야 할 점은 앞서 설정했던 “다른 주소에서 메일 보내기” 설정이 완료되어 있어야 한다는 것입니다. 이를 확인하는 방법 또한 google apis 로 확인해볼 수 있습니다. 아래 예제를 실행해보세요.
const res = await gmail.users.settings.sendAs.list({
userId: ACCOUNT,
})
console.log(res.data);
오예~~ 첨부파일은 다음 기회에 …
참조 문서
Node.js Gmail 관련 api 레퍼런스: https://googleapis.dev/nodejs/googleapis/latest/gmail/classes/Gmail.html
기타
Groups for Business – 공유 설정 – “그룹 소유자는 조직 외부에서 보내는 이메일을 수신하도록 허용할 수 있음” 설정의 의미

이해하는 데 애 먹었습니다. 저기 있는 설정은 일단 Groups 내부에서의 권한을 설정한다는 개념입니다. 특히 저 설정은 그러니까 https://groups.google.com/ 에 들어가서 좌측 그룹 설정
– 기본 설정
– 게시할 수 있는 사용자
를 설정할 때 웹의 모든 사용자
가 보일지 말지를 설정하는 개념입니다. 설정을 설정한다! 정말 머리아프네요. 그러니까 위 그림에서 그룹 소유자는 조직 외부에서 보내는 이메일을 수신하도록 허용할 수 있음
을 체크한다면 아래 우측 이미지처럼 보이고, 체크를 풀면 아래 좌측 이미지처럼 보입니다.


하지만 우리는 그룹스를 만드는 시점에서 이미 모든 사용자가 게시할 수 있도록 설정해놨고, 그런 설정도 Google Workspace 관리 콘솔에서 계속 관리할 수 있기 때문에 이 설정을 어떻게 해놨든 아무런 상관이 없습니다.
후기
구글 이노무자식들.. 너무 뭔가 하고 싶은 걸 하기 불편하게 해놓았습니다. 자신이 얼마나 세세한 설정을 건드릴 수 있는지는 별로 궁금하지 않고, 그냥 내가 원하는 목표를 쉽고 빠르게 하기를 원하지만.. 그러기는 힘들 것 같네요. 저 처럼 구글 api 로 이리저리 해볼려는 사람은 많이 없나봅니다. google api 관련해서는 아무리 자료를 찾아도 참 마음에 드는 자료가 잘 나오지 않는다는 기분이 드네요.
CONTENTS
- 들어가기 전에
- Groups for Business 만들기
admin.google.com
에 접속- 메뉴 – 디렉터리 – 그룹 들어가기
- 그룹 만들기 – 정보 채워넣기
- 권한 설정하기
- 이메일 수신 테스트
- 다른 주소에서 메일 보내기 추가후 이메일 작성
- Gmail 접속 – 오른쪽 위 톱니바퀴(설정) – 모든 설정 보기 – 계정 – 다른 주소에서 메일 보내기 – 다른 이메일 주소 추가
- 새 이메일 설정
- 확인 메일 보내기
- 이메일 작성
- Google Cloud 에서 서비스 계정 설정하기
- 클라우드 플랫폼 접속 및 새 프로젝트 추가하기
- 서비스 계정 만들기 및 설정
- Workspace 에서 API 설정하기
- Node.js 에서 메일 보내기
- 간단한 환경 세팅
- 코딩
- 참조 문서
- 기타
- Groups for Business – 공유 설정 – “그룹 소유자는 조직 외부에서 보내는 이메일을 수신하도록 허용할 수 있음” 설정의 의미
- 후기
감사합니다~
사업자입니다. 고유의 도메인을 구글에서 구매하고 워크스페이스에서 사용중입니다. 고유의 도메인을 이용한 메일 수발신 잘 되고 있는 상황입니다. (웹상에서) .. 다만, 아웃룩 클라이언트에서 메일을 수발신하고 싶어 연동을 하려 하는데.. 메일서버의 주소를 어떻게 설정하는지 모르겠습니다.
고견을 요청드립니다.