ค้นหาอีเมลที่ถูกต้องในโฟลเดอร์สแปม Gmail ของคุณด้วย AI และ Google Script

เผยแพร่แล้ว: 2024-06-08

ผลบวกลวงใน Gmail เป็นเรื่องปกติแต่สามารถเกิดขึ้นได้ ซึ่งหมายความว่าอีเมลสำคัญอาจไปอยู่ในโฟลเดอร์สแปมของคุณโดยไม่ได้ตั้งใจ เมื่อคุณต้องรับมือกับข้อความสแปมหลายร้อยข้อความทุกวัน การระบุอีเมลที่ถูกต้องเหล่านี้จะยิ่งท้าทายมากขึ้น

คุณสามารถสร้างตัวกรองใน Gmail เพื่อให้อีเมลจากผู้ส่งที่ระบุหรือคำหลักบางคำไม่ถูกทำเครื่องหมายว่าเป็นสแปม แต่เห็นได้ชัดว่าตัวกรองเหล่านี้ใช้ไม่ได้กับอีเมลจากผู้ส่งรายใหม่หรือผู้ส่งที่ไม่รู้จัก

ค้นหาข้อความที่จัดประเภทไม่ถูกต้องในจดหมายขยะ Gmail

จะเกิดอะไรขึ้นถ้าเราใช้ AI เพื่อวิเคราะห์อีเมลสแปมของเราใน Gmail และคาดการณ์ว่าอีเมลใดที่มีแนวโน้มว่าจะเป็นผลบวกลวง? ด้วยรายการอีเมลที่ไม่จัดประเภทนี้ เราสามารถย้ายอีเมลเหล่านี้ไปที่กล่องจดหมายโดยอัตโนมัติหรือสร้างรายงานสำหรับการตรวจสอบด้วยตนเอง

นี่คือรายงานตัวอย่างที่สร้างจาก Gmail ประกอบด้วยรายการอีเมลที่มีคะแนนสแปมต่ำซึ่งมีแนวโน้มว่าจะถูกต้องและควรย้ายไปยังกล่องจดหมาย รายงานยังประกอบด้วยสรุปเนื้อหาอีเมลในภาษาที่คุณต้องการอีกด้วย

Gmail Spam Summary

ในการเริ่มต้น ให้เปิด Google Script นี้และทำสำเนาใน Google Drive ของคุณ เปลี่ยนไปใช้โปรแกรมแก้ไขสคริปต์ Apps และระบุที่อยู่อีเมล คีย์ OpenAI API และภาษาที่ต้องการสำหรับสรุปอีเมล

เลือกฟังก์ชัน reportFalsePositives จากดรอปดาวน์แล้วคลิกปุ่มเล่นเพื่อเรียกใช้สคริปต์ มันจะค้นหาอีเมลสแปมที่ยังไม่ได้อ่านในบัญชี Gmail ของคุณ วิเคราะห์โดยใช้ API ของ OpenAI และส่งรายงานอีเมลที่มีคะแนนสแปมต่ำถึงคุณ

หากคุณต้องการเรียกใช้สคริปต์นี้โดยอัตโนมัติตามช่วงเวลาที่สม่ำเสมอ ให้ไปที่เมนู "ทริกเกอร์" ในตัวแก้ไขสคริปต์ของ Google Apps และตั้งค่าทริกเกอร์ที่ขับเคลื่อนด้วยเวลาเพื่อเรียกใช้สคริปต์นี้วันละครั้งดังที่แสดงด้านล่าง คุณสามารถเลือกเวลาของวันที่คุณต้องการรับรายงานได้

Google Script - Time Trigger

AI Spam Classification ทำงานอย่างไร - ส่วนทางเทคนิค

หากคุณอยากรู้ว่าสคริปต์ทำงานอย่างไร ต่อไปนี้เป็นภาพรวมโดยย่อ:

สคริปต์ Gmail ใช้ Gmail API เพื่อค้นหาอีเมลสแปมที่ยังไม่ได้อ่านในบัญชี Gmail ของคุณ จากนั้นจะส่งเนื้อหาอีเมลไปยัง API ของ OpenAI เพื่อจัดประเภทคะแนนสแปมและสร้างข้อมูลสรุปในภาษาที่คุณต้องการ อีเมลที่มีคะแนนสแปมต่ำมีแนวโน้มที่จะเป็นผลบวกที่ผิดพลาดและสามารถย้ายไปยังกล่องจดหมายได้

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 โดยใช้ข้อความอีเมล พรอมต์จะขอให้โมเดล AI วิเคราะห์เนื้อหาอีเมลและกำหนดคะแนนสแปมในระดับตั้งแต่ 0 ถึง 10 การตอบกลับควรอยู่ในรูปแบบ 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 นี้ด้วยตนเองหรือตั้งค่าทริกเกอร์ cron ให้เรียกใช้โดยอัตโนมัติตามช่วงเวลาที่สม่ำเสมอ จะทำเครื่องหมายอีเมลขยะว่าอ่านแล้วเพื่อไม่ให้ประมวลผลอีกครั้ง

 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 ของคุณ