Node.jsはSTMPプロトコルとEWSプロトコルに基づいてメールを送信します

Node.jsはSTMPプロトコルとEWSプロトコルに基づいてメールを送信します

この記事では、主に、node.js を使用してSTMPプロトコルとMS Exchange Web Service(EWS)プロトコルに基づいて電子メールを送信する方法について説明します。この記事のすべての参照コードは TypeScript でコーディングされています。

1 STMP プロトコルに基づいてメールを送信する Node.js メソッド

node.js を使用して電子メールを送信する場合、基本的には有名なNodemailerモジュールが言及されます。これは現在、STMP を使用して電子メールを送信するための第一の選択肢です。
NodeMailerに基づいて STMP プロトコル メールを送信することに関する記事はインターネット上にたくさんあり、公式ドキュメントもかなり詳細です。ここでは比較と参照のためにサンプル コードのみをリストします。
sendMail電子メール送信メソッドをカプセル化します。

/**
 * Nodemailer を使用して STMP メールを送信します * @param {Object} opts 電子メール送信構成 * @param {Object} smtpCfg SMTP サーバー構成 */
非同期関数sendMail(opts, smtpCfg) {
 const resultInfo = { コード: 0、 メッセージ: ''、 結果: null };
 場合 (!smtpCfg) {
 resultInfo.msg = '電子メール送信情報が設定されていません';
 結果情報コード = -1009;
 結果情報を返します。
 }

 // メールオブジェクトを作成する const mailOpts = Object.assign(
 {
 // 送信者: `Notify <${smtpCfg.auth.user}>`、
 // 件名 subject: '通知',
 // テキスト: opts.content,
 //html: opts.content,
 // 添付ファイルの内容 // /*attachments: [{
 // ファイル名: 'data1.json',
 // パス: path.resolve(__dirname, 'data1.json')
 // }, {
 // ファイル名: 'pic01.jpg',
 // パス: path.resolve(__dirname, 'pic01.jpg')
 // }, {
 // ファイル名: 'test.txt',
 // パス: path.resolve(__dirname, 'test.txt')
 // }],*/
 },
 オプション
 );

 mailOpts.to の場合、mailOpts.to = [];
 Array.isArray(mailOpts.to) の場合、mailOpts.to は String(mailOpts.to).split(',');
 mailOpts.to = mailOpts.to.map(m => String(m).trim()).filter(m => m.includes('@'));

 if (!mailOpts.to.length) {
 resultInfo.msg = '電子メールの受信者が設定されていません';
 結果情報コード = -1010;
 結果情報を返します。
 }

 mailToList を mailOpts.to に設定します。
 const トランスポーター = nodemailer.createTransport(smtpCfg);

 // 個別に送信するリスト for (const to of mailToList) {
 mailOpts.to = to.trim();
 試す {
 const info = transporter.sendMail(mailOpts); を待機します。
 console.log('メールが送信されました:', mailOpts.to, ' response:', info.response);
 結果情報.msg = 情報.応答;
 } キャッチ(エラー){
 コンソール.log(エラー);
 結果情報コード = -1001;
 resultInfo.msg = エラー;
 }
 }

 結果情報を返します。
}

メールを送信するには、sendMail メソッドを使用します。

定数opts = {
 件名: 「テスト対象」
 /** HTML 形式のメールコンテンツ*/
 html: `テスト用のメール内容: <a href="https://lzw.me" rel="external nofollow" rel="external nofollow" >https://lzw.me</a>`,
 /** TEXT テキスト形式の電子メールの内容*/
 文章: ''、
 宛先: '[email protected]',
 //添付ファイルリスト//添付ファイル: [],
};
定数smtpConfig = {
 ホスト: 'smtp.qq.com'、//QQ: smtp.qq.com; NetEase: smtp.163.com
 port: 465, //ポート番号。 QQメールボックス465、NetEaseメールボックス25
 セキュア: true、
 認証:
 ユーザー: '[email protected]', //メールアカウントパス: '', //メール認証コード},
};
sendMail(opts, smtpConfig) を実行して、console.log(result) を実行します。

2 MS Exchange メールサーバーに基づいてメールを送信する Node.js メソッド

Nodemailer は、Microsoft の Microsoft Exchange Server を使用して構築された電子メール サービスには無力です。 Exchange Web サービス (EWS) は、Exchange リソースにアクセスするためのインターフェイスを提供し、Microsoft の公式ドキュメントに詳細なインターフェイス定義ドキュメントがあります。 Exchange メール サービス用の一般的なサードパーティ ライブラリには、node-ews や ews-javascript-api などがあります。

2.1 node-ews を使用して MS Exchange メールを送信する

以下では、node-ews モジュールを例として、Exchange メール サービスを使用して電子メールを送信する方法を紹介します。

2.1.1 ノードEWSに基づいて電子メールを送信するメソッドをカプセル化する

sendMailByNodeEws メソッドをカプセル化します。

'node-ews' から EWS をインポートします。

エクスポートインターフェースIEwsSendOptions {
 認証:
 ユーザー: 文字列;
 合格?: 文字列;
 /** 暗号化されたパスワード キー (NTLMAuth.nt_password)。文字列の場合は、16進エンコードの結果になります*/
 nt_password?: 文字列 | バッファ;
 /** パスワード暗号化キー (NTLMAuth.lm_password)。文字列の場合は、16進エンコードの結果になります*/
 lm_password?: 文字列 | バッファ;
 };
 /** 交換アドレス*/
 ホスト?: 文字列;
 /** メールの件名 */
 件名?: 文字列;
 /** HTML 形式のメールコンテンツ*/
 html?: 文字列;
 /** TEXT テキスト形式のメール本文コンテンツ (html パラメータよりも優先度が低い) */
 テキスト?: 文字列;
 : 文字列;
}

/**
 * Exchange(EWS)を使用してメールを送信する*/
非同期関数 sendMailByNodeEws(オプション: IEwsSendOptions) をエクスポートします。
 const resultInfo = { コード: 0、 メッセージ: ''、 結果: null };

 if (!オプション) {
 結果情報コード = -1001;
 resultInfo.msg = 'オプションは null にできません';
 } それ以外の場合は (!options.auth) {
 結果情報コード = -1002;
 resultInfo.msg = 'Options.auth{user,pass} は null にできません';
 } そうでない場合 (!options.auth.user || (!options.auth.pass && !options.auth.lm_password)) {
 結果情報コード = -1003;
 resultInfo.msg = 'Options.auth.user または Options.auth.password は null にできません';
 }

 if (resultInfo.code) は resultInfo を返します。

 定数ewsConfig = {
 ユーザー名: options.auth.user,
 パスワード: options.auth.pass,
 nt_password: オプション.auth.nt_password、
 lm_password: options.auth.lm_password、
 ホスト: options.host、
 // 認証: '基本',
 };

 if (ewsConfig.nt_password && typeof ewsConfig.nt_password === '文字列') {
 ewsConfig.nt_password = Buffer.from(ewsConfig.nt_password, 'hex');
 }

 if (ewsConfig.lm_password && typeof ewsConfig.lm_password === '文字列') {
 ewsConfig.lm_password = Buffer.from(ewsConfig.lm_password, 'hex');
 }

 Object.keys(ewsConfig).forEach(キー => {
 if (!ewsConfig[key]) ewsConfig[key]を削除します。
 });

 // ノード EWS を初期化する
 EWS を新規に作成します。
 //ews API関数を定義する
 const ewsFunction = 'CreateItem';
 // ews API 関数の引数を定義する
 定数ewsArgs = {
 属性:
  メッセージ処理: 'SendAndSaveCopy'、
 },
 保存されたアイテムフォルダー ID: {
  識別フォルダー ID: {
  属性:
   ID: 'sentiment',
  },
  },
 },
 アイテム: {
  メッセージ: {
  アイテムクラス: 'IPM.Note'、
  件名: options.subject,
  体: {
   属性:
   本文タイプ: options.html ? 'HTML' : 'テキスト',
   },
   $value: options.html || options.text,
  },
  受信者: {
   メールボックス:
   メールアドレス: options.to,
   },
  },
  IsRead: 'false'、
  },
 },
 };

 試す {
 const 結果 = ews.run(ewsFunction, ewsArgs); を待機します。
 // console.log('メールが送信されました:', options.to, ' response:', result);
 結果情報.result = 結果;
 結果が ResponseMessages.MessageText の場合、 resultInfo.msg は結果が ResponseMessages.MessageText になります。
 } キャッチ (エラー) {
 console.log(err.stack);
 結果情報コード = 1001;
 結果情報.msg = err.stack;
 }

 結果情報を返します。
}

メールを送信するには、sendMailByNodeEws メソッドを使用します。

送信メールByNodeEws({
 認証:
 ユーザー: '[email protected]',
 パス: '123456',
 /** 暗号化されたパスワード キー (NTLMAuth.nt_password)。文字列の場合は、16進エンコードの結果になります*/
 nt_パスワード: ''、
 /** パスワード暗号化キー (NTLMAuth.lm_password)。文字列の場合は、16進エンコードの結果になります*/
 lm_パスワード: ''、
 },
 /** 交換アドレス*/
 ホスト: 'https://ews.xxx.com',
 /** メールの件名 */
 件名: 「テスト対象」
 /** HTML 形式のメールコンテンツ*/
 html: `テスト用のメール内容: <a href="https://lzw.me" rel="external nofollow" rel="external nofollow" >https://lzw.me</a>`,
 /** TEXT テキスト形式のメール本文コンテンツ (html パラメータよりも優先度が低い) */
 文章: ''、
 宛先: '[email protected]',
})

2.1.2 NTLMAuthに基づく認証設定

pass パスワードを直接設定すると、プレーンテキスト パスワードが公開される可能性があります。pass フィールドを空白のままにして、nt_password フィールドと lm_password フィールドを設定し、NTLMAuth 認証モードを使用することができます。これら 2 つのフィールドは、パスのプレーン テキストに基づいて生成されます。Node.js 生成方法は、httpntlm モジュールの助けを借りて完了できます。具体的な参照は次のとおりです。

'httpntlm' から ntlm を NTLMAuth としてインポートします。

/** 入力された電子メール アカウントのパスワードを NTLMAuth キー (16 進数) 形式に変換して出力します */
定数 getHashedPwd = () => {
 const passwordPlainText = process.argv.slice(2)[0];

 if (!passwordPlainText) {
 console.log('USEAGE: \n\tnode get-hashed-pwd.js [パスワード]');
 戻る;
 }

 const nt_password = NTLMAuth.create_NT_hashed_pa​​ssword(passwordPlainText.trim());
 lm_password = NTLMAuth.create_LM_hashed_pa​​ssword(passwordPlainText.trim());

 // console.log('\n パスワード:', passwordPlainText);
 console.log(`nt_password:`, nt_password.toString('hex'));
 console.log(`lm_password:`, lm_password.toString('hex'));

 戻る {
 nt_パスワード、
 lm_パスワード、
 };
};

ハッシュされたパスワードを取得します。

2.2 ews-javascript-api を使用して MS Exchange メールを送信する

ews-javascript-api によるメール送信方法に基づいて、公式 wiki に関連例がありますが、サーバー認証を取得できなかったためにテスト プロセスに失敗し、具体的な理由を確認できなかったため、次のコードは参考用です。

/**
 * `ews-javascript-api` を使用して (MS Exchange) メールを送信します */
非同期関数 sendMailByEwsJApi(オプション: IEwsSendOptions) をエクスポートします。
 const resultInfo = { コード: 0、 メッセージ: ''、 結果: null };

 if (!オプション) {
 結果情報コード = -1001;
 resultInfo.msg = 'オプションは null にできません';
 } それ以外の場合は (!options.auth) {
 結果情報コード = -1002;
 resultInfo.msg = 'Options.auth{user,pass} は null にできません';
 } そうでない場合 (!options.auth.user || (!options.auth.pass && !options.auth.lm_password)) {
 結果情報コード = -1003;
 resultInfo.msg = 'Options.auth.user または Options.auth.password は null にできません';
 }

 ews は 'ews-javascript-api' を必要とします。
 ews.ExchangeService を新しい Exchange2010 に追加します。
 exch.Credentials = 新しい ews.WebCredentials(options.auth.user、options.auth.pass);
 exch.Url = 新しい ews.Uri(options.host);
 ews.EwsLogging.DebugLogEnabled = true; // デバッグをオフにするには false にします。

 const msgattach = new ews.EmailMessage(exch);
 msgattach.Subject = オプション.subject;
 msgattach.Body = 新しい ews.MessageBody(ews.BodyType.HTML、escape(options.html || options.text));
 if (!Array.isArray(options.to)) options.to = [options.to];
 options.to.forEach(to => msgattach.ToRecipients.Add(to));
 // msgattach.Importance = ews.Importance.High;

 // 添付ファイルを送信 // msgattach.Attachments.AddFileAttachment('filename to attachment.txt', 'c29tZSB0ZXh0');

 試す {
 const result = await msgattach.SendAndSaveCopy(); // .Send();
 console.log('完了!', 結果);
 結果情報.result = 結果;
 } キャッチ (エラー) {
 console.log('エラー:', err);
 結果情報コード = 1001;
 結果情報.msg = エラー;
 }
 結果情報を返します。
}

3 拡張参照

nodemailer.com/about/
github.com/CumberlandG…
github.com/gautamsi/ew…
github.com/lzwme/node-…

上記は、STMP プロトコルと EWS プロトコルに基づいて node.js がメールを送信する詳細です。node.js のメール送信の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Node.js シングルスレッド モデルの詳細な分析
  • Node.jsを理解するのはとても簡単です
  • node.js グローバル変数の具体的な使用法
  • Expressを使用してプロジェクトを自動的にビルドするNode.jsのプロセス全体
  • node.jsのインストールとHbuilderXの設定の詳細な説明
  • Node.js ファイルのコピー、フォルダの作成、その他の関連操作
  • Node.js の非同期ジェネレータと非同期反復の詳細な説明
  • node.js で Web サーバーを作成する手順の詳細な説明
  • Node.js でコマンドライン引数を収集して解析する方法
  • Alibaba Node.js 技術ドキュメントプロセスモジュール学習ガイドの詳細な説明
  • node.js を使用して CLI を開発するための完全な手順
  • Sequelize 経由で MySQL を Node.js に接続する方法
  • CentOS 8.2 サーバーに最新バージョンの Node.js をインストールする方法
  • Node.js テキスト ファイルの BOM ヘッダーを削除する方法
  • Appium+python 自動構成 (adk、jdk、node.js)
  • Node.js のコールバックを Promise に変換する方法
  • Node.js パスモジュール、ファイルサフィックスを取得する操作
  • node.js クローラー フレームワーク node-crawler の初体験
  • Nodejs 探索: シングルスレッドの高並行性の原理を深く理解する

<<:  MySql ログイン パスワードを忘れた場合とパスワードを忘れた場合の解決策

>>:  Ubuntu で G++ を使用して CPP ファイルをコンパイルする

推薦する

Google の新しい UI から学べること (画像とテキスト)

2011 年に最も顕著なウェブサイトの変更は、一連の製品に新しいユーザー インターフェースを導入した...

CentOS 6 および 7 での MySQL 5.7 の詳細なインストール チュートリアル

開発には常にデータが必要です。サーバーとしての Linux では、テスト データを格納するためのデー...

Vueカスタムツリーコントロールの使い方の詳細な説明

この記事では、Vueカスタムツリーコントロールの使い方を参考までに紹介します。具体的な内容は次のとお...

Ubuntu 18.04 Linux システムに JDK と Mysql をインストールする方法

プラットフォームの展開1. JDKをインストールするステップ1. OracleJDKをダウンロードす...

springcloud alibaba nacos linux 設定の詳細なチュートリアル

まず、github から nacos の圧縮パッケージをダウンロードします: https://git...

vue3でDOMをマウントするためのプラグインを書く際の問題について

vue2と比較して、vue3にはアプリの概念が追加され、vue3プロジェクトの作成も // メイン....

流星効果を実現する JavaScript キャンバス

この記事では、JavaScriptキャンバスで流星の特殊効果を表示するための具体的なコードを参考まで...

MySQL初心者のための基本操作のまとめ

図書館運営クエリ1.SHOW DATABASE; ----すべてのデータベースを照会する2. SHO...

MySQL 外部キー設定方法の例

1. 外部キーの設定方法1. MySQL では、2 つのテーブルを関連付けるために、外部キー (FO...

Vueドロップダウンメニューのコンポーネント開発の詳細説明

この記事の例では、Vueドロップダウンメニューのコンポーネント開発の具体的なコードを参考までに共有し...

CentOS 7 での Docker プロキシの設定 (Linux での Systemd サービスの環境変数設定)

Docker デーモンは、 HTTP_PROXY 、 HTTPS_PROXY 、およびNO_PRO...

iframe タグの使用方法の詳細な説明 (属性、透明度、適応高さ)

1. iframe の定義と使用法iframe 要素は、別のドキュメントを含むインライン フレーム...

ローカル フォルダー内の画像を読み込んで表示するための HTML サンプル コード

一つの目的Html ページでローカル フォルダーを選択すると、フォルダーとそのサブフォルダー内のすべ...

Vue3 の組み合わせ API における setup、ref、reactive の完全な使用方法

1. セットアップを始める次のコード関数を簡単に紹介します。 ref 関数を使用して変数の変更を監視...

MySQL パーティション関数の詳細な説明と例の分析

まず、データベース パーティショニングとは何でしょうか?以前、MySQL のテーブル パーティショニ...