[{"data":1,"prerenderedAt":2577},["ShallowReactive",2],{"content-/stock-summary-email-setup":3,"all-pages-for-dir":2555,"related-/stock-summary-email-setup":2556,"og-image-/stock-summary-email-setup":2576},{"id":4,"title":5,"body":6,"category":2540,"concepts":2540,"description":2541,"extension":2542,"meta":2543,"navigation":289,"ogImage":2540,"path":2544,"project_name":2540,"published":2545,"publishedAt":2546,"seo":2547,"source":2540,"stem":2548,"tags":2549,"todo":2540,"unpublished":2545,"updatedAt":2540,"__hash__":2554},"pages/2025-11/2025-11-14/stock-summary-email-setup.md","株式市場サマリーのメール送信設定ガイド",{"type":7,"value":8,"toc":2499},"minimark",[9,12,21,26,30,83,86,112,116,120,146,150,156,203,210,214,240,244,250,776,780,786,893,897,902,1614,1618,1653,1657,1663,1666,1841,1848,1856,1860,1917,1921,1930,1934,1938,1973,1976,2010,2014,2017,2022,2064,2067,2113,2116,2217,2221,2224,2255,2259,2262,2279,2282,2288,2302,2306,2336,2340,2343,2375,2378,2381,2404,2407,2410,2413,2430,2436,2440,2495],[10,11,5],"h1",{"id":5},[13,14,15,16,20],"p",{},"このドキュメントでは、",[17,18,19],"code",{},"/stock-summary"," スラッシュコマンドにメール送信機能を統合する手順を説明します。",[22,23,25],"h2",{"id":24},"概要","📋 概要",[27,28,29],"h3",{"id":29},"実装フロー",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-mermaid shiki shiki-themes vitesse-light vitesse-light","graph LR\n    A[/stock-summary実行] --> B[市場データ収集]\n    B --> C[マークダウン生成]\n    C --> D[ファイル保存]\n    D --> E[HTML変換]\n    E --> F[Resend API経由でメール送信]\n    F --> G[完了通知]\n","mermaid","",[17,38,39,47,53,59,65,71,77],{"__ignoreMap":36},[40,41,44],"span",{"class":42,"line":43},"line",1,[40,45,46],{},"graph LR\n",[40,48,50],{"class":42,"line":49},2,[40,51,52],{},"    A[/stock-summary実行] --> B[市場データ収集]\n",[40,54,56],{"class":42,"line":55},3,[40,57,58],{},"    B --> C[マークダウン生成]\n",[40,60,62],{"class":42,"line":61},4,[40,63,64],{},"    C --> D[ファイル保存]\n",[40,66,68],{"class":42,"line":67},5,[40,69,70],{},"    D --> E[HTML変換]\n",[40,72,74],{"class":42,"line":73},6,[40,75,76],{},"    E --> F[Resend API経由でメール送信]\n",[40,78,80],{"class":42,"line":79},7,[40,81,82],{},"    F --> G[完了通知]\n",[27,84,85],{"id":85},"アーキテクチャ",[87,88,89,100,106],"ul",{},[90,91,92,96,97],"li",{},[93,94,95],"strong",{},"マークダウン生成",": ",[17,98,99],{},"apps/web/content/stock-information/YYYY-MM-DD.md",[90,101,102,105],{},[93,103,104],{},"HTML変換",": マークダウン→HTML（テーブル・絵文字対応）",[90,107,108,111],{},[93,109,110],{},"メール送信",": Resend API経由でHTML形式メールを送信",[22,113,115],{"id":114},"セットアップ手順","🔧 セットアップ手順",[27,117,119],{"id":118},"_1-resend-apiキーの取得","1. Resend APIキーの取得",[121,122,123,133,139],"ol",{},[90,124,125,132],{},[126,127,131],"a",{"href":128,"rel":129},"https://resend.com",[130],"nofollow","Resend"," にログイン",[90,134,135,138],{},[93,136,137],{},"API Keys"," から新しいAPIキーを作成",[90,140,141,142,145],{},"APIキーをコピー（例: ",[17,143,144],{},"re_123456789...","）",[27,147,149],{"id":148},"_2-環境変数の設定","2. 環境変数の設定",[13,151,152,155],{},[17,153,154],{},".env"," ファイルに以下を追加：",[31,157,161],{"className":158,"code":159,"language":160,"meta":36,"style":36},"language-bash shiki shiki-themes vitesse-light vitesse-light","# Resend API Configuration\nRESEND_API_KEY=re_your_api_key_here\nSTOCK_SUMMARY_EMAIL_TO=your-email@example.com\nSTOCK_SUMMARY_EMAIL_FROM=stock-summary@yourdomain.com\n","bash",[17,162,163,169,183,193],{"__ignoreMap":36},[40,164,165],{"class":42,"line":43},[40,166,168],{"class":167},"sxvE3","# Resend API Configuration\n",[40,170,171,175,179],{"class":42,"line":49},[40,172,174],{"class":173},"s4oTP","RESEND_API_KEY",[40,176,178],{"class":177},"shFtX","=",[40,180,182],{"class":181},"sdGka","re_your_api_key_here\n",[40,184,185,188,190],{"class":42,"line":55},[40,186,187],{"class":173},"STOCK_SUMMARY_EMAIL_TO",[40,189,178],{"class":177},[40,191,192],{"class":181},"your-email@example.com\n",[40,194,195,198,200],{"class":42,"line":61},[40,196,197],{"class":173},"STOCK_SUMMARY_EMAIL_FROM",[40,199,178],{"class":177},[40,201,202],{"class":181},"stock-summary@yourdomain.com\n",[13,204,205,206,209],{},"⚠️ ",[93,207,208],{},"注意",": Resendの送信元メールアドレスは、ドメイン認証が必要です。",[27,211,213],{"id":212},"_3-resend-パッケージのインストール","3. Resend パッケージのインストール",[31,215,217],{"className":158,"code":216,"language":160,"meta":36,"style":36},"cd apps/web\npnpm add resend\n",[17,218,219,228],{"__ignoreMap":36},[40,220,221,225],{"class":42,"line":43},[40,222,224],{"class":223},"sz8Xr","cd",[40,226,227],{"class":181}," apps/web\n",[40,229,230,234,237],{"class":42,"line":49},[40,231,233],{"class":232},"senZ8","pnpm",[40,235,236],{"class":181}," add",[40,238,239],{"class":181}," resend\n",[27,241,243],{"id":242},"_4-メール送信api-エンドポイントの作成","4. メール送信API エンドポイントの作成",[13,245,246,249],{},[17,247,248],{},"apps/web/server/api/send-stock-summary.post.ts"," を作成：",[31,251,255],{"className":252,"code":253,"language":254,"meta":36,"style":36},"language-typescript shiki shiki-themes vitesse-light vitesse-light","import { Resend } from 'resend'\n\nexport default defineEventHandler(async (event) => {\n  const config = useRuntimeConfig()\n  const body = await readBody(event)\n\n  // Resend クライアント初期化\n  const resend = new Resend(config.resendApiKey)\n\n  try {\n    const { data, error } = await resend.emails.send({\n      from: config.stockSummaryEmailFrom,\n      to: config.stockSummaryEmailTo,\n      subject: `📊 米国株式市場サマリー - ${body.date}`,\n      html: body.htmlContent,\n    })\n\n    if (error) {\n      throw createError({\n        statusCode: 500,\n        message: `メール送信エラー: ${error.message}`,\n      })\n    }\n\n    return {\n      success: true,\n      messageId: data?.id,\n    }\n  } catch (err) {\n    console.error('Resend API Error:', err)\n    throw createError({\n      statusCode: 500,\n      message: 'メール送信に失敗しました',\n    })\n  }\n})\n","typescript",[17,256,257,285,291,324,341,363,367,372,398,403,411,451,469,486,517,534,540,545,560,571,585,613,619,625,630,638,651,670,675,693,720,730,742,759,764,770],{"__ignoreMap":36},[40,258,259,263,266,269,272,275,279,282],{"class":42,"line":43},[40,260,262],{"class":261},"sHkkW","import",[40,264,265],{"class":177}," {",[40,267,268],{"class":173}," Resend",[40,270,271],{"class":177}," }",[40,273,274],{"class":261}," from",[40,276,278],{"class":277},"sMJiu"," '",[40,280,281],{"class":181},"resend",[40,283,284],{"class":277},"'\n",[40,286,287],{"class":42,"line":49},[40,288,290],{"emptyLinePlaceholder":289},true,"\n",[40,292,293,296,299,302,305,309,312,315,318,321],{"class":42,"line":55},[40,294,295],{"class":261},"export",[40,297,298],{"class":261}," default",[40,300,301],{"class":232}," defineEventHandler",[40,303,304],{"class":177},"(",[40,306,308],{"class":307},"stQ0i","async",[40,310,311],{"class":177}," (",[40,313,314],{"class":173},"event",[40,316,317],{"class":177},")",[40,319,320],{"class":177}," =>",[40,322,323],{"class":177}," {\n",[40,325,326,329,332,335,338],{"class":42,"line":61},[40,327,328],{"class":307},"  const ",[40,330,331],{"class":173},"config",[40,333,334],{"class":177}," =",[40,336,337],{"class":232}," useRuntimeConfig",[40,339,340],{"class":177},"()\n",[40,342,343,345,348,350,353,356,358,360],{"class":42,"line":67},[40,344,328],{"class":307},[40,346,347],{"class":173},"body",[40,349,334],{"class":177},[40,351,352],{"class":261}," await",[40,354,355],{"class":232}," readBody",[40,357,304],{"class":177},[40,359,314],{"class":173},[40,361,362],{"class":177},")\n",[40,364,365],{"class":42,"line":73},[40,366,290],{"emptyLinePlaceholder":289},[40,368,369],{"class":42,"line":79},[40,370,371],{"class":167},"  // Resend クライアント初期化\n",[40,373,375,377,379,381,384,386,388,390,393,396],{"class":42,"line":374},8,[40,376,328],{"class":307},[40,378,281],{"class":173},[40,380,334],{"class":177},[40,382,383],{"class":307}," new ",[40,385,131],{"class":232},[40,387,304],{"class":177},[40,389,331],{"class":173},[40,391,392],{"class":177},".",[40,394,395],{"class":173},"resendApiKey",[40,397,362],{"class":177},[40,399,401],{"class":42,"line":400},9,[40,402,290],{"emptyLinePlaceholder":289},[40,404,406,409],{"class":42,"line":405},10,[40,407,408],{"class":261},"  try",[40,410,323],{"class":177},[40,412,414,417,420,423,426,429,431,433,435,438,440,443,445,448],{"class":42,"line":413},11,[40,415,416],{"class":307},"    const ",[40,418,419],{"class":177},"{",[40,421,422],{"class":173}," data",[40,424,425],{"class":177},",",[40,427,428],{"class":173}," error",[40,430,271],{"class":177},[40,432,334],{"class":177},[40,434,352],{"class":261},[40,436,437],{"class":173}," resend",[40,439,392],{"class":177},[40,441,442],{"class":173},"emails",[40,444,392],{"class":177},[40,446,447],{"class":232},"send",[40,449,450],{"class":177},"({\n",[40,452,454,457,459,461,463,466],{"class":42,"line":453},12,[40,455,456],{"class":223},"      from",[40,458,96],{"class":177},[40,460,331],{"class":173},[40,462,392],{"class":177},[40,464,465],{"class":173},"stockSummaryEmailFrom",[40,467,468],{"class":177},",\n",[40,470,472,475,477,479,481,484],{"class":42,"line":471},13,[40,473,474],{"class":223},"      to",[40,476,96],{"class":177},[40,478,331],{"class":173},[40,480,392],{"class":177},[40,482,483],{"class":173},"stockSummaryEmailTo",[40,485,468],{"class":177},[40,487,489,492,494,497,500,503,505,507,510,513,515],{"class":42,"line":488},14,[40,490,491],{"class":223},"      subject",[40,493,96],{"class":177},[40,495,496],{"class":277},"`",[40,498,499],{"class":181},"📊 米国株式市場サマリー - ",[40,501,502],{"class":261},"${",[40,504,347],{"class":181},[40,506,392],{"class":177},[40,508,509],{"class":181},"date",[40,511,512],{"class":261},"}",[40,514,496],{"class":277},[40,516,468],{"class":177},[40,518,520,523,525,527,529,532],{"class":42,"line":519},15,[40,521,522],{"class":223},"      html",[40,524,96],{"class":177},[40,526,347],{"class":173},[40,528,392],{"class":177},[40,530,531],{"class":173},"htmlContent",[40,533,468],{"class":177},[40,535,537],{"class":42,"line":536},16,[40,538,539],{"class":177},"    })\n",[40,541,543],{"class":42,"line":542},17,[40,544,290],{"emptyLinePlaceholder":289},[40,546,548,551,553,556,558],{"class":42,"line":547},18,[40,549,550],{"class":261},"    if",[40,552,311],{"class":177},[40,554,555],{"class":173},"error",[40,557,317],{"class":177},[40,559,323],{"class":177},[40,561,563,566,569],{"class":42,"line":562},19,[40,564,565],{"class":261},"      throw",[40,567,568],{"class":232}," createError",[40,570,450],{"class":177},[40,572,574,577,579,583],{"class":42,"line":573},20,[40,575,576],{"class":223},"        statusCode",[40,578,96],{"class":177},[40,580,582],{"class":581},"sM54T","500",[40,584,468],{"class":177},[40,586,588,591,593,595,598,600,602,604,607,609,611],{"class":42,"line":587},21,[40,589,590],{"class":223},"        message",[40,592,96],{"class":177},[40,594,496],{"class":277},[40,596,597],{"class":181},"メール送信エラー: ",[40,599,502],{"class":261},[40,601,555],{"class":181},[40,603,392],{"class":177},[40,605,606],{"class":181},"message",[40,608,512],{"class":261},[40,610,496],{"class":277},[40,612,468],{"class":177},[40,614,616],{"class":42,"line":615},22,[40,617,618],{"class":177},"      })\n",[40,620,622],{"class":42,"line":621},23,[40,623,624],{"class":177},"    }\n",[40,626,628],{"class":42,"line":627},24,[40,629,290],{"emptyLinePlaceholder":289},[40,631,633,636],{"class":42,"line":632},25,[40,634,635],{"class":261},"    return",[40,637,323],{"class":177},[40,639,641,644,646,649],{"class":42,"line":640},26,[40,642,643],{"class":223},"      success",[40,645,96],{"class":177},[40,647,648],{"class":261},"true",[40,650,468],{"class":177},[40,652,654,657,659,662,665,668],{"class":42,"line":653},27,[40,655,656],{"class":223},"      messageId",[40,658,96],{"class":177},[40,660,661],{"class":173},"data",[40,663,664],{"class":177},"?.",[40,666,667],{"class":173},"id",[40,669,468],{"class":177},[40,671,673],{"class":42,"line":672},28,[40,674,624],{"class":177},[40,676,678,681,684,686,689,691],{"class":42,"line":677},29,[40,679,680],{"class":177},"  }",[40,682,683],{"class":261}," catch",[40,685,311],{"class":177},[40,687,688],{"class":173},"err",[40,690,317],{"class":177},[40,692,323],{"class":177},[40,694,696,699,701,703,705,708,711,713,715,718],{"class":42,"line":695},30,[40,697,698],{"class":173},"    console",[40,700,392],{"class":177},[40,702,555],{"class":232},[40,704,304],{"class":177},[40,706,707],{"class":277},"'",[40,709,710],{"class":181},"Resend API Error:",[40,712,707],{"class":277},[40,714,425],{"class":177},[40,716,717],{"class":173}," err",[40,719,362],{"class":177},[40,721,723,726,728],{"class":42,"line":722},31,[40,724,725],{"class":261},"    throw",[40,727,568],{"class":232},[40,729,450],{"class":177},[40,731,733,736,738,740],{"class":42,"line":732},32,[40,734,735],{"class":223},"      statusCode",[40,737,96],{"class":177},[40,739,582],{"class":581},[40,741,468],{"class":177},[40,743,745,748,750,752,755,757],{"class":42,"line":744},33,[40,746,747],{"class":223},"      message",[40,749,96],{"class":177},[40,751,707],{"class":277},[40,753,754],{"class":181},"メール送信に失敗しました",[40,756,707],{"class":277},[40,758,468],{"class":177},[40,760,762],{"class":42,"line":761},34,[40,763,539],{"class":177},[40,765,767],{"class":42,"line":766},35,[40,768,769],{"class":177},"  }\n",[40,771,773],{"class":42,"line":772},36,[40,774,775],{"class":177},"})\n",[27,777,779],{"id":778},"_5-nuxt設定の更新","5. Nuxt設定の更新",[13,781,782,785],{},[17,783,784],{},"apps/web/nuxt.config.ts"," に環境変数を追加：",[31,787,789],{"className":252,"code":788,"language":254,"meta":36,"style":36},"export default defineNuxtConfig({\n  runtimeConfig: {\n    // サーバーサイドのみアクセス可能\n    resendApiKey: process.env.RESEND_API_KEY,\n    stockSummaryEmailFrom: process.env.STOCK_SUMMARY_EMAIL_FROM || 'stock-summary@yourdomain.com',\n    stockSummaryEmailTo: process.env.STOCK_SUMMARY_EMAIL_TO,\n  },\n})\n",[17,790,791,802,810,815,836,865,884,889],{"__ignoreMap":36},[40,792,793,795,797,800],{"class":42,"line":43},[40,794,295],{"class":261},[40,796,298],{"class":261},[40,798,799],{"class":232}," defineNuxtConfig",[40,801,450],{"class":177},[40,803,804,807],{"class":42,"line":49},[40,805,806],{"class":223},"  runtimeConfig",[40,808,809],{"class":177},": {\n",[40,811,812],{"class":42,"line":55},[40,813,814],{"class":167},"    // サーバーサイドのみアクセス可能\n",[40,816,817,820,822,825,827,830,832,834],{"class":42,"line":61},[40,818,819],{"class":223},"    resendApiKey",[40,821,96],{"class":177},[40,823,824],{"class":173},"process",[40,826,392],{"class":177},[40,828,829],{"class":173},"env",[40,831,392],{"class":177},[40,833,174],{"class":173},[40,835,468],{"class":177},[40,837,838,841,843,845,847,849,851,853,856,858,861,863],{"class":42,"line":67},[40,839,840],{"class":223},"    stockSummaryEmailFrom",[40,842,96],{"class":177},[40,844,824],{"class":173},[40,846,392],{"class":177},[40,848,829],{"class":173},[40,850,392],{"class":177},[40,852,197],{"class":173},[40,854,855],{"class":307}," ||",[40,857,278],{"class":277},[40,859,860],{"class":181},"stock-summary@yourdomain.com",[40,862,707],{"class":277},[40,864,468],{"class":177},[40,866,867,870,872,874,876,878,880,882],{"class":42,"line":73},[40,868,869],{"class":223},"    stockSummaryEmailTo",[40,871,96],{"class":177},[40,873,824],{"class":173},[40,875,392],{"class":177},[40,877,829],{"class":173},[40,879,392],{"class":177},[40,881,187],{"class":173},[40,883,468],{"class":177},[40,885,886],{"class":42,"line":79},[40,887,888],{"class":177},"  },\n",[40,890,891],{"class":42,"line":374},[40,892,775],{"class":177},[27,894,896],{"id":895},"_6-マークダウンhtml変換ユーティリティの作成","6. マークダウン→HTML変換ユーティリティの作成",[13,898,899,249],{},[17,900,901],{},"apps/web/server/utils/markdown-to-html.ts",[31,903,905],{"className":252,"code":904,"language":254,"meta":36,"style":36},"import { marked } from 'marked'\nimport DOMPurify from 'isomorphic-dompurify'\n\n/**\n * マークダウンをHTML（メール送信用）に変換\n */\nexport async function markdownToEmailHtml(markdown: string): Promise\u003Cstring> {\n  // マークダウンをHTMLに変換\n  const rawHtml = await marked(markdown, {\n    gfm: true, // GitHub Flavored Markdown\n    breaks: true,\n  })\n\n  // XSS対策のサニタイズ\n  const cleanHtml = DOMPurify.sanitize(rawHtml)\n\n  // メール用スタイルを適用\n  return `\n\u003C!DOCTYPE html>\n\u003Chtml lang=\"ja\">\n\u003Chead>\n  \u003Cmeta charset=\"UTF-8\">\n  \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  \u003Cstyle>\n    body {\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;\n      line-height: 1.6;\n      color: #333;\n      max-width: 800px;\n      margin: 0 auto;\n      padding: 20px;\n      background-color: #f5f5f5;\n    }\n    .container {\n      background-color: #ffffff;\n      padding: 30px;\n      border-radius: 8px;\n      box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n    }\n    h1 {\n      color: #1a1a1a;\n      border-bottom: 3px solid #4CAF50;\n      padding-bottom: 10px;\n    }\n    h2 {\n      color: #2c3e50;\n      margin-top: 30px;\n      border-left: 4px solid #4CAF50;\n      padding-left: 10px;\n    }\n    h3 {\n      color: #34495e;\n      margin-top: 20px;\n    }\n    table {\n      width: 100%;\n      border-collapse: collapse;\n      margin: 20px 0;\n      font-size: 14px;\n    }\n    table th {\n      background-color: #4CAF50;\n      color: white;\n      padding: 12px;\n      text-align: left;\n      font-weight: 600;\n    }\n    table td {\n      padding: 12px;\n      border-bottom: 1px solid #ddd;\n    }\n    table tr:hover {\n      background-color: #f5f5f5;\n    }\n    strong {\n      color: #d32f2f;\n    }\n    .footer {\n      margin-top: 40px;\n      padding-top: 20px;\n      border-top: 2px solid #eee;\n      font-size: 12px;\n      color: #888;\n      text-align: center;\n    }\n  \u003C/style>\n\u003C/head>\n\u003Cbody>\n  \u003Cdiv class=\"container\">\n    ${cleanHtml}\n    \u003Cdiv class=\"footer\">\n      \u003Cp>このメールは /stock-summary コマンドにより自動生成されました\u003C/p>\n      \u003Cp>Generated at ${new Date().toLocaleString('ja-JP', { timeZone: 'Asia/Tokyo' })}\u003C/p>\n    \u003C/div>\n  \u003C/div>\n\u003C/body>\n\u003C/html>\n  `\n}\n",[17,906,907,927,943,947,952,957,962,1002,1007,1028,1043,1054,1059,1063,1068,1090,1094,1099,1107,1112,1117,1122,1127,1132,1137,1142,1147,1152,1157,1162,1167,1172,1177,1181,1186,1191,1196,1202,1208,1213,1219,1225,1231,1237,1242,1248,1254,1260,1266,1272,1277,1283,1289,1295,1300,1306,1312,1318,1324,1330,1335,1341,1347,1353,1359,1365,1371,1376,1382,1387,1393,1398,1404,1409,1414,1420,1426,1431,1437,1443,1449,1455,1461,1467,1473,1478,1484,1490,1496,1502,1513,1519,1525,1579,1585,1591,1597,1603,1609],{"__ignoreMap":36},[40,908,909,911,913,916,918,920,922,925],{"class":42,"line":43},[40,910,262],{"class":261},[40,912,265],{"class":177},[40,914,915],{"class":173}," marked",[40,917,271],{"class":177},[40,919,274],{"class":261},[40,921,278],{"class":277},[40,923,924],{"class":181},"marked",[40,926,284],{"class":277},[40,928,929,931,934,936,938,941],{"class":42,"line":49},[40,930,262],{"class":261},[40,932,933],{"class":173}," DOMPurify",[40,935,274],{"class":261},[40,937,278],{"class":277},[40,939,940],{"class":181},"isomorphic-dompurify",[40,942,284],{"class":277},[40,944,945],{"class":42,"line":55},[40,946,290],{"emptyLinePlaceholder":289},[40,948,949],{"class":42,"line":61},[40,950,951],{"class":167},"/**\n",[40,953,954],{"class":42,"line":67},[40,955,956],{"class":167}," * マークダウンをHTML（メール送信用）に変換\n",[40,958,959],{"class":42,"line":73},[40,960,961],{"class":167}," */\n",[40,963,964,966,969,972,975,977,980,982,986,989,992,995,997,1000],{"class":42,"line":79},[40,965,295],{"class":261},[40,967,968],{"class":307}," async",[40,970,971],{"class":307}," function",[40,973,974],{"class":232}," markdownToEmailHtml",[40,976,304],{"class":177},[40,978,979],{"class":173},"markdown",[40,981,96],{"class":177},[40,983,985],{"class":984},"sSkh3","string",[40,987,988],{"class":177},"):",[40,990,991],{"class":984}," Promise",[40,993,994],{"class":177},"\u003C",[40,996,985],{"class":984},[40,998,999],{"class":177},">",[40,1001,323],{"class":177},[40,1003,1004],{"class":42,"line":374},[40,1005,1006],{"class":167},"  // マークダウンをHTMLに変換\n",[40,1008,1009,1011,1014,1016,1018,1020,1022,1024,1026],{"class":42,"line":400},[40,1010,328],{"class":307},[40,1012,1013],{"class":173},"rawHtml",[40,1015,334],{"class":177},[40,1017,352],{"class":261},[40,1019,915],{"class":232},[40,1021,304],{"class":177},[40,1023,979],{"class":173},[40,1025,425],{"class":177},[40,1027,323],{"class":177},[40,1029,1030,1033,1035,1037,1040],{"class":42,"line":405},[40,1031,1032],{"class":223},"    gfm",[40,1034,96],{"class":177},[40,1036,648],{"class":261},[40,1038,1039],{"class":177},", ",[40,1041,1042],{"class":167},"// GitHub Flavored Markdown\n",[40,1044,1045,1048,1050,1052],{"class":42,"line":413},[40,1046,1047],{"class":223},"    breaks",[40,1049,96],{"class":177},[40,1051,648],{"class":261},[40,1053,468],{"class":177},[40,1055,1056],{"class":42,"line":453},[40,1057,1058],{"class":177},"  })\n",[40,1060,1061],{"class":42,"line":471},[40,1062,290],{"emptyLinePlaceholder":289},[40,1064,1065],{"class":42,"line":488},[40,1066,1067],{"class":167},"  // XSS対策のサニタイズ\n",[40,1069,1070,1072,1075,1077,1079,1081,1084,1086,1088],{"class":42,"line":519},[40,1071,328],{"class":307},[40,1073,1074],{"class":173},"cleanHtml",[40,1076,334],{"class":177},[40,1078,933],{"class":173},[40,1080,392],{"class":177},[40,1082,1083],{"class":232},"sanitize",[40,1085,304],{"class":177},[40,1087,1013],{"class":173},[40,1089,362],{"class":177},[40,1091,1092],{"class":42,"line":536},[40,1093,290],{"emptyLinePlaceholder":289},[40,1095,1096],{"class":42,"line":542},[40,1097,1098],{"class":167},"  // メール用スタイルを適用\n",[40,1100,1101,1104],{"class":42,"line":547},[40,1102,1103],{"class":261},"  return",[40,1105,1106],{"class":277}," `\n",[40,1108,1109],{"class":42,"line":562},[40,1110,1111],{"class":181},"\u003C!DOCTYPE html>\n",[40,1113,1114],{"class":42,"line":573},[40,1115,1116],{"class":181},"\u003Chtml lang=\"ja\">\n",[40,1118,1119],{"class":42,"line":587},[40,1120,1121],{"class":181},"\u003Chead>\n",[40,1123,1124],{"class":42,"line":615},[40,1125,1126],{"class":181},"  \u003Cmeta charset=\"UTF-8\">\n",[40,1128,1129],{"class":42,"line":621},[40,1130,1131],{"class":181},"  \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n",[40,1133,1134],{"class":42,"line":627},[40,1135,1136],{"class":181},"  \u003Cstyle>\n",[40,1138,1139],{"class":42,"line":632},[40,1140,1141],{"class":181},"    body {\n",[40,1143,1144],{"class":42,"line":640},[40,1145,1146],{"class":181},"      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;\n",[40,1148,1149],{"class":42,"line":653},[40,1150,1151],{"class":181},"      line-height: 1.6;\n",[40,1153,1154],{"class":42,"line":672},[40,1155,1156],{"class":181},"      color: #333;\n",[40,1158,1159],{"class":42,"line":677},[40,1160,1161],{"class":181},"      max-width: 800px;\n",[40,1163,1164],{"class":42,"line":695},[40,1165,1166],{"class":181},"      margin: 0 auto;\n",[40,1168,1169],{"class":42,"line":722},[40,1170,1171],{"class":181},"      padding: 20px;\n",[40,1173,1174],{"class":42,"line":732},[40,1175,1176],{"class":181},"      background-color: #f5f5f5;\n",[40,1178,1179],{"class":42,"line":744},[40,1180,624],{"class":181},[40,1182,1183],{"class":42,"line":761},[40,1184,1185],{"class":181},"    .container {\n",[40,1187,1188],{"class":42,"line":766},[40,1189,1190],{"class":181},"      background-color: #ffffff;\n",[40,1192,1193],{"class":42,"line":772},[40,1194,1195],{"class":181},"      padding: 30px;\n",[40,1197,1199],{"class":42,"line":1198},37,[40,1200,1201],{"class":181},"      border-radius: 8px;\n",[40,1203,1205],{"class":42,"line":1204},38,[40,1206,1207],{"class":181},"      box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n",[40,1209,1211],{"class":42,"line":1210},39,[40,1212,624],{"class":181},[40,1214,1216],{"class":42,"line":1215},40,[40,1217,1218],{"class":181},"    h1 {\n",[40,1220,1222],{"class":42,"line":1221},41,[40,1223,1224],{"class":181},"      color: #1a1a1a;\n",[40,1226,1228],{"class":42,"line":1227},42,[40,1229,1230],{"class":181},"      border-bottom: 3px solid #4CAF50;\n",[40,1232,1234],{"class":42,"line":1233},43,[40,1235,1236],{"class":181},"      padding-bottom: 10px;\n",[40,1238,1240],{"class":42,"line":1239},44,[40,1241,624],{"class":181},[40,1243,1245],{"class":42,"line":1244},45,[40,1246,1247],{"class":181},"    h2 {\n",[40,1249,1251],{"class":42,"line":1250},46,[40,1252,1253],{"class":181},"      color: #2c3e50;\n",[40,1255,1257],{"class":42,"line":1256},47,[40,1258,1259],{"class":181},"      margin-top: 30px;\n",[40,1261,1263],{"class":42,"line":1262},48,[40,1264,1265],{"class":181},"      border-left: 4px solid #4CAF50;\n",[40,1267,1269],{"class":42,"line":1268},49,[40,1270,1271],{"class":181},"      padding-left: 10px;\n",[40,1273,1275],{"class":42,"line":1274},50,[40,1276,624],{"class":181},[40,1278,1280],{"class":42,"line":1279},51,[40,1281,1282],{"class":181},"    h3 {\n",[40,1284,1286],{"class":42,"line":1285},52,[40,1287,1288],{"class":181},"      color: #34495e;\n",[40,1290,1292],{"class":42,"line":1291},53,[40,1293,1294],{"class":181},"      margin-top: 20px;\n",[40,1296,1298],{"class":42,"line":1297},54,[40,1299,624],{"class":181},[40,1301,1303],{"class":42,"line":1302},55,[40,1304,1305],{"class":181},"    table {\n",[40,1307,1309],{"class":42,"line":1308},56,[40,1310,1311],{"class":181},"      width: 100%;\n",[40,1313,1315],{"class":42,"line":1314},57,[40,1316,1317],{"class":181},"      border-collapse: collapse;\n",[40,1319,1321],{"class":42,"line":1320},58,[40,1322,1323],{"class":181},"      margin: 20px 0;\n",[40,1325,1327],{"class":42,"line":1326},59,[40,1328,1329],{"class":181},"      font-size: 14px;\n",[40,1331,1333],{"class":42,"line":1332},60,[40,1334,624],{"class":181},[40,1336,1338],{"class":42,"line":1337},61,[40,1339,1340],{"class":181},"    table th {\n",[40,1342,1344],{"class":42,"line":1343},62,[40,1345,1346],{"class":181},"      background-color: #4CAF50;\n",[40,1348,1350],{"class":42,"line":1349},63,[40,1351,1352],{"class":181},"      color: white;\n",[40,1354,1356],{"class":42,"line":1355},64,[40,1357,1358],{"class":181},"      padding: 12px;\n",[40,1360,1362],{"class":42,"line":1361},65,[40,1363,1364],{"class":181},"      text-align: left;\n",[40,1366,1368],{"class":42,"line":1367},66,[40,1369,1370],{"class":181},"      font-weight: 600;\n",[40,1372,1374],{"class":42,"line":1373},67,[40,1375,624],{"class":181},[40,1377,1379],{"class":42,"line":1378},68,[40,1380,1381],{"class":181},"    table td {\n",[40,1383,1385],{"class":42,"line":1384},69,[40,1386,1358],{"class":181},[40,1388,1390],{"class":42,"line":1389},70,[40,1391,1392],{"class":181},"      border-bottom: 1px solid #ddd;\n",[40,1394,1396],{"class":42,"line":1395},71,[40,1397,624],{"class":181},[40,1399,1401],{"class":42,"line":1400},72,[40,1402,1403],{"class":181},"    table tr:hover {\n",[40,1405,1407],{"class":42,"line":1406},73,[40,1408,1176],{"class":181},[40,1410,1412],{"class":42,"line":1411},74,[40,1413,624],{"class":181},[40,1415,1417],{"class":42,"line":1416},75,[40,1418,1419],{"class":181},"    strong {\n",[40,1421,1423],{"class":42,"line":1422},76,[40,1424,1425],{"class":181},"      color: #d32f2f;\n",[40,1427,1429],{"class":42,"line":1428},77,[40,1430,624],{"class":181},[40,1432,1434],{"class":42,"line":1433},78,[40,1435,1436],{"class":181},"    .footer {\n",[40,1438,1440],{"class":42,"line":1439},79,[40,1441,1442],{"class":181},"      margin-top: 40px;\n",[40,1444,1446],{"class":42,"line":1445},80,[40,1447,1448],{"class":181},"      padding-top: 20px;\n",[40,1450,1452],{"class":42,"line":1451},81,[40,1453,1454],{"class":181},"      border-top: 2px solid #eee;\n",[40,1456,1458],{"class":42,"line":1457},82,[40,1459,1460],{"class":181},"      font-size: 12px;\n",[40,1462,1464],{"class":42,"line":1463},83,[40,1465,1466],{"class":181},"      color: #888;\n",[40,1468,1470],{"class":42,"line":1469},84,[40,1471,1472],{"class":181},"      text-align: center;\n",[40,1474,1476],{"class":42,"line":1475},85,[40,1477,624],{"class":181},[40,1479,1481],{"class":42,"line":1480},86,[40,1482,1483],{"class":181},"  \u003C/style>\n",[40,1485,1487],{"class":42,"line":1486},87,[40,1488,1489],{"class":181},"\u003C/head>\n",[40,1491,1493],{"class":42,"line":1492},88,[40,1494,1495],{"class":181},"\u003Cbody>\n",[40,1497,1499],{"class":42,"line":1498},89,[40,1500,1501],{"class":181},"  \u003Cdiv class=\"container\">\n",[40,1503,1505,1508,1510],{"class":42,"line":1504},90,[40,1506,1507],{"class":261},"    ${",[40,1509,1074],{"class":181},[40,1511,1512],{"class":261},"}\n",[40,1514,1516],{"class":42,"line":1515},91,[40,1517,1518],{"class":181},"    \u003Cdiv class=\"footer\">\n",[40,1520,1522],{"class":42,"line":1521},92,[40,1523,1524],{"class":181},"      \u003Cp>このメールは /stock-summary コマンドにより自動生成されました\u003C/p>\n",[40,1526,1528,1531,1533,1536,1539,1542,1545,1547,1549,1552,1554,1556,1559,1562,1564,1566,1569,1571,1574,1576],{"class":42,"line":1527},93,[40,1529,1530],{"class":181},"      \u003Cp>Generated at ",[40,1532,502],{"class":261},[40,1534,1535],{"class":307},"new",[40,1537,1538],{"class":232}," Date",[40,1540,1541],{"class":177},"().",[40,1543,1544],{"class":232},"toLocaleString",[40,1546,304],{"class":177},[40,1548,707],{"class":277},[40,1550,1551],{"class":181},"ja-JP",[40,1553,707],{"class":277},[40,1555,425],{"class":177},[40,1557,1558],{"class":177}," { ",[40,1560,1561],{"class":223},"timeZone",[40,1563,96],{"class":177},[40,1565,707],{"class":277},[40,1567,1568],{"class":181},"Asia/Tokyo",[40,1570,707],{"class":277},[40,1572,1573],{"class":177}," })",[40,1575,512],{"class":261},[40,1577,1578],{"class":181},"\u003C/p>\n",[40,1580,1582],{"class":42,"line":1581},94,[40,1583,1584],{"class":181},"    \u003C/div>\n",[40,1586,1588],{"class":42,"line":1587},95,[40,1589,1590],{"class":181},"  \u003C/div>\n",[40,1592,1594],{"class":42,"line":1593},96,[40,1595,1596],{"class":181},"\u003C/body>\n",[40,1598,1600],{"class":42,"line":1599},97,[40,1601,1602],{"class":181},"\u003C/html>\n",[40,1604,1606],{"class":42,"line":1605},98,[40,1607,1608],{"class":277},"  `\n",[40,1610,1612],{"class":42,"line":1611},99,[40,1613,1512],{"class":177},[27,1615,1617],{"id":1616},"_7-必要なパッケージのインストール","7. 必要なパッケージのインストール",[31,1619,1621],{"className":158,"code":1620,"language":160,"meta":36,"style":36},"cd apps/web\npnpm add marked isomorphic-dompurify\npnpm add -D @types/marked\n",[17,1622,1623,1629,1640],{"__ignoreMap":36},[40,1624,1625,1627],{"class":42,"line":43},[40,1626,224],{"class":223},[40,1628,227],{"class":181},[40,1630,1631,1633,1635,1637],{"class":42,"line":49},[40,1632,233],{"class":232},[40,1634,236],{"class":181},[40,1636,915],{"class":181},[40,1638,1639],{"class":181}," isomorphic-dompurify\n",[40,1641,1642,1644,1646,1650],{"class":42,"line":55},[40,1643,233],{"class":232},[40,1645,236],{"class":181},[40,1647,1649],{"class":1648},"snbK4"," -D",[40,1651,1652],{"class":181}," @types/marked\n",[22,1654,1656],{"id":1655},"スラッシュコマンドの更新","📝 スラッシュコマンドの更新",[13,1658,1659,1662],{},[17,1660,1661],{},".claude/commands/stock-summary.md"," を更新して、メール送信ステップを追加：",[27,1664,1665],{"id":1665},"更新箇所",[31,1667,1670],{"className":1668,"code":1669,"language":979,"meta":36,"style":36},"language-markdown shiki shiki-themes vitesse-light vitesse-light","## 実行方法\n\n**Task toolを使用してgeneral-purposeエージェントに以下を依頼：**\n\n1. WebSearchで各銘柄の昨日の株価とニュースを検索\n2. 市場全体の動向を検索\n3. マクロ経済ニュースを検索\n4. 収集した情報を統合してマークダウンレポートを作成\n5. **マークダウンファイルを `apps/web/content/stock-information/YYYY-MM-DD.md` に保存**\n6. **マークダウンをHTMLに変換**\n7. **Bash toolで以下のコマンドを実行してメール送信:**\n\n```bash\ncurl -X POST http://localhost:3000/api/send-stock-summary \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"date\": \"YYYY-MM-DD\",\n    \"htmlContent\": \"\u003Chtml>...\u003C/html>\"\n  }'\n",[17,1671,1672,1682,1686,1698,1702,1711,1719,1727,1735,1757,1769,1781,1785,1793,1810,1815,1825,1830,1835],{"__ignoreMap":36},[40,1673,1674,1678],{"class":42,"line":43},[40,1675,1677],{"class":1676},"sFA8A","##",[40,1679,1681],{"class":1680},"syTZV"," 実行方法\n",[40,1683,1684],{"class":42,"line":49},[40,1685,290],{"emptyLinePlaceholder":289},[40,1687,1688,1691,1695],{"class":42,"line":55},[40,1689,1690],{"class":1676},"**",[40,1692,1694],{"class":1693},"s9pho","Task toolを使用してgeneral-purposeエージェントに以下を依頼：",[40,1696,1697],{"class":1676},"**\n",[40,1699,1700],{"class":42,"line":61},[40,1701,290],{"emptyLinePlaceholder":289},[40,1703,1704,1707],{"class":42,"line":67},[40,1705,1706],{"class":1648},"1.",[40,1708,1710],{"class":1709},"sG7-3"," WebSearchで各銘柄の昨日の株価とニュースを検索\n",[40,1712,1713,1716],{"class":42,"line":73},[40,1714,1715],{"class":1648},"2.",[40,1717,1718],{"class":1709}," 市場全体の動向を検索\n",[40,1720,1721,1724],{"class":42,"line":79},[40,1722,1723],{"class":1648},"3.",[40,1725,1726],{"class":1709}," マクロ経済ニュースを検索\n",[40,1728,1729,1732],{"class":42,"line":374},[40,1730,1731],{"class":1648},"4.",[40,1733,1734],{"class":1709}," 収集した情報を統合してマークダウンレポートを作成\n",[40,1736,1737,1740,1743,1746,1748,1750,1752,1755],{"class":42,"line":400},[40,1738,1739],{"class":1648},"5.",[40,1741,1742],{"class":1676}," **",[40,1744,1745],{"class":1693},"マークダウンファイルを ",[40,1747,496],{"class":1676},[40,1749,99],{"class":1693},[40,1751,496],{"class":1676},[40,1753,1754],{"class":1693}," に保存",[40,1756,1697],{"class":1676},[40,1758,1759,1762,1764,1767],{"class":42,"line":405},[40,1760,1761],{"class":1648},"6.",[40,1763,1742],{"class":1676},[40,1765,1766],{"class":1693},"マークダウンをHTMLに変換",[40,1768,1697],{"class":1676},[40,1770,1771,1774,1776,1779],{"class":42,"line":413},[40,1772,1773],{"class":1648},"7.",[40,1775,1742],{"class":1676},[40,1777,1778],{"class":1693},"Bash toolで以下のコマンドを実行してメール送信:",[40,1780,1697],{"class":1676},[40,1782,1783],{"class":42,"line":453},[40,1784,290],{"emptyLinePlaceholder":289},[40,1786,1787,1790],{"class":42,"line":471},[40,1788,1789],{"class":177},"```",[40,1791,1792],{"class":1709},"bash\n",[40,1794,1795,1798,1801,1804,1807],{"class":42,"line":488},[40,1796,1797],{"class":232},"curl",[40,1799,1800],{"class":1648}," -X",[40,1802,1803],{"class":181}," POST",[40,1805,1806],{"class":181}," http://localhost:3000/api/send-stock-summary",[40,1808,1809],{"class":1648}," \\\n",[40,1811,1812],{"class":42,"line":519},[40,1813,1814],{"class":1709},"  -H \"Content-Type: application/json\" \\\n",[40,1816,1817,1820,1822],{"class":42,"line":536},[40,1818,1819],{"class":1648},"  -d",[40,1821,278],{"class":277},[40,1823,1824],{"class":181},"{\n",[40,1826,1827],{"class":42,"line":542},[40,1828,1829],{"class":181},"    \"date\": \"YYYY-MM-DD\",\n",[40,1831,1832],{"class":42,"line":547},[40,1833,1834],{"class":181},"    \"htmlContent\": \"\u003Chtml>...\u003C/html>\"\n",[40,1836,1837,1839],{"class":42,"line":562},[40,1838,680],{"class":181},[40,1840,284],{"class":277},[121,1842,1843],{"start":374},[90,1844,1845],{},[93,1846,1847],{},"メール送信の成功/失敗を確認して報告",[31,1849,1854],{"className":1850,"code":1852,"language":1853},[1851],"language-text","\n## 🧪 テスト手順\n\n### 1. 開発サーバーの起動\n\n```bash\ncd apps/web\npnpm dev\n","text",[17,1855,1852],{"__ignoreMap":36},[27,1857,1859],{"id":1858},"_2-手動テストcurlで確認","2. 手動テスト（cURLで確認）",[31,1861,1863],{"className":158,"code":1862,"language":160,"meta":36,"style":36},"curl -X POST http://localhost:3000/api/send-stock-summary \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"date\": \"2025-11-14\",\n    \"htmlContent\": \"\u003Ch1>テストメール\u003C/h1>\u003Cp>これはテストです\u003C/p>\"\n  }'\n",[17,1864,1865,1877,1893,1901,1906,1911],{"__ignoreMap":36},[40,1866,1867,1869,1871,1873,1875],{"class":42,"line":43},[40,1868,1797],{"class":232},[40,1870,1800],{"class":1648},[40,1872,1803],{"class":181},[40,1874,1806],{"class":181},[40,1876,1809],{"class":1648},[40,1878,1879,1882,1885,1888,1891],{"class":42,"line":49},[40,1880,1881],{"class":1648},"  -H",[40,1883,1884],{"class":277}," \"",[40,1886,1887],{"class":181},"Content-Type: application/json",[40,1889,1890],{"class":277},"\"",[40,1892,1809],{"class":1648},[40,1894,1895,1897,1899],{"class":42,"line":55},[40,1896,1819],{"class":1648},[40,1898,278],{"class":277},[40,1900,1824],{"class":181},[40,1902,1903],{"class":42,"line":61},[40,1904,1905],{"class":181},"    \"date\": \"2025-11-14\",\n",[40,1907,1908],{"class":42,"line":67},[40,1909,1910],{"class":181},"    \"htmlContent\": \"\u003Ch1>テストメール\u003C/h1>\u003Cp>これはテストです\u003C/p>\"\n",[40,1912,1913,1915],{"class":42,"line":73},[40,1914,680],{"class":181},[40,1916,284],{"class":277},[27,1918,1920],{"id":1919},"_3-スラッシュコマンドでテスト","3. スラッシュコマンドでテスト",[31,1922,1924],{"className":158,"code":1923,"language":160,"meta":36,"style":36},"/stock-summary\n",[17,1925,1926],{"__ignoreMap":36},[40,1927,1928],{"class":42,"line":43},[40,1929,1923],{"class":232},[22,1931,1933],{"id":1932},"本番環境へのデプロイ","🚀 本番環境へのデプロイ",[27,1935,1937],{"id":1936},"cloudflare-pagesの環境変数設定","Cloudflare Pagesの環境変数設定",[121,1939,1940,1943,1953],{},[90,1941,1942],{},"Cloudflare Pagesダッシュボードにログイン",[90,1944,1945,1946,1949,1950],{},"プロジェクトを選択 → ",[93,1947,1948],{},"Settings"," → ",[93,1951,1952],{},"Environment variables",[90,1954,1955,1956],{},"以下の環境変数を追加：\n",[87,1957,1958,1963,1968],{},[90,1959,1960,1962],{},[17,1961,174],{},": Resend APIキー",[90,1964,1965,1967],{},[17,1966,197],{},": 送信元メールアドレス",[90,1969,1970,1972],{},[17,1971,187],{},": 送信先メールアドレス",[27,1974,1975],{"id":1975},"デプロイ",[31,1977,1979],{"className":158,"code":1978,"language":160,"meta":36,"style":36},"cd apps/web\npnpm build\npnpm exec wrangler pages deploy\n",[17,1980,1981,1987,1994],{"__ignoreMap":36},[40,1982,1983,1985],{"class":42,"line":43},[40,1984,224],{"class":223},[40,1986,227],{"class":181},[40,1988,1989,1991],{"class":42,"line":49},[40,1990,233],{"class":232},[40,1992,1993],{"class":181}," build\n",[40,1995,1996,1998,2001,2004,2007],{"class":42,"line":55},[40,1997,233],{"class":232},[40,1999,2000],{"class":181}," exec",[40,2002,2003],{"class":181}," wrangler",[40,2005,2006],{"class":181}," pages",[40,2008,2009],{"class":181}," deploy\n",[22,2011,2013],{"id":2012},"メール送信のカスタマイズ","📊 メール送信のカスタマイズ",[27,2015,2016],{"id":2016},"送信先を複数にする",[13,2018,2019,2021],{},[17,2020,248],{}," を修正：",[31,2023,2025],{"className":252,"code":2024,"language":254,"meta":36,"style":36},"to: [\n  config.stockSummaryEmailTo,\n  'additional-email@example.com'\n],\n",[17,2026,2027,2038,2049,2059],{"__ignoreMap":36},[40,2028,2029,2032,2035],{"class":42,"line":43},[40,2030,2031],{"class":232},"to",[40,2033,2034],{"class":177},":",[40,2036,2037],{"class":177}," [\n",[40,2039,2040,2043,2045,2047],{"class":42,"line":49},[40,2041,2042],{"class":173},"  config",[40,2044,392],{"class":177},[40,2046,483],{"class":173},[40,2048,468],{"class":177},[40,2050,2051,2054,2057],{"class":42,"line":55},[40,2052,2053],{"class":277},"  '",[40,2055,2056],{"class":181},"additional-email@example.com",[40,2058,284],{"class":277},[40,2060,2061],{"class":42,"line":61},[40,2062,2063],{"class":177},"],\n",[27,2065,2066],{"id":2066},"件名をカスタマイズ",[31,2068,2070],{"className":252,"code":2069,"language":254,"meta":36,"style":36},"subject: `📊 ${body.marketStatus} 米国株式市場サマリー - ${body.date}`,\n",[17,2071,2072],{"__ignoreMap":36},[40,2073,2074,2077,2079,2082,2085,2087,2089,2091,2094,2096,2099,2101,2103,2105,2107,2109,2111],{"class":42,"line":43},[40,2075,2076],{"class":232},"subject",[40,2078,2034],{"class":177},[40,2080,2081],{"class":277}," `",[40,2083,2084],{"class":181},"📊 ",[40,2086,502],{"class":261},[40,2088,347],{"class":181},[40,2090,392],{"class":177},[40,2092,2093],{"class":181},"marketStatus",[40,2095,512],{"class":261},[40,2097,2098],{"class":181}," 米国株式市場サマリー - ",[40,2100,502],{"class":261},[40,2102,347],{"class":181},[40,2104,392],{"class":177},[40,2106,509],{"class":181},[40,2108,512],{"class":261},[40,2110,496],{"class":277},[40,2112,468],{"class":177},[27,2114,2115],{"id":2115},"添付ファイルを追加",[31,2117,2119],{"className":252,"code":2118,"language":254,"meta":36,"style":36},"await resend.emails.send({\n  // ... 既存の設定\n  attachments: [\n    {\n      filename: `stock-summary-${body.date}.pdf`,\n      content: body.pdfContent, // Base64エンコードされたPDF\n    }\n  ],\n})\n",[17,2120,2121,2138,2143,2151,2156,2185,2204,2208,2213],{"__ignoreMap":36},[40,2122,2123,2126,2128,2130,2132,2134,2136],{"class":42,"line":43},[40,2124,2125],{"class":261},"await",[40,2127,437],{"class":173},[40,2129,392],{"class":177},[40,2131,442],{"class":173},[40,2133,392],{"class":177},[40,2135,447],{"class":232},[40,2137,450],{"class":177},[40,2139,2140],{"class":42,"line":49},[40,2141,2142],{"class":167},"  // ... 既存の設定\n",[40,2144,2145,2148],{"class":42,"line":55},[40,2146,2147],{"class":223},"  attachments",[40,2149,2150],{"class":177},": [\n",[40,2152,2153],{"class":42,"line":61},[40,2154,2155],{"class":177},"    {\n",[40,2157,2158,2161,2163,2165,2168,2170,2172,2174,2176,2178,2181,2183],{"class":42,"line":67},[40,2159,2160],{"class":223},"      filename",[40,2162,96],{"class":177},[40,2164,496],{"class":277},[40,2166,2167],{"class":181},"stock-summary-",[40,2169,502],{"class":261},[40,2171,347],{"class":181},[40,2173,392],{"class":177},[40,2175,509],{"class":181},[40,2177,512],{"class":261},[40,2179,2180],{"class":181},".pdf",[40,2182,496],{"class":277},[40,2184,468],{"class":177},[40,2186,2187,2190,2192,2194,2196,2199,2201],{"class":42,"line":73},[40,2188,2189],{"class":223},"      content",[40,2191,96],{"class":177},[40,2193,347],{"class":173},[40,2195,392],{"class":177},[40,2197,2198],{"class":173},"pdfContent",[40,2200,1039],{"class":177},[40,2202,2203],{"class":167},"// Base64エンコードされたPDF\n",[40,2205,2206],{"class":42,"line":79},[40,2207,624],{"class":177},[40,2209,2210],{"class":42,"line":374},[40,2211,2212],{"class":177},"  ],\n",[40,2214,2215],{"class":42,"line":400},[40,2216,775],{"class":177},[22,2218,2220],{"id":2219},"トラブルシューティング","🔍 トラブルシューティング",[27,2222,2223],{"id":2223},"メールが届かない",[121,2225,2226,2237,2243,2249],{},[90,2227,2228,96,2231,2233,2234,2236],{},[93,2229,2230],{},"APIキーの確認",[17,2232,154],{}," ファイルの ",[17,2235,174],{}," が正しいか",[90,2238,2239,2242],{},[93,2240,2241],{},"ドメイン認証",": Resendでドメイン認証が完了しているか",[90,2244,2245,2248],{},[93,2246,2247],{},"送信制限",": Resendの無料プランは月100通まで",[90,2250,2251,2254],{},[93,2252,2253],{},"スパムフォルダ",": 迷惑メールフォルダをチェック",[27,2256,2258],{"id":2257},"エラー-domain-not-verified","エラー: \"Domain not verified\"",[13,2260,2261],{},"Resendでドメイン認証を行う必要があります：",[121,2263,2264,2273,2276],{},[90,2265,2266,2267,1949,2270],{},"Resend → ",[93,2268,2269],{},"Domains",[93,2271,2272],{},"Add Domain",[90,2274,2275],{},"DNSレコード（TXT, MX, CNAME）を設定",[90,2277,2278],{},"認証完了まで待機（最大48時間）",[27,2280,2281],{"id":2281},"開発環境でのテスト送信",[13,2283,2284,2287],{},[17,2285,2286],{},".env.local"," で異なるメールアドレスを設定：",[31,2289,2291],{"className":158,"code":2290,"language":160,"meta":36,"style":36},"STOCK_SUMMARY_EMAIL_TO=test@example.com\n",[17,2292,2293],{"__ignoreMap":36},[40,2294,2295,2297,2299],{"class":42,"line":43},[40,2296,187],{"class":173},[40,2298,178],{"class":177},[40,2300,2301],{"class":181},"test@example.com\n",[22,2303,2305],{"id":2304},"参考リンク","📚 参考リンク",[87,2307,2308,2315,2322,2329],{},[90,2309,2310],{},[126,2311,2314],{"href":2312,"rel":2313},"https://resend.com/docs",[130],"Resend Documentation",[90,2316,2317],{},[126,2318,2321],{"href":2319,"rel":2320},"https://nuxt.com/docs/guide/directory-structure/server",[130],"Nuxt Server API Routes",[90,2323,2324],{},[126,2325,2328],{"href":2326,"rel":2327},"https://marked.js.org/",[130],"Marked.js Documentation",[90,2330,2331],{},[126,2332,2335],{"href":2333,"rel":2334},"https://github.com/cure53/DOMPurify",[130],"DOMPurify",[22,2337,2339],{"id":2338},"レポートフォーマット仕様","📋 レポートフォーマット仕様",[27,2341,2342],{"id":2342},"レイアウト構成",[121,2344,2345,2351,2357,2363,2369],{},[90,2346,2347,2350],{},[93,2348,2349],{},"保有銘柄パフォーマンス一覧"," - テーブル形式で3銘柄を比較",[90,2352,2353,2356],{},[93,2354,2355],{},"市場全体の動向"," - 主要指数、セクター別、市場心理指標",[90,2358,2359,2362],{},[93,2360,2361],{},"保有銘柄の動向（詳細）"," - 各銘柄の詳細分析",[90,2364,2365,2368],{},[93,2366,2367],{},"マクロ経済ニュース"," - 重要度付きトピック一覧",[90,2370,2371,2374],{},[93,2372,2373],{},"まとめ"," - 影響分析と今後の注目ポイント",[27,2376,2377],{"id":2377},"主要ニュースの重要度マーク",[13,2379,2380],{},"各銘柄の主要ニュースには重要度マークを付与：",[87,2382,2383,2390,2397],{},[90,2384,2385,2386,2389],{},"⭐⭐⭐ ",[93,2387,2388],{},"最重要","（決算、大型契約、重大な業績変化、大型インサイダー取引）",[90,2391,2392,2393,2396],{},"⭐⭐ ",[93,2394,2395],{},"重要","（アナリストレーティング変更、規制関連）",[90,2398,2399,2400,2403],{},"⭐ ",[93,2401,2402],{},"参考情報","（一般的なニュース）",[13,2405,2406],{},"どうでもいい情報は含めないこと。",[27,2408,2409],{"id":2409},"市場心理指標",[13,2411,2412],{},"CNN Fear & Greed指数は数値（0-100）も含めて表記：",[87,2414,2415,2418,2421,2424,2427],{},[90,2416,2417],{},"0-25: 極度の恐怖",[90,2419,2420],{},"26-45: 恐怖",[90,2422,2423],{},"46-55: 中立",[90,2425,2426],{},"56-75: 強欲",[90,2428,2429],{},"76-100: 極度の強欲",[13,2431,2432,2433],{},"例: ",[17,2434,2435],{},"CNN Fear & Greed | **22 (極度の恐怖)** | 悪化 | 投資家心理の著しい悪化",[22,2437,2439],{"id":2438},"今後の拡張アイデア","🎯 今後の拡張アイデア",[87,2441,2444,2453,2459,2465,2471,2477,2483,2489],{"className":2442},[2443],"contains-task-list",[90,2445,2448,2452],{"className":2446},[2447],"task-list-item",[2449,2450],"input",{"disabled":289,"type":2451},"checkbox"," メール送信履歴の保存（D1データベース）",[90,2454,2456,2458],{"className":2455},[2447],[2449,2457],{"disabled":289,"type":2451}," 送信スケジュールの設定（Cloudflare Cron Triggers）",[90,2460,2462,2464],{"className":2461},[2447],[2449,2463],{"disabled":289,"type":2451}," PDF添付ファイル生成",[90,2466,2468,2470],{"className":2467},[2447],[2449,2469],{"disabled":289,"type":2451}," メールテンプレートのカスタマイズ機能",[90,2472,2474,2476],{"className":2473},[2447],[2449,2475],{"disabled":289,"type":2451}," 複数の送信先グループ管理",[90,2478,2480,2482],{"className":2479},[2447],[2449,2481],{"disabled":289,"type":2451}," Slack/Discord通知の統合",[90,2484,2486,2488],{"className":2485},[2447],[2449,2487],{"disabled":289,"type":2451}," チャート画像の生成と埋め込み",[90,2490,2492,2494],{"className":2491},[2447],[2449,2493],{"disabled":289,"type":2451}," 週次・月次サマリーの自動生成",[2496,2497,2498],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}html pre.shiki code .sSkh3, html code.shiki .sSkh3{--shiki-default:#2E8F82;--shiki-dark:#2E8F82}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sFA8A, html code.shiki .sFA8A{--shiki-default:#999999;--shiki-default-font-weight:bold;--shiki-dark:#999999;--shiki-dark-font-weight:bold}html pre.shiki code .syTZV, html code.shiki .syTZV{--shiki-default:#1C6B48;--shiki-default-font-weight:bold;--shiki-dark:#1C6B48;--shiki-dark-font-weight:bold}html pre.shiki code .s9pho, html code.shiki .s9pho{--shiki-default:#393A34;--shiki-default-font-weight:bold;--shiki-dark:#393A34;--shiki-dark-font-weight:bold}html pre.shiki code .sG7-3, html code.shiki .sG7-3{--shiki-default:#393A34;--shiki-dark:#393A34}",{"title":36,"searchDepth":49,"depth":49,"links":2500},[2501,2505,2514,2519,2523,2528,2533,2534,2539],{"id":24,"depth":49,"text":25,"children":2502},[2503,2504],{"id":29,"depth":55,"text":29},{"id":85,"depth":55,"text":85},{"id":114,"depth":49,"text":115,"children":2506},[2507,2508,2509,2510,2511,2512,2513],{"id":118,"depth":55,"text":119},{"id":148,"depth":55,"text":149},{"id":212,"depth":55,"text":213},{"id":242,"depth":55,"text":243},{"id":778,"depth":55,"text":779},{"id":895,"depth":55,"text":896},{"id":1616,"depth":55,"text":1617},{"id":1655,"depth":49,"text":1656,"children":2515},[2516,2517,2518],{"id":1665,"depth":55,"text":1665},{"id":1858,"depth":55,"text":1859},{"id":1919,"depth":55,"text":1920},{"id":1932,"depth":49,"text":1933,"children":2520},[2521,2522],{"id":1936,"depth":55,"text":1937},{"id":1975,"depth":55,"text":1975},{"id":2012,"depth":49,"text":2013,"children":2524},[2525,2526,2527],{"id":2016,"depth":55,"text":2016},{"id":2066,"depth":55,"text":2066},{"id":2115,"depth":55,"text":2115},{"id":2219,"depth":49,"text":2220,"children":2529},[2530,2531,2532],{"id":2223,"depth":55,"text":2223},{"id":2257,"depth":55,"text":2258},{"id":2281,"depth":55,"text":2281},{"id":2304,"depth":49,"text":2305},{"id":2338,"depth":49,"text":2339,"children":2535},[2536,2537,2538],{"id":2342,"depth":55,"text":2342},{"id":2377,"depth":55,"text":2377},{"id":2409,"depth":55,"text":2409},{"id":2438,"depth":49,"text":2439},null,"/stock-summaryスラッシュコマンドにメール送信機能を統合する手順","md",{},"/stock-summary-email-setup",false,"2025-11-14T00:00:00.000Z",{"title":5,"description":2541},"2025-11/2025-11-14/stock-summary-email-setup",[2550,2551,2552,281,2553],"setup","email","stock-summary","api","B1GWBh-kZb-3J777wj91g5_9GfAWdQN9Mb8vxyTg4Hw",[],[2557,2561,2565,2568,2572],{"title":2558,"path":2559,"publishedAt":2560},"Claude Code ステータスラインにFable 5のモデル別リミット表示を追加した","/claude-code-statusline-fable5-model-limit","2026-07-20T00:00:00.000Z",{"title":2562,"path":2563,"publishedAt":2564},"freee公式MCPサーバーのコードを開く。「APIをラップする」の実体は、宣言ではなく門番と配管だった","/freee-mcp-anatomy","2026-07-14T00:00:00.000Z",{"title":2566,"path":2567,"publishedAt":2564},"MCPはAPIを「エージェントが読める形」に包む規格。アプリ間接続の4つの疑問を深掘りする","/mcp-agent-app-connection",{"title":2569,"path":2570,"publishedAt":2571},"X API/MCPの料金プラン確認とxurl投稿テスト（401で頓挫）","/x-api-pricing-and-mcp-check","2026-06-30T00:00:00.000Z",{"title":2573,"path":2574,"publishedAt":2575},"認証不要の公共交通 API、api.transit.ls8h.com の正体を読む","/transit-ls8h-api-public","2026-06-26T00:00:00.000Z","https://log.eurekapu.com/og/blog/stock-summary-email-setup.png?v=2025-11-14T00%3A00%3A00.000Z&title=%E6%A0%AA%E5%BC%8F%E5%B8%82%E5%A0%B4%E3%82%B5%E3%83%9E%E3%83%AA%E3%83%BC%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1%E8%A8%AD%E5%AE%9A%E3%82%AC%E3%82%A4%E3%83%89&author=Kei%20Komatsu&sig=58632de9b0b994d9",1785654660300]