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

推薦する

単語のグループ化シーケンスと複数フィールドのグループ化のための MySQL グループ方法

ここで商品テーブルを作成しました。その中のデータを見てみましょう。 mysql> 商品から *...

MySQL クロステーブルクエリとクロステーブル更新

SQL の基礎知識がある友人は、「クロステーブル クエリ」について聞いたことがあるはずですが、クロス...

MySQLはトリガーを使用してデータベース内のテーブルの行制限を解決します。詳細な説明と例

MySQLはトリガーを使用してデータベース内のテーブルの行制限を解決します。詳細な説明と例最近のプロ...

MySQLデータベースがNULLを可能な限り避ける理由

MySQL の多くのテーブルには、NULL が列のデフォルト属性であるため、アプリケーションが NU...

Linux 上の Vim で色とテーマを変更する方法

Vim は Linux でよく使用されるテキスト エディターです。 Vim は、Sublime や ...

PDO を使用して SQL インジェクションを防ぐ原理の分析

序文この記事では、SQL インジェクションを回避するために pdo の前処理メソッドを使用します。詳...

Nginx ログ出力のリクエスト後パラメータを設定する方法

【序文】当プロジェクトの SMS 機能は、第三者に接続することです。第三者からの元の受信確認要求は ...

vscode で Prettier Code プラグインを使用する詳細なチュートリアル

なぜprettierを使うのですか?大企業では、フロントエンド開発コードに独自のコード標準がある場合...

HTML テーブル マークアップ チュートリアル (29): セルのライト境界線の色属性 BORDERCOLORLIGHT

セルでは、明るい境界線の色を個別に定義できます。 > 基本構文<TD ボーダーカラーライ...

テーブルリストを破棄するには、標準のdl、dt、ddタグを使用します。

現在、ますます多くのフロントエンド開発者が、元のテーブル レイアウトを xHTML + CSS に置...

Docker を使用した ElasticSearch:7.8.0 クラスターのインストールに関する詳細なチュートリアル

ElasticSearch クラスターは、クラスターを構築するための動態請求的方式と靜態配置文件をサ...

MySQL データ型 DECIMAL(N,M) における N と M の意味の詳細な説明

同僚から、MySQL データ型 DECIMAL(N,M) の N と M の意味を尋ねられました。言...

Linux インストール MySQL5.6.24 使用手順

Linux インストール MySQL ノート1. MySQL データベース サーバーをインストールす...

UbuntuへのDocker CEのインストール

この記事は、Ubuntu 17.10 での Docker CE のインストールを記録するために使用さ...

4 つの主要な SQL ランキング関数 ROW_NUMBER、RANK、DENSE_RANK、NTILE の使用方法の紹介

1. ROW_NUMBER()定義: ROW_NUMBER() 関数は、select によってクエリ...