NodeJS 對接 Outlook 發信服務器實現發信功能

示例代碼:

const express = require('express');
const nodemailer = require('nodemailer');
const querystring = require('querystring');
const axios = require('axios');const app = express();
app.use(express.json());const transporter = nodemailer.createTransport({service: 'Outlook365', // 也可以用 'hotmail'auth: {type: 'OAuth2',user: 'sdkflja_ggg@outlook.com',clientId: '21f97687-903e-4806-903f-7c3162f73cea',clientSecret: 'Brp8Q~qBdngo.SLNfJbc83YgtPqnKnrgHuBq.c8f',refreshToken: 'M.C543_BL2.0.U.-CkdUriBwl1MEcv2WRP5ZLo2tVbmA0Lhgzn18IVcqhM8ZBrzEDTHng8FhWoByDcQpYyskZVKdRFjAzqAx5qjjx5NKpsahbm5P12VD9cPcX2f30ckbxTXeCmbcngguSbxx6SX7uumH2iPWZxS0HVsLXMhnxgnkNEW8dixb90jgc7uHQC!*lV1y8QjZbQNxzBucCSTDOIFuNIjM7k6UYC2lgjZPjvaQl66S1xXJp2YRoJ6w4KPwQ0zlOOUMLS7jpwLYEyUOHnzYPY5bCpk2bBhoE0xE6c0k*THxGsfN5xF2xJXyEVIJNUn!JRcsnpsQcPB1N1ggVpkf8fWVzeMgUECC7So!UKhLJbVZBNQldjUwoTH*yDMuGvo8SnIdmMELE1Wmlpb0JlSlTpgvTV*v*YTyesA$',accessToken: 'EwAIBOl3BAAUcDnR9grBJokeAHaUV8R3+rVHX+IAAf5LCOGj2z3+BP5D2doOw+E2jHHTT6tpaipG3TaJWxypwgJM68oAQ+t2441dbub+DUmJYTjRCAFSrxDSlVyapKUNRcknLCZEvfJ4dVCTK9IEksaY5MFq/3YlEU4FyJivTh8aLiUXKppmRQLPBPVhQF9ypsbwcWCLrcHLvaT0WJM2JW5Uq0nWA/KVwzcZSKymn8qNiiU1bt5KlkogbDNMzegjvTOPoKSCPok/R46IoJzBMoENRQlCt+W60HT94XF0hATWMl9kXUCqknuHORnZevGC1H4ECX9aTPS3qsmS182ZaigRx6rntfMrh1BaY2x5OlSbW/VUyfKlxvInCMBjMmEQZgAAEJKxntheAOYGkeSTC51dDVDQArKGCk757MKV9hFX8z0Sw8A6IQmh/Zxghe2PNL+q2JiX7wup/U1NvjoRaRESIlpToB8x+GZ+zzW4KNj7mUFM96Rb4ae1Vh19tqjLr0SP3kIv3g6+ybpoj7Xv2vEOav2xA7pPGshkGH7dYapBOYSee5tjV2ZZqIwt5HLz/nPuOpkkaoqx5jRmVK0F5q+Hcd8J7RmQwJKp77ff6dYRo+JZ0zlfPr9pNiYkQ4Q+eH/8ddm8DtGnOI2uWUN1JLEIGJvJ7J3S6d+et7QUPgMIuvXlzJS7G0wZ0xNLMFE9lKl4ugSQH0zCuspFA4tirivbYc74FP+VsI9Y4ZWMb22txcq44C2++O9bxrWXPiAZ0iC4fPtqTyGXAqeQkW/kDjEc+insAF8p/MLfH+JnhH1dhPijRXCI3bD3Mj9w4yySwBAvPeqEv3CYX/FsXQoSZbbUaVv1+0RRgHUWGPsCurBAjo+TK2a936CLe7KfXm0TbflLLPbrbCOJABDJ2JGQ3LiurJ8HpPlL1Xz7xtUOlvLooh4VINAGlGq7Kp1Dkj26ZN4ZGcjisWIHTTfVcon1VzCSn5e5xnqplWyexYlQwjwu/taXYdbzG4CZV8ENI8ppEN6rqIhmAfob+dwr7wvitDx9T/AzPtXEw6z5wFSUUnexedb0uB9sQEOll9KBPbyi6z0vv1lIpHJ+CM9cUTJe45zPcarhvGwktmwJjtUq893VxmXah/UFCWMFm7xxet7dUSLMOVsS3byjq0Aru212Q9DaWccH1iKeeUrGgBiIB+TeqydwOOSbZYBAT+5KFPYZBdttEaIsFd5QfahEU8HFeiqRgwZI4tNnmYK2DpoxCZnQJtE0oEJvCyAqOIaOF2a8HP/iYzPc/JV6RHhZCnW12JvLwojAxcCq0rul3OV+q8JJBQrlQcdh/9+R+ZZjke7bYjUnQvG3FnlJl/jMoJvkfEALvr70GQID'},host: 'smtp.office365.com',port: 587,secure: false,
});// OAuth2 授權參數
const oauth2Config = {clientId: '21f97687-903e-4806-903f-7c3162f73cea',redirectUri: 'http://localhost:3000/oauth2/callback',scope: 'https://outlook.office.com/SMTP.Send offline_access',authUrl: 'https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize',tokenUrl: 'https://login.microsoftonline.com/consumers/oauth2/v2.0/token'
};// 獲取授權鏈接
app.get('/oauth2/authorize', (req, res) => {const params = querystring.stringify({client_id: oauth2Config.clientId,response_type: 'code',redirect_uri: oauth2Config.redirectUri,response_mode: 'query',scope: oauth2Config.scope,state: '12345' // 可自定義});const url = `${oauth2Config.authUrl}?${params}`;res.json({ url });
});// 處理授權回調,獲取refresh_token
app.get('/oauth2/callback', async (req, res) => {const code = req.query.code;if (!code) return res.status(400).send('缺少code參數');try {const params = new URLSearchParams({client_id: oauth2Config.clientId,scope: oauth2Config.scope,code,redirect_uri: oauth2Config.redirectUri,grant_type: 'authorization_code',client_secret: 'Brp8Q~qBdngo.SLNfJbc83YgtPqnKnrgHuBq.c8f'});const tokenRes = await axios.post(oauth2Config.tokenUrl, params, {headers: { 'Content-Type': 'application/x-www-form-urlencoded' }});res.json({ refresh_token: tokenRes.data.refresh_token, access_token: tokenRes.data.access_token });} catch (err) {res.status(500).json({ error: err.message, detail: err.response?.data });}
});app.get('/send', async (req, res) => {const { to, subject, text } = req.query;try {let info = await transporter.sendMail({from: '"TaxPlus" <sdkflja_ggg@outlook.com>',to,subject,text});res.json({ success: true, messageId: info.messageId });} catch (err) {res.status(500).json({ success: false, error: err.message  });}
});app.listen(3000, () => {console.log('郵件服務器已啟動,端口3000');
});

流程:

第一步、 用 node 執行這個 js 文件
訪問 http://localhost:3000/oauth2/authorize? ?獲取授權鏈接

?

?復制鏈接到瀏覽器登錄賬號進行授權,等待回調:

拿到?refresh_token 和?access_token 后,復制粘貼至圖中此處:

第二步:

?訪問 http://localhost:3000/send?to=to@example.com&subject=666&text=666? 發送郵件

返回? messageId? 就是成功了

主要是? OAuth2? 的驗證比較麻煩?

Outlook郵箱開通發信服務及OAuth2驗證開通參考下面這個帖子:

Outlook郵箱開通發信服務及OAuth2驗證開通-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84491.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84491.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84491.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【同聲傳譯】RealtimeSTT:超低延遲語音轉文字,支持喚醒詞與中譯英

把你說的話實時變成文字&#xff1a;RealtimeSTT 上手體驗 想找一個真正好用的語音轉文字工具嗎&#xff1f;不用等說完一整段才出結果&#xff0c;也不用反復點擊按鈕。RealtimeSTT 這個開源項目能做到??實時??轉錄&#xff0c;你說一句&#xff0c;屏幕上幾乎同時出現文…

【大模型lora微調】關于推理時如何使用 LoRA Adapter

假設你有兩部分&#xff1a; 一個是原始大模型&#xff08;base model&#xff09; 一個是保存的 LoRA Adapter&#xff08;adapter_config.json adapter_model.bin&#xff09; 不合并的情況下推理方法 你可以用 peft 的方式加載 LoRA Adapter&#xff0c;推理時這樣寫&a…

谷歌時間序列算法:零樣本預測如何重塑行業決策?

谷歌時間序列算法&#xff1a;零樣本預測如何重塑行業決策&#xff1f; TimesFM 你是否曾面臨這樣的困境&#xff1f;—— ? 需要預測新產品銷量&#xff0c;卻苦于缺乏歷史數據&#xff1b; ? 依賴傳統模型&#xff08;如ARIMA&#xff09;&#xff0c;但調參耗時且泛化能力…

國產服務器【銀河麒麟v10】【CPU鯤鵬920】部署Minio文件服務器

目錄 準備工作操作步驟1. 確認掛載點狀態2. 創建專用用戶和目錄3. 下載ARM版Minio到掛在盤4. 環境變量配置5. 更新Systemd服務配置6. 啟動、重啟7. 防火墻8. 訪問驗證9. 故障排查&#xff08;如服務未啟動&#xff09;? 結束 準備工作 環境要求&#xff1a;Linux虛擬機 操作…

解決: React Native android webview 空白頁

Android react-native-webview 之前是正常的, 升級了 react-native / react-native-webview 等 之后, 就變成了空白頁. 通過下面的修改, 可以修復, 回到正常的狀態. 來源: https://github.com/react-native-webview/react-native-webview/issues/3697 注意 ts 文件一定要改,…

高中編程教學中教師專業發展的困境與突破:基于實踐與理論的雙重審視

一、引言 1.1 研究背景 在數字化時代&#xff0c;編程已成為一項基本技能&#xff0c;其重要性日益凸顯。編程不僅是計算機科學領域的核心能力&#xff0c;更是培養學生邏輯思維、創新能力和問題解決能力的有效途徑。高中階段作為學生成長和發展的關鍵時期&#xff0c;開展編…

最小化聯邦平均(FedAvg)的算法開銷

一、通信開銷最小化 FedAvg中服務器與客戶端間的頻繁參數傳輸是主要瓶頸&#xff0c;可通過以下方法優化&#xff1a; 1. 模型壓縮技術 稀疏化&#xff1a;僅上傳重要參數更新&#xff08;如Top-k梯度&#xff09; 實現&#xff1a;客戶端本地訓練后&#xff0c;保留絕對值最…

準備開始適配高德Flutter的鴻蒙版了

我們的Flutter項目在編譯為鴻蒙的過程中&#xff0c; 遇到了各種插件不支持的問題。 大部分都能解決&#xff0c;或者用別的方式代替。 這個高德我真的是無語&#xff0c; 我們只能用高德 &#xff0c; 目前還沒看到網上有人適配了鴻蒙。 那就我來干吧&#xff0c; 第一…

webpack到vite的改造之路

前言 隨著前端項目的持續迭代與功能擴展&#xff0c;當前基于 Webpack 構建的項目在啟動速度、構建速度和首屏加載性能方面逐漸暴露出一些瓶頸。 一方面&#xff0c;Webpack 的打包機制導致本地開發環境的啟動時間顯著增加&#xff0c;嚴重影響了開發效率&#xff1b;另一方面…

【重構】如果發現提取的方法不再通用,如何重構

前言 所謂重構&#xff08;refactoring&#xff09;&#xff1a; 在不改變代碼外在行為的前提下&#xff0c;對代碼做出修改&#xff0c;以改進程序的內部結構。 – Martin Fowler背景 最近在做需求&#xff0c;需要對方法加權限控制&#xff0c;發現舊方法不再適用&#xff0…

REST接口/RPC

REST接口(RESTful API)是一種基于HTTP協議的API設計風格,遵循REST(Representational State Transfer表述性狀態轉移)架構原則,用于在不同系統之間進行數據交互。它具有簡潔、靈活、無狀態等特點,廣泛應用于Web服務和移動應用開發中。 核心概念 資源導向 將數據或服務抽…

JS入門——事件與事件綁定

JS入門——事件與事件綁定 一、事件的分類 二、事件的綁定方式 實現代碼&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>JS事件綁定</title></head><body><!-- 修復后的按鈕1 -->&…

pyspark 處理字符串函數

pyspark 要處理數據&#xff0c;沒有&#xff0c;那就偽造數據 faker 真是個好東西 from faker import Faker import pandas as pd gender ["None","Man","Woman"]fake Faker() names [(fake.first_name(),fake.last_name(),fake.date_of_bi…

五大經典語音芯片型號及應用場景

在語音芯片領域&#xff0c;這五大語音芯片憑借豐富多樣的產品和卓越的性能&#xff0c;占據了重要地位。以下為您詳細介紹其五款經典語音芯片型號及其對應的應用場景。? WTN6170-8S? WTN6170-8S 屬于 OTP 一次性語音芯片。它采用 OTP 工藝&#xff0c;成本能夠控制在 1 元以…

機器學習管道:構建高效可靠的AI工作流

在當今數據驅動的世界中&#xff0c;機器學習(ML)已成為推動創新和決策的核心技術。然而&#xff0c;將ML模型從實驗環境成功部署到生產環境并非易事。機器學習管道(ML Pipelines)作為一種系統化的解決方案&#xff0c;通過自動化工作流程&#xff0c;顯著提高了ML項目的可重復…

瀏覽器調試核心技術指南:從基礎到高級的完全掌握

引言?? 在現代前端開發中,瀏覽器調試工具已成為開發者最強大的技術伙伴。根據State of JS 2023的統計數據,??92.7%的專業開發者??每天使用瀏覽器DevTools進行問題診斷和性能優化。然而,多數初級開發者僅能使用不到35%的調試功能。本文將系統解析Chrome/Firefox瀏覽器…

OpenCV 圖像翻轉

一、知識點 1、void flip(InputArray src, OutputArray dst, int flipCode); (1)、圍繞x軸、y軸或兩者同時翻轉圖像。 (2)、參數說明: src: 輸入圖像。 dst: 輸出圖像&#xff0c;大小與類型和src相同。 flipCode: 翻轉標志。 0表示繞x軸翻轉(上下翻轉);…

【動手學深度學習】4.2~4.3 多層感知機的實現

目錄 4.2. 多層感知機的從零開始實現1&#xff09;初始化模型參數2&#xff09;激活函數3&#xff09;模型4&#xff09;損失函數5&#xff09;訓練 4.3. 多層感知機的簡潔實現1&#xff09;模型2&#xff09;小結 . 4.2. 多層感知機的從零開始實現 現在讓我們實現一個多層感…

54-Oracle 23 ai DBMS_HCHECK新改變-從前的hcheck.sql

Oracle Hcheck&#xff08;Health Check&#xff09;是Oracle數據庫內置的健康監測工具&#xff0c;自動化檢查數據庫的核心問題&#xff0c;包括數據字典一致性、性能瓶頸、空間使用及安全隱患。本質是數據字典的CT掃描儀&#xff0c;其核心價值在于將“字典邏輯錯誤”這類灰色…

AI 產品的“嵌點”(Embedded Touchpoints)

核心主題&#xff1a; AI 產品的成功不在于功能的強大與獨立&#xff0c;而在于其能否作為“嵌點”&#xff08;Embedded Touchpoints&#xff09;無縫融入用戶現有的行為流&#xff08;Flow&#xff09;&#xff0c;消除微小摩擦&#xff0c;在用戶真正需要的時機和場景中“無…