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 ファイルをコンパイルする

推薦する

カルーセルバナーの自動回転効果を実現する純粋な CSS

さっそくコードを見てみましょう * { マージン: 0; パディング: 0; } 。容器 { マージ...

Nginx リバース プロキシ springboot jar パッケージ プロセス分析

Springboot プロジェクトをサーバーにデプロイする方法としては、war パッケージにパッケー...

Web デザインのための 5 つのシンプルな XHTML Web フォーム

Web デザイン 5 におけるシンプルな XHTML Web フォーム。 テクニック 1: ラベル ...

複合主キーと複数列インデックスに遭遇した場合の MySQL 行ロックの詳細な説明

背景今日、他のプロジェクト チームと協力してシス​​テムのストレス テストを実施しているときに、プロ...

素晴らしいCSS属性MASKの詳しい説明

この記事では、CSS の非常に興味深い属性マスクを紹介します。名前が示すように、マスクはマスクと翻訳...

ウェブデザインの達人がよく使うレスポンシブフレームワークを共有する(要約)

この記事では、Web デザインの達人がよく使用するレスポンシブ フレームワーク (概要) を紹介し、...

Docker、プレーヤー機能を備えたCMSオンデマンドシステムを構築

目次文章1. 機械を準備する2. Dockerをインストールする1. 依存パッケージをインストールす...

ページ リファクタリング スキル - Javascript、CSS

JS、CSSについてCS: ...上部のスタイルシートCSS式を避ける外部JS、CSSの使用JSと...

docker で PostgreSQL データベースをインストールして永続化する方法

Dockerのインストール手順をスキップする1. postgresqlイメージを取得する docke...

JavaScript による Web ページ カルーセルの超詳細な実装

目次HTML ページの作成js部分の機能を実装する1. 左ボタンと右ボタン2. 小さな円を動的に生成...

MySQLクエリトランザクション処理へのノード接続の実装

目次トピックmysqlの追加、削除、変更、クエリを入力しますMySQL トランザクション処理私は M...

JS オブジェクト コンストラクター Object.freeze

目次概要例1) オブジェクトをフリーズする2) 配列をフリーズする3) 浅い凍結4) ディープフリー...

MySQL SQL文を最適化するためのヒント

十分に最適化されていない、またはパフォーマンスが極端に低い SQL ステートメントに直面した場合、通...

MySQLアラームの詳細な分析と処理

最近、あるサービスにアラームが発生し、耐えられなくなっています。アラーム情報は次のとおりです。メトリ...