brunch

You can make anything
by writing

C.S.Lewis

by 시리얼 Sireal Jul 30. 2023

ChatGPT를 이용해 세일즈를 위한 이메일 수집하기

챗GPT + 구글 앱스 스크립트

1인 사업을 진행하며 지금까지 주고받은 업무 이메일이 많습니다. 그러나 이메일을 주고받기만 했지 지속적으로 연락처를 관리했던 건 아니었습니다. 그래서 강의 주제가 업데이트 되거나, 강의 커리큘럼이 바뀌었어도 강의를 새롭게 불러주시는 곳에서만 새로운 커리큘럼을 선보이고, 기존에 진행했던 곳에서는 보여드릴 기회가 없었죠. 


기업 메일주소를 관리해 보기 위해 Gmail을 통해 지금까지 제가 주고받은 모든 이메일을 수집해 봤습니다. 하지만 2019년 이후 주고받은 메일은 수천 통이 넘는데 어느 세월에 이걸 다 보고 있을까요? 그래서 ChatGPT를 활용해 보았습니다.


아직까지 영업용 이메일을 관리해보지 않은 기업들은 해당 기능을 통해 이메일 수집도 해보고 ChatGPT의 사용 방법도 익혀보시기 바랍니다. 


이 글을 끝까지 읽으시면 

1. ChatGPT를 이용해 구글 앱스 스크립트를 생성하는 방법을 배울 수 있습니다.

2. 구글 앱스 스크립트를 실행하는 방법을 배울 수 있습니다.

3. 구글 앱스 스크립트에서 오류가 났을 때 대처하는 방법을 배울 수 있습니다.

4. Gmail을 통해 주고받은 이메일 주소를 연도 별로 수집할 수 있습니다.

5. 제가 얼마나 많은 시행착오를 겪었는지 볼 수 있습니다. �


저는 구글 앱스 스크립트는 물론이고 자바스크립트 한 줄도
혼자 작성할 줄 모르는 코드 문외한임을 알려드립니다. �




처음에는 단순히 이메일을 수집하는 앱스 스크립트를 짜고 싶었습니다. 메일 주소, 발신자 정도만 스크랩하고 싶었죠. 

그러다 점점 욕심이 생겨서 8번의 수정을 거쳤습니다. 그래서 첫 대화의 시작은 아래와 같은 프롬프트로 시작했습니다.


ChatGPT는 아래와 같은 답변을 주었습니다. 

추가로 아래처럼 스프레드시트의 ID를 넣으란 말이 나오길래 구글 스프레드시트를 만들었습니다.

위 코드에서 "YOUR_SPREADSHEET_ID" 부분에는 구글 스프레드시트의 ID를 입력해야 합니다. 구글 스프레드시트의 URL에서 스프레드시트 ID를 찾을 수 있습니다.

이제 스크립트를 저장하고 실행하면, 지정한 라벨에 해당하는 답장한 이메일의 메일 주소와 발신자명이 구글 스프레드시트에 저장됩니다. 스프레드시트의 "Sheet1" 시트에 번호, 메일 주소, 발신자명이 저장될 것입니다.


새로운 구글 시트를 만든 뒤 구글 시트의 URL에서 아래 이미지처럼

 '/d/1QNau0a3LlgtmQZ262drfhGZaqewfOIeTEZKFPoIlXzQ/edit'에서 색깔이 칠해진 ID만

"YOUR_SPREADSHEET_ID"에 넣어주면 됩니다.

아래 이미지처럼 스프레드시트 ID와 구글 시트의 이름을 맞춰서 넣어주세요.

구글 스프레드시트는 처음 생성하면 시트 이름이 한글로 '시트1'로 생성되니 영어로 변경해 주셔도 좋습니다.


이렇게 생성된 구글 앱스 스크립트를 실행해 보기 위해서는 구글 시트에서 앱스 스크립트를 클릭하면 됩니다.

아래 이미지처럼 '확장 프로그램 > Apps Script'를 클릭해 주세요.


아래 이미지처럼 제목 없는 앱스 스크립트 화면이 나옵니다. 1~3줄까지 내용이 적혀 있는데 모든 글자를 삭제해 주세요.


ChatGPT에서 나온 코드에서 'Copy code'를 누르고 위 앱스 스크립트에 붙여 넣습니다.


아래 이미지처럼 구글 스프레드 시트 ID가 들어간 걸 확인하고 실행 버튼을 누릅니다.


처음 실행하시면 권한 검토가 나오는데, 모든 권한을 승인해 주시면 됩니다.


코드가 올바르게 작동하면 아래 이미지처럼 실행 로그 창이 나타나며 '실행이 시작됨'이라고 나타납니다. 


그 후 구글 스프레드 시트에 들어가면 아래와 같이 실제로 이메일과 발신자가 수집되는 걸 볼 수 있습니다.

하지만 여기서 제 이메일 주소가 너무 많이 수집되고 있습니다.

복사한 코드를 붙여 넣으며 이 코드에서 제 이메일 주소는 제외하고 다시 작성해 달라고 했죠.

코드로 답변을 줬는데 실행을 시켜보니 오류가 발생하여서 그 오류를 그대로 긁어다가 아래와 같이 수정해 달라고 요청했습니다.

몇 번의 오류를 더 수정하고 나니 정상 작동하는 코드를 제공해 주었습니다. 그런데 이메일을 여러분 주고받다 보니 같은 이메일이 중복 수집되고 있었습니다. 이걸 해결하기 위해 아래와 같이 프롬프트를 다시 입력했습니다.

이렇게 코드가 잘 작동한다는 걸 알려주면 해당 코드를 그대로 이용해 제가 필요한 부분만 추가, 수정해 줍니다. 추가로 발신자 이름에 큰 따옴표("")가 들어가길래 삭제해 달라고 코드를 요청했습니다.


이후 코드를 받았는데 2022년 12월부터 현재까지의 코드만 반복해서 결과를 만들어줬습니다. 저는 2019년부터 이메일 수집을 받고 싶었기 때문에 아래와 같이 요청했습니다.

몇 번의 오류 코드를 수정한 다음 표 구성을 변경하기 위해 아래와 같이 수정 요청했습니다. 

이후 구글 연락처에 저장한 라벨 별로 따로 구분을 해보고 싶었는데, 구글 연락처를 연결하니 라벨을 인식하지도 못하고 생성 속도도 느려지길래 사용을 취소했습니다.


수집된 이메일을 살펴보니 기업 이메일이 아닌 단순 질문을 했던 사용자들의 이메일도 수집이 되었길래 기업용 이메일을 구분하기 위해 아래처럼 'gmail.com', 'naver.com' 도메인을 제외하고, 회사를 구분하기 위해 도메인 열을 추가해 달라고 요청했습니다.

진행하고 나니 'hanmail.net','kakao.com','nate.com'과 같은 개인 이메일도 발견했습니다. 따라 하시는 분들은 함께 제외를 요청하면 좋을 것 같습니다.


다시 한번 2022년 12월까지만 이메일을 수집하길래 2019년 이후 모든 메일을 수집할 수 있도록 코드 수정을 요청했습니다. 그러나 이렇게 코드를 아무리 변경해도 2022년 12월 이후 데이터를 수집하지 못했습니다.  여러 방식으로 요청을 했으나 마찬가지로 2022년 12월까지만 데이터가 수집되어서 코드의 문제가 아니라 앱스 스크립트의 데이터 수집량에 문제가 있는 것 같았습니다. 




수집된 이메일을 살펴보니 기업 이메일뿐만 아니라 저에게 질문을 한 개인 이메일도 수집되고 있는 걸 확인했습니다. 개인적으로 질문한 이메일은 수집을 제외하기 위해 Gmail에서 특정 라벨이 지정된 메일들은 수집을 제외해 달라고 요청해 보았으나 작동하지 않았습니다.


그래서 위에서 넣었던 'gmail.com', 'naver.com'으로 수집된 개인 이메일만 따로 구글 시트에서 편집했습니다.


이제는 2019년부터 지금까지 주고받은 이메일을 수집하는 일만 남아서 마지막으로 각 연도에 맞는 시트를 생성하고, 해당 연도에 수신한 이메일만 수집해 달라고 요청을 했더니 정확하게 연도별로 수집해 주었습니다. 

이렇게 반복하여 2019년부터 2023년까지 수신한 이메일을 모두 수집해 보았습니다.

이렇게 제공해 준 코드를 입력해 넣으니 아래와 같이 연도별로 이메일을 모두 수집할 수 있게 되었습니다.


작성된 코드의 조건은 아래와 같습니다.
1. 메일 수신일을 기준으로 2021년에 수신한 이메일 주소를 수집해 줘.
2. '2021'이라는 시트를 생성하고, 이 시트에 데이터를 저장해 줘.
3. "번호", "발신자", "메일주소", "메일 수신시간", "도메인" 순으로 열을 정리해 줘.
4. 'milk@sireal.co','sijin90@gmail.com'은 수집하는 이메일에서 제외해 줘.
5. '@' 이후에 있는 도메인은 '도메인' 열에 따로 추가해 줘.
6. 'gmail.com','naver.com'같은 이메일은 도메인에 추가하지 말아 줘.


제가 사용한 최종 코드는 아래와 같습니다.


function scrapEmailInfo() {

  // 구글 스프레드시트 ID를 여기에 입력하세요.

  var SPREADSHEET_ID = "13cB-7eAwLoIKIu0l6G-IGTXpO2HLjj91TcE04NN6lO4";


  // Helper function to format the date in 'YYYY-MM-DD' format

  function formatDate(date) {

    var year = date.getFullYear();

    var month = ("0" + (date.getMonth() + 1)).slice(-2);

    var day = ("0" + date.getDate()).slice(-2);

    return year + "-" + month + "-" + day;

  }


  // 시작일: 2021년 1월 1일, 종료일: 2021년 12월 31일

  var startDate = new Date("2021-01-01");

  var endDate = new Date("2021-12-31");


  // 스크랩할 이메일을 검색하기 위한 Gmail 검색 쿼리

  var searchQuery = "after:" + formatDate(startDate) + " before:" + formatDate(endDate) + " is:sent";


  // 구글 스프레드시트 가져오기

  var ss = SpreadsheetApp.openById(SPREADSHEET_ID);


  // Create a new sheet for the year 2021

  var sheetName = "2021";

  var sheet = ss.getSheetByName(sheetName);

  if (!sheet) {

    sheet = ss.insertSheet(sheetName);

    // 스프레드시트 헤더에 정보 추가

    sheet.clear();

    sheet.appendRow(["번호", "발신자", "메일주소", "메일 수신시간", "도메인"]);

  }


  // Gmail에서 이메일 검색

  var threads = GmailApp.search(searchQuery);


  // 이메일 정보 스크랩 및 스프레드시트에 저장

  var rowNum = sheet.getLastRow() + 1;

  var uniqueEmails = {}; // Dictionary to track unique email addresses

  for (var i = 0; i < threads.length; i++) {

    var messages = threads[i].getMessages();

    for (var j = 0; j < messages.length; j++) {

      var email = messages[j].getFrom();

      var senderName = email.substring(0, email.indexOf("<")).trim();

      var senderAddress = email.substring(email.indexOf("<") + 1, email.indexOf(">")).trim();


      // 이메일 주소가 제외할 주소와 같지 않고, 중복되지 않은 경우에만 스프레드시트에 저장

      if (

        senderAddress !== 'milk@sireal.co' &&

        senderAddress !== 'sijin90@gmail.com' &&

        !uniqueEmails[senderAddress]

      ) {

        // Remove double quotes from the sender's name, if present

        senderName = senderName.replace(/"/g, "");


        var receivedTime = messages[j].getDate(); // Get the email receiving timestamp for all emails


        // Extract the domain for email addresses that are not from 'gmail.com' or 'naver.com'

        var domain = "";

        if (!senderAddress.includes('@gmail.com') && !senderAddress.includes('@naver.com')) {

          domain = senderAddress.substring(senderAddress.indexOf('@') + 1);

        }


        sheet.appendRow([rowNum++, senderName, senderAddress, receivedTime, domain]);

        uniqueEmails[senderAddress] = true;

      }

    }

  }


  Logger.log("2021년 이메일 정보를 스크랩하여 '2021' 시트에 저장하였습니다.");

}


싱글턴이 아니라 멀티턴으로 진행한 이유는 ChatGPT를 이용해 앱스 스크립트를 처음 생성해 보기 때문에 어떤 조건들이 필요한지 몰랐기 때문입니다. 싱글턴 방식으로 오류를 수정하고, 필요한 정보를 추가, 수정, 삭제해가며 진행했고, 원하는 결과물을 얻을 수 있었습니다.


제가 ChatGPT와 나누었던 대화는 아래 대화목록에서 살펴보세요. 

엄청난 시행착오를 겪은 ChatGPT 대화목록


악용과 이메일 유출을 막기 위해 대화 목록에 작성된 스프레드시트는 제거하였습니다.


표지 이미지 출처: https://wrtn.ai/




저는 ChatGPT 전문 강사가 아닙니다. 한국엔젤투자협회와 한국MICE협회의 요청으로 강의를 한 번씩 진행했는데, 강의 반응이 좋으신지 지속적으로 불러주시고, 다른 곳에 강의 추천까지 해주셨습니다. 현재는 대전관광공사, 한국관광공사, 인천관광공사를 포함해 MICE, 관광업계를 중심으로 ChatGPT 강의를 진행하고 있습니다. 제 강의 내용이 궁금하신 분들은 아래 링크를 살펴봐주세요.


https://youtube.com/playlist?list=PLhK_GHTum--RaV4jAnqLAbFRotJQpKLKr


강의, 컨설팅 문의는 언제나 환영입니다 :) 

https://www.sireal.co/


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari