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 エディタの [トリガー] メニューに移動し、以下に示すように、このスクリプトを毎日 1 回実行するように時間駆動のトリガーを設定します。 レポートを受け取りたい時刻を選択することもできます。

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 モデルのプロンプトを作成します。 プロンプトは、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 メッセージを認証する