AI와 Google Script를 사용하여 Gmail 스팸 폴더에서 합법적인 이메일을 찾아보세요

게시 됨: 2024-06-08

Gmail에서 오탐지는 흔하지 않지만 발생할 수 있습니다. 즉, 중요한 이메일이 실수로 스팸 폴더에 들어갈 수도 있습니다. 매일 수백 통의 스팸 메시지를 처리할 때 이러한 합법적인 이메일을 식별하는 것은 더욱 어렵습니다.

특정 발신자가 보낸 이메일이나 특정 키워드가 포함된 이메일이 스팸으로 표시되지 않도록 Gmail에서 필터를 만들 수 있습니다. 그러나 이러한 필터는 새로운 발신자나 알 수 없는 발신자가 보낸 이메일에는 분명히 작동하지 않습니다.

Gmail 스팸에서 잘못 분류된 메시지 찾기

AI를 사용하여 Gmail의 스팸 이메일을 분석하고 어떤 이메일이 오탐지일지 예측한다면 어떨까요? 잘못 분류된 이메일 목록을 사용하면 이러한 이메일을 자동으로 받은 편지함으로 이동하거나 수동 검토를 위한 보고서를 생성할 수 있습니다.

다음은 Gmail에서 생성된 샘플 보고서입니다. 여기에는 합법적일 가능성이 높고 받은 편지함으로 이동해야 하는 스팸 점수가 낮은 이메일 목록이 포함되어 있습니다. 보고서에는 귀하가 선호하는 언어로 된 이메일 내용 요약도 포함되어 있습니다.

Gmail Spam Summary

시작하려면 이 Google 스크립트를 열고 Google 드라이브에 사본을 만드세요. Apps Script 편집기로 전환하고 이메일 주소, OpenAI API 키, 이메일 요약에 사용할 기본 언어를 제공하세요.

드롭다운에서 reportFalsePositives 함수를 선택하고 재생 버튼을 클릭하여 스크립트를 실행하세요. Gmail 계정에서 읽지 않은 스팸 이메일을 검색하고 OpenAI의 API를 사용하여 분석한 후 스팸 점수가 낮은 이메일 보고서를 보냅니다.

이 스크립트를 정기적으로 자동 실행하려면 Google Apps Script 편집기의 '트리거' 메뉴로 이동하여 아래와 같이 매일 한 번씩 이 스크립트를 실행하도록 시간 기반 트리거를 설정하세요. 또한 보고서를 받고 싶은 시간을 선택할 수도 있습니다.

Google Script - Time Trigger

AI 스팸 분류 작동 방식 - 기술적인 부분

스크립트 작동 방식이 궁금하신 경우 다음의 간략한 개요를 참조하세요.

Gmail 스크립트는 Gmail API를 사용하여 Gmail 계정에서 읽지 않은 스팸 이메일을 검색합니다. 그런 다음 이메일 콘텐츠를 OpenAI의 API로 보내 스팸 점수를 분류하고 원하는 언어로 요약을 생성합니다. 스팸 점수가 낮은 이메일은 가양성일 가능성이 높으며 받은 편지함으로 이동할 수 있습니다.

1. 사용자 구성

보고서를 보낼 이메일 주소, OpenAI API 키, 선호하는 LLM 모델, 이메일 요약 언어를 제공할 수 있습니다.

 // Basic configuration const USER_EMAIL = '[email protected]' ; // Email address to send the report to const OPENAI_API_KEY = 'sk-proj-123' ; // API key for OpenAI const OPENAI_MODEL = 'gpt-4o' ; // Model name to use with OpenAI const USER_LANGUAGE = 'English' ; // Language for the email summary

2. Gmail 스팸 폴더에서 읽지 않은 이메일 찾기

우리는 지난 24시간 동안 도착했지만 아직 읽지 않은 스팸 이메일을 찾기 위해 에포크 시간을 사용합니다.

 const HOURS_AGO = 24 ; // Time frame to search for emails (in hours) const MAX_THREADS = 25 ; // Maximum number of email threads to process const getSpamThreads_ = ( ) => { const epoch = ( date ) => Math . floor ( date . getTime ( ) / 1000 ) ; const beforeDate = new Date ( ) ; const afterDate = new Date ( ) ; afterDate . setHours ( afterDate . getHours ( ) - HOURS_AGO ) ; const searchQuery = ` is:unread in:spam after: ${ epoch ( afterDate ) } before: ${ epoch ( beforeDate ) } ` ; return GmailApp . search ( searchQuery , 0 , MAX_THREADS ) ; } ;

3. OpenAI 모델에 대한 프롬프트 생성

이메일 메시지를 사용하여 OpenAI 모델에 대한 프롬프트를 생성합니다. 프롬프트는 이메일 콘텐츠를 분석하고 0에서 10까지의 스팸 점수를 할당하도록 AI 모델에 요청합니다. 응답은 JSON 형식이어야 합니다.

 const SYSTEM_PROMPT = ` You are an AI email classifier. Given the content of an email, analyze it and assign a spam score on a scale from 0 to 10, where 0 indicates a legitimate email and 10 indicates a definite spam email. Provide a short summary of the email in ${ USER_LANGUAGE } . Your response should be in JSON format. ` ; const MAX_BODY_LENGTH = 200 ; // Maximum length of email body to include in the AI prompt const getMessagePrompt_ = ( message ) => { const body = message . getPlainBody ( ) . replace ( / https?:\/\/[^\s>]+ / g , '' ) . replace ( / [\n\r\t] / g , ' ' ) . replace ( / \s+ / g , ' ' ) . trim ( ) ; // remove all URLs, and whitespace characters return [ ` Subject: ${ message . getSubject ( ) } ` , ` Sender: ${ message . getFrom ( ) } ` , ` Body: ${ body . substring ( 0 , MAX_BODY_LENGTH ) } ` , ] . join ( '\n' ) ; } ;

4. OpenAI API를 호출하여 스팸 점수를 얻습니다.

메시지 프롬프트를 OpenAI API에 전달하고 스팸 점수와 이메일 콘텐츠 요약을 얻습니다. 스팸 점수는 이메일이 오탐지인지 확인하는 데 사용됩니다.

tokens 변수는 OpenAI API 호출에 사용된 토큰 수를 추적하고 이메일 보고서에 포함됩니다. 이 정보를 사용하여 API 사용량을 모니터링할 수 있습니다.

 let tokens = 0 ; const getMessageScore_ = ( messagePrompt ) => { const apiUrl = ` https://api.openai.com/v1/chat/completions ` ; const headers = { 'Content-Type' : 'application/json' , Authorization : ` Bearer ${ OPENAI_API_KEY } ` , } ; const response = UrlFetchApp . fetch ( apiUrl , { method : 'POST' , headers , payload : JSON . stringify ( { model : OPENAI_MODEL , messages : [ { role : 'system' , content : SYSTEM_PROMPT } , { role : 'user' , content : messagePrompt } , ] , temperature : 0.2 , max_tokens : 124 , response_format : { type : 'json_object' } , } ) , } ) ; const data = JSON . parse ( response . getContentText ( ) ) ; tokens += data . usage . total_tokens ; const content = JSON . parse ( data . choices [ 0 ] . message . content ) ; return content ; } ;

5. 스팸 이메일 처리 및 보고서 이메일 전송

이 Google 스크립트를 수동으로 실행하거나 크론 트리거를 설정하여 정기적으로 자동으로 실행할 수 있습니다. 스팸 이메일을 읽음으로 표시하여 다시 처리되지 않도록 합니다.

 const SPAM_THRESHOLD = 2 ; // Threshold for spam score to include in the report const reportFalsePositives = ( ) => { const html = [ ] ; const threads = getSpamThreads_ ( ) ; for ( let i = 0 ; i < threads . length ; i += 1 ) { const [ message ] = threads [ i ] . getMessages ( ) ; const messagePrompt = getMessagePrompt_ ( message ) ; // Get the spam score and summary from OpenAI const { spam_score , summary } = getMessageScore_ ( messagePrompt ) ; if ( spam_score <= SPAM_THRESHOLD ) { // Add email message to the report if the spam score is below the threshold html . push ( ` <tr><td> ${ message . getFrom ( ) } </td> <td> ${ summary } </td></tr> ` ) ; } } threads . forEach ( ( thread ) => thread . markRead ( ) ) ; // Mark all processed emails as read if ( html . length > 0 ) { const htmlBody = [ ` <table border="1"> ` , '<tr><th>Email Sender</th><th>Summary</th></tr>' , html . join ( '' ) , '</table>' , ] . join ( '' ) ; const subject = ` Gmail Spam Report - ${ tokens } tokens used ` ; GmailApp . sendEmail ( USER_EMAIL , subject , '' , { htmlBody } ) ; } } ;

참조: Gmail 메시지 인증