郵便
 Computer >> コンピューター >  >> ソフトウェア >> 郵便

SendGrid API を使用してメール ニュースレターを送信する方法

何年もの間、Quincy Larson は、Amazon SES を利用した freeCodeCamp の Mail for Good プラットフォームを通じて、毎週のメールニュースレターを送信しました。

彼は最近、このプロセスを SendGrid に移行しました。この記事では、これを実現するためのツールをどのように構築したかを紹介します。

SendGrid アカウントの設定方法

最初のステップは、SendGrid に登録してアカウントを設定することです。このチュートリアルでは、無料利用枠で十分です。

アプリケーションをスケールアップすると、プラットフォームで利用可能なメールの制限を増やす必要がある場合があります。

SendGrid で専用 IP アドレスを設定する方法

デフォルトでは、SendGrid は共有 IP アドレスを使用してメールを送信します。小規模な電子メール アプリケーションではこれで問題ないかもしれませんが、送信速度を上げると、専用の IP アドレスを設定する必要があります。

あなたの「送信者評価」 (SendGrid がメール サービス プロバイダーとの関係を評価するために使用する指標) は、同じ IP を共有する他のユーザーの行動によって悪影響を受けないため、これは良い考えです。

独自の専用 IP を設定するには、サイド ナビゲーション メニューから [設定] オプションを選択し、[IP アドレス] を選択します。ただし、このオプションは無料利用枠では利用できません。

有料プランによっては、すでに 1 つの専用 IP アドレスが設定されている場合があります。持っていない場合、またはさらに追加することを選択した場合は、[IP アドレスを追加] ボタンを選択して新しい IP を構成できます。

SendGrid API を使用してメール ニュースレターを送信する方法
IPアドレスの設定メニュー

SendGrid でメール送信者を承認する方法

注:メールにカスタム ドメインを使用している場合は、このセクションをスキップできます。

個人のメール アドレスからメールを送信するには、そのメール アドレスが自分のものであることを確認する必要があります。

左側のメニューで、[設定]、[送信者認証] の順に選択します。 [単一の送信者を確認する] を選択して、1 つのメール アドレスを追加するフローを順を追って説明します。

SendGrid API を使用してメール ニュースレターを送信する方法
単一送信者オプション

SendGrid でカスタム ドメインを認証する方法

注:メールにカスタム ドメインを使用していない場合は、このセクションをスキップできます。

カスタム メール ドメインからメールを送信するには、SendGrid でそのドメインを認証する必要があります。この画面に移動するには、[設定] メニューをもう一度選択し、[送信者認証] を選択します。

SendGrid API を使用してメール ニュースレターを送信する方法
送信者認証の設定メニュー

次に、「ドメイン認証」のオプションを含む画面が表示されます。 「Authenticate Your Domain」オプションを選択すると、SendGrid が DNS レコードを構成するプロセスを順を追って説明します (DNS プロバイダーに基づいた具体的な手順を示します)。

SendGrid API を使用してメール ニュースレターを送信する方法
送信者認証設定ページ

SendGrid で逆引き DNS を設定する方法

注:メールにカスタム ドメインを使用していない場合は、このセクションをスキップできます。

逆引き DNS (ドメイン ネーム システム) は、電子メール プロバイダーが特定の IP アドレスの所有者を検索するために使用します。これを設定すると、メール プロバイダーは、メールの送信元の IP アドレスがカスタム ドメインに接続されていることを確認できます。

上記と同じ送信者認証画面に、「逆引き DNS」セクションが表示されます。アカウントにある専用 IP ごとにリバース DNS を構成するオプションがあります。ドメイン認証と同様に、SendGrid のプラットフォームがこれを設定する手順を説明します。

SendGrid でメール認証を設定する方法

注:メールにカスタム ドメインを使用していない場合は、このセクションをスキップできます。

主要な電子メール プロバイダー (Gmail、Yahoo、Outlook など) は、電子メールの送信者を認証するために、SPF、DKIM、DMARC などのいくつかの方法を使用しています。

  • SPF (Sender Policy Framework) は、ドメインからメールを送信する IP アドレスが許可されていることを検証します。
  • DKIM (DomainKeys Identified Mail) は公開鍵文字列を使用して、電子メール from を認証します 住所が正確であり、なりすまし/改ざんされていないこと。
  • DMARC (Domain-based Message Authentication, Reporting, and Conformance) は、メールが SPF または DKIM の検証に失敗した場合の対応方法をメール プロバイダーに指示する一連の指示です。

SendGrid の認証フローでは、ドメイン認証プロセスの一部として SPF と DKIM をセットアップする手順を説明しますが、DMARC を手動で構成する必要があります。

DNS ホスティング プロバイダーにアクセスし、DNS 管理設定にアクセスします。そこから、新しい TXT を追加します _dmarc.yourdomain.com という名前のレコード (yourdomain.com を置き換えます カスタム ドメインで)。

GoDaddy などの一部のプロバイダーは、ドメインをレコードに自動的に追加することに注意してください。この場合、名前は _dmarc である必要があります。 .

このレコードの構造は次のようになります:

"v=DMARC1; p=none; pct=100; rua=mailto:dmarc@yourdomain.com"
  • v=DMARC 使用する DMARC ルールのバージョンを示します (現在、バージョン 1 のみが利用可能です)。
  • p=none 電子メールが DKIM または SPF に失敗した場合に電子メール プロバイダーが実行するアクションを示します。この設定は none で始まる必要があります 、メールの到達率に影響を与えないようにします。 DKIM と SPF が正しく構成されていることを確認したら、この値を quarantine に更新できます。 プロバイダーが失敗した電子メールを自動的にスパムフォルダーにルーティングするようにする、または reject プロバイダーに失敗したメールを拒否/バウンスしてもらいます。
  • pct=100 アクションを適用する必要がある失敗したメールの割合を示します。
  • rua=mailto:dmarc@yourdomain.com 集計レポートの送信先の電子メール アドレスです。これらのレポートには、特定のプロバイダーが受信した IP からのすべての電子メールに関する情報が含まれています。 dmarc@yourdomain.com を置き換えます これらのレポートを受け取りたいメール アドレスを入力してください。

SendGrid で動的テンプレートを作成する方法

今日作成するツールは、SendGrid の動的テンプレート機能を使用して、メールの件名と本文テキストを設定します。これを設定するには、サイド ナビゲーション メニューで [Email API] オプションを選択し、[Dynamic Templates] を選択します。

SendGrid API を使用してメール ニュースレターを送信する方法
ダイナミック テンプレートの設定メニュー

最初の動的テンプレートを作成するためのプロンプトが表示された画面が表示されます。 「動的テンプレートの作成」オプションを選択します。

新しいテンプレートに「freeCodeCamp SendGrid チュートリアル」という名前を付けます。 SendGrid は、このテンプレートを使用可能なテンプレートのリストに追加します。テンプレートを選択して Template ID を表示します (後でツールで必要になるため、これをメモしておいてください)、[バージョンの追加] ボタンをクリックします。

SendGrid API を使用してメール ニュースレターを送信する方法
新しく追加されたテンプレートのプレビュー

表示された画面で「空のテンプレート」を選択し、「コードエディタ」を選択します。エディタ ビューが表示されます。 SendGrid のエディターは HTML を使用してメール本文を作成しますが、ツールを作成するときはプレーン テキスト バージョンを送信します。

とりあえず、エディタの内容を次のコードに置き換えます:

<p>This is a test email used with the freeCodeCamp SendGrid tutorial</p>
<p>Unsubscribe: {{{unsubscribeId}}}</p>
私たちのツールはプレーンテキストのメールを送信するので、余分な HTML ボイラープレートは不要です.

{{{unsubscribeId}}} が追加されていることに気付くでしょう。 . SendGrid のテンプレートは、Handlebars を使用して値を動的に置き換えます。ツールを構築するときに、この機能を利用します。

左上から設定オプションを選択します。必要に応じて、テンプレート バージョンに名前を付けることができますが、「件名」フィールドを変更する必要があります。この値を {{{subject}}} に設定します ツールから件名の値を動的にロードします。

ダイナミック テンプレートをテストするには、トップ メニューから [データのテスト] オプションを選択します。この JSON データをエディタに挿入します:

{
    "unsubscribeId": "1",
    "subject": "Testing emails!"
}
JSON ではキーを引用符で囲む必要があることに注意してください!

画面右側のプレビューに、これらの値がテンプレートに反映されているのがわかります。 Save を押すことを忘れないでください ボタンをクリックして変更を保存してください!

SendGrid API を使用してメール ニュースレターを送信する方法
テンプレート値の動的読み込みを示すエディタとプレビュー画面

SendGrid で API キーを生成する方法

SendGrid アカウントを構成する最後の手順は、ツールで使用する API キーを生成することです。

メインの SendGrid ページに戻るには、左上の戻る矢印をクリックします。次に、「設定」と「API キー」を選択します。 [API キーの作成] を選択して、新しいキーを生成します。必要に応じてキーに「フル アクセス」を付与することもできますが、このチュートリアルでは、「メール送信」アクセスのみが必要です。

この画面に再度アクセスしたときにその目的を思い出せるように、キーにはわかりやすい名前を付けてください。権限を設定したら、[作成して表示] を選択してキーを生成します。キーは二度と表示できないため、安全な場所に保存してください .

SendGrid API を使用してメール ニュースレターを送信する方法
メール送信権限を有効にしたAPI画面の作成

メール ツールの作成方法

次に、実際にメールを送信するコードを記述します。ライブ アプリケーションのコードを表示できますが、このチュートリアルの目的のために、主に SendGrid API の使用に焦点を当てるために、わずかに縮小されたバージョンを構築します。

カスタム メール キャンペーン スクリプトに必要なソフトウェア

このプロジェクトを使用するには、次のツールをインストールする必要があります:

  • Node.js - LTS バージョンをお勧めします
  • VSCode や Atom などの IDE

オプションで git が必要な場合もあります バージョン管理用。

ライブ ツールは MongoDB Atlas クラスターを使用しますが、チュートリアルの例は使用しません。 MongoDB に慣れていない場合、freeCodeCamp のカリキュラムには、MongoDB のセットアップと使用に関する優れたセクションが含まれています。

プロジェクトの初期化方法

このプロジェクトで作業するディレクトリ (フォルダー) を作成します。次に、選択したエディターと端末でそのフォルダーを開きます。

開始するには、これを Node プロジェクトとして設定する必要があります。これを行う最も簡単な方法は、npm init を使用することです。 あなたの端末で。これにより、package.json の作成が順を追って説明されます。 Node アプリケーションのコア ファイルです。

このアプリケーションではデフォルト値で問題なく動作しますが、scripts を変更する必要があります。 セクション:

  "scripts": {
    "build": "tsc",
    "send": "node ./prod/send.js"
  },
npm init test を作成します スクリプト - これはプロジェクトから削除できます。

build script は、TypeScript を JavaScript にコンパイルするために使用され、send script がアプリケーションを実行します。

次に、TypeScript をインストールしてセットアップします。 TypeScript に慣れていない場合、TypeScript は基本的に、より強力な型定義とコンパイル時のエラー チェックを備えた JavaScript のスーパーセットです。

プロジェクトに TypeScript をインストールするには、npm install --save-dev typescript を実行します。 あなたの端末で。 (--save-dev flag はそれを開発依存関係として保存します - TypeScript は実行時に必要ないため、本番環境でクリーンアップできます)。

TypeScript には、JavaScript ファイルを生成するときに従うべき規則を設定するための独自の構成ファイルが必要です。プロジェクトのルート ディレクトリに tsconfig.json というファイルを作成します。 以下を挿入します:

{
    "compilerOptions": {
      "target": "es5",
      "module": "commonjs",
      "strict": true,
      "esModuleInterop": true,
      "skipLibCheck": true,
      "forceConsistentCasingInFileNames": true,
      "outDir": "./prod",
      "rootDir": "./src"
    }
  }
チュートリアル リポジトリを表示すると、余分な excludes が表示されます 財産。この値はチュートリアルのファイル構造に固有のものであり、必要ありません。

簡潔にするために、これらの構成設定については詳しく説明しません。追加情報が必要な場合は、TypeScript に非常に詳細なドキュメントがあります。

git を使用している場合 バージョン管理とこれをリポジトリ (GitHub など) にアップロードするために、.gitignore を作成する必要があります。 プロジェクトのルート ディレクトリにあるファイル。このファイルには以下が含まれている必要があります:

/node_modules/
.env
/prod/
  • /node_modules/ インストールされたパッケージを無視します。これは、バージョン管理を行う際のベスト プラクティスと見なされます。
  • .env 環境変数ファイルを無視します。これは非常に重要です。決して あなたのシークレットをリポジトリにコミットしたい
  • /prod/ コンパイル済みの JavaScript ファイルを無視します。このフォルダはメーリング リストにも使用するため、個人を特定できる情報を誤ってコミットしないようにすることが重要です。

.env を作成します ルート プロジェクト ディレクトリにあるファイル。このファイルから次の環境変数を読み込みます:

SENDGRID_API_KEY=
SENDGRID_FROM=
SENDGRID_TEMPLATE_ID=

MAIL_SUBJECT=
値を入力するときは、必ず二重引用符で囲んでください。また、= の前後にスペースはありません サイン!
  • SENDGRID_API_KEY は、前の手順で生成した API キーである必要があります。
  • SENDGRID_FROM あなたの電子メールアドレスでなければなりません (これは from に使用されるアドレスです) フィールド)
  • SENDGRID_TEMPLATE_ID id である必要があります 前に作成した動的テンプレートの文字列
  • MAIL_SUBJECT 送信するメールの件名になります。ここでは、これを「fCC チュートリアル メール」に設定してください。

最後に src を作成します ルート プロジェクト ディレクトリにフォルダーを作成し、send.ts を作成します。 そのフォルダー内のファイル。

依存関係をインストールする方法

まず sendgrid をインストールする必要があります Node.js パッケージ。このパッケージは、SendGrid API のラッパーとして機能し、メールを送信するための API 呼び出しを行うプロセスを簡素化します。 npm install @sendgrid/mail を実行 このパッケージをインストールします。

次に、いくつかの開発依存関係が必要です。 npm install --save-dev dotenv @types/node を実行 .

  • dotenv .env から環境変数をロードできるようにします
  • @types/node Node.js の型定義を提供します - TypeScript はこれらの定義に依存して、組み込みメソッドと関数の構造を理解します。

ロジックの書き方

今度は /src/send.ts で作業します ファイル - これは、アプリ ロジックの大部分を構築する場所です。パッケージから必要な値をインポートすることから始めます。

まず dotenv をロードします 環境変数をパッケージ化して解析します。

import dotenv from "dotenv";
dotenv.config();
dotenv ローカル開発にのみ必要 - Heroku や Repl.it などのほとんどのオンライン ホストは、環境変数をネイティブに処理できます

dotenv.config() 呼び出しは .env を読み取ります ファイルを開き、値を process.env にロードします ノード オブジェクト。

次に、SendGrid パッケージから必要なモジュールをインポートします。

import sgMail, { MailDataRequired } from "@sendgrid/mail";
TypeScript は自動的にインポートできますが、手動でインポートすることをお勧めします。

sgMail は主要な API ラッパーであり、MailDataRequired 必要になる型定義です。

最後に、ファイルを処理するためのいくつかの組み込み Node 機能をインポートします。

import path from "path";
import { createWriteStream, readFile } from "fs";
{ syntax } は、パッケージから特定のモジュールをインポートするためのものです。
  • path 相対パスでメーリングリストファイルを見つけるために使用されます
  • fs これらのファイルの読み書きに使用されます

ロジックの構築を開始する時間です。私たちのアプリケーションは、.env で設定されるいくつかの重要な値に依存しています ファイルなので、これらの変数が正しく設定されていることを検証することから始める必要があります。欠落しているものがあれば、電子メールを送信するときにエラーがスローされないように、アプリケーションを早期に終了させたいと考えています。

// Here we check for a valid API key
const apiKey = process.env.SENDGRID_API_KEY;
if (!apiKey) {
  console.error("Missing SendGrid Key");
  process.exit(1);
}

// Here we check for a valid from address
const fromAddress = process.env.SENDGRID_FROM;
if (!fromAddress) {
  console.error("Missing sender email address!");
  process.exit(1);
}

// Here we check for a dynamic template ID
const sgTemplate = process.env.SENDGRID_TEMPLATE_ID;
if (!sgTemplate) {
  console.error("Missing SendGrid Template ID");
  process.exit(1);
}

// Here we check for the mail subject, but if it is missing
// we do not need to exit. Instead we use a fallback value.
const subjectValue = process.env.MAIL_SUBJECT || "Fallback value - check your env!";
|| 構文は、 process.env.MAIL_SUBJECT の場合 が定義されていないか偽物である場合は、代わりに文字列を使用してください。

process.exit(1) 各条件チェックで表示される呼び出しは、ノードに終了コード 1 でプロセス (アプリケーション) を終了するように指示します .これは、これらのチェックのいずれかが失敗したためにアプリケーションがクラッシュしたことを示しています。

SendGrid では、API キーを設定する必要があります。環境変数ロジックの下に、関数呼び出しを追加してキーを設定します。

// Here we set the SendGrid API key
sgMail.setApiKey(apiKey);

先に進む前に、npm run build を実行してください。 端末で - これにより prod が作成されます コンパイルされた JavaScript を含むフォルダー。次のファイル構造が表示されます:

SendGrid API を使用してメール ニュースレターを送信する方法
チュートリアルのこの時点のファイル ツリー

この時点で、git を使用している場合 あなたは非常に確信したい その prod フォルダはリポジトリにコミットされません。

prod 内 フォルダ、validEmails.csv を作成します ファイル。アプリはこのファイルを使用してメーリング リストを読み取ります。次の内容でファイルを初期化します (your@email.com を置き換えます)。 あなたの実際のメールアドレスと一緒に):

email,unsubscribeId
your@email.com,1
iama@fake.email,2
.csv ファイルのカンマの前後にスペースはありません。

これで、これを解析してメーリングリストに入れるコードを書くことができます! src/send.ts で ファイルに次のコードを追加してください:

// Here we concatenate our file path for the valid email file
const filePath = path.join(__dirname + "/../validEmails.csv");

// This is where we start reading the file!
readFile(filePath, "utf8", (err, data) => {
    if (err) {
        console.error(err);
        return;
    }
    console.log(data)
});
このプロセス全体で ES6 アロー関数構文を使用しています。 function を使用してください 必要に応じて、宣言を代わりに使用してください。

npm run build を実行すると と npm run send validEmail.csv の内容が表示されます。 ターミナルのファイル。必要に応じて、この時点までの現在の進捗状況を表示できます。

すごい!次に、その文字列を解析してオブジェクトの配列にする必要があります。これにより、文字列を反復処理して電子メール メッセージを作成できます。コールバック関数を更新します:

// This is where we start reading the file!
readFile(filePath, "utf8", (err, data) => {
    if (err) {
        console.error(err);
        return;
    }
    
  // Here we parse the data into an object array
  const emailList = data
    .split("\n")
    .slice(1)
    .map((el) => {
      const [email, unsubscribeId] = el.split(",");
      return { email, unsubscribeId };
    });
});
[email, unsubscribeId] 分解を適用して分割配列の値をこれら 2 つの変数に割り当てます。
  • .split("\n") 文字列を改行で分割します。 注意 :Windows を使用している場合は、validEmails.csv の行末設定を変更する必要がある場合があります。 CRLF から LF へ (Windows は、データ処理に影響を与える余分な改行文字を挿入します)
  • .slice(1) その配列の最初の要素を削除します (私たちの email,unsubscribeId 行)
  • 私たちの map 関数は各 email,unsubscribeId を変換します 文字列を {email, unsubscribeId} に オブジェクト。

この解析関数の最終結果は、email を持つオブジェクトの配列になります。 と unsubscribeId プロパティ - 文字列よりもはるかにスムーズに操作できます。

SendGrid API を使用してメール ニュースレターを送信する方法
解析関数の出力例

今こそ、いくつかの電子メールを送信する時です。解析関数の下 (ただし readFile 内) callback) 反復メソッドの構造を追加します。配列内の各値にアクセスしたいので、 .forEach を使用します

  // Here we iterate through the emailList array
  emailList.forEach((user) => {});
user パラメータは {email, unsubscribeId} になります 物体。 user と呼んでいます アプリケーション全体で freeCodeCamp ユーザーデータ オブジェクトを表すためです。

.forEach のコールバック内 、SendGrid API が期待するメッセージ オブジェクトを構築できます。

  // Here we iterate through the emailList array
  emailList.forEach((user) => {

    // This is the message object SendGrid needs
    const message: MailDataRequired = {
        to: user.email,
        from: fromAddress,
        subject: subjectValue,
        text: "This goes away!",
        templateId: sgTemplate,
        dynamicTemplateData: {
            subject: subjectValue,
            unsubscribeId: user.unsubscribeId
        }
    }
    
  });

先に進む前に、このメッセージ オブジェクトを詳しく見てみましょう。 MailDataRequired 以前にインポートしたものがここで型定義として使用されるため、必要なプロパティが欠落している場合、TypeScript は警告を発します。ありがたいことに、必要なプロパティはすべて揃っています。しかし、それはどういう意味ですか?

  • to: メッセージの送信先の電子メール アドレス。これは email になります validEmails.csv の各行から ファイル
  • from: メッセージの送信元の電子メール アドレス。これは .env で設定されています 以前(あなたのである必要があります メールアドレス)
  • subject: このフィールドは必須ではありませんが、動的テンプレートが件名を正しく解析しない場合に備えて、フォールバック値を提供します。
  • text: このテキスト値は、テンプレートによって上書きされます。ただし、使用することは依然として重要です。 SendGrid は plaintext としてメールを送信できます または html - text を使用して html の代わりにプロパティ プロパティ、テンプレートが plaintext として送信されることを確認します .メール プロバイダーは可能性が高い HTML メッセージをスパムとしてフラグ付けして、配信率を向上させます。
  • templateId: これは、SendGrid がメールで使用する動的テンプレートの ID です。
  • dynamicTemplateData: これらは、前に動的テンプレートで設定した Handlebars 文字列に対応する値です。

すごい!次のステップは、この構築されたメッセージを取得して送信することです。メッセージ オブジェクトの下 (ただし .forEach 内) callback)、send 呼び出しを追加しましょう:

    // Here we send the message we just constructed!
    sgMail.send(message);

これにより、 validEmails.csv の各メールにメッセージが送信されます .残念ながら、コードはサイレント モードで実行されるため、各送信が成功したかどうかはわかりません。エラー処理を追加しましょう。

.send() 呼び出しは Promise を返すので、.then().catch() を使用できます 返品を処理します。

    // Here we send the message we just constructed!
    sgMail.send(message)
        .then(() => {
            // Here we log successful send requests
            console.info(`Message send success: ${user.email}`)
        }).catch((err) => {
            // Here we log errored send requests
            console.error(err);
            console.error(`Message send failed: ${user.email}`)
        });
async/await を使用することもできますが、これは .then.catch の方が明確なケースです

npm run build を実行すると と npm run send 受信トレイに美しいメールが表示されるはずです!

この時点で、機能する電子メール送信アプリケーションが完成しました。おめでとう!必要に応じて、この時点までの進行状況を表示できます。

バウンスされた電子メールを処理する方法と、次に説明する送信エラーの追加ロジックを確認してください。

SendGrid で返送されたメールを処理する方法

iama@fake.email に気づいたかもしれません は実際のメールアドレスではありません。 SendGrid は、前日のアクティビティのバウンス レポートを毎日生成します。

メールが返送されるたびに SendGrid の評判が損なわれ、メール プロバイダーがメールをスパムとしてマークする可能性があります。そのため、既知のバウンス アドレスへの送信を防止するロジックを追加する必要があります。

bouncedEmails.csv を作成することから始めます prod のファイル フォルダー (validEmails.csv の隣にある必要があります) )。 unsubscribeId は必要ありません ここに値があるので、次のように初期化します:

email
iama@fake.email
デモンストレーションのために偽のメールを追加しました

send.ts に戻ります。 ファイル。 38 行目、既存の filePath のすぐ下 宣言、新しい bouncedEmails.csv のパスを構成します ファイル。

// Here we concatenate our file paths for the CSV files
const filePath = path.join(__dirname + "/validEmails.csv");
const bouncePath = path.join(__dirname + "/bouncedEmails.csv");
__dirname は、このファイルの現在のディレクトリを参照します (この場合、send.ts ファイル)

すごい!次に、そのファイルを読み取る必要があります。これらのファイル パス宣言のすぐ下 (既存の readFile の前) 呼び出し)、バウンスされたファイルを読み取るためのロジックを追加します。

// Read through the bounce list, parse into array
readFile(bouncePath, "utf8", (err, data) => {
  if (err) {
    console.error(err);
    process.exit(1);
  }
  bounceList = data.split("\n").slice(1);

readFile は非同期です。そのため、既存のすべての送信ロジックをコールバック関数でラップする必要があります。 .クロージング }) であることを確認してください このコールバックはファイルの最後に移動されます。

bouncedEmails.csv を読みました ファイルを新しい行で分割します (行末が LF であることを確認する必要があることに注意してください) )、email を削除します。 ライン。最後に、既存の送信ロジックを続行します。

送信ロジックに戻ります。 .forEach 内 ブロックされた電子メールをスキップするロジックを追加します (不要な変数を作成しないように、メッセージ オブジェクトを構築する前にこれを追加します)。

  // Here we iterate through the emailList array
  emailList.forEach((user) => {
    // Here we check if the email has been bounced
    if (bounceList.length && bounceList.includes(user.email)) {
        console.info(`Message send skipped: ${user.email}`);
        return;
    }
    
bounceList.csvの場合 ファイルが空です。includes を呼び出しています エラーがスローされます。 .length をチェックします 価値を第一に。

初期の return を活用することで ステートメント、その特定の .forEach を終了します bounceList の場合の繰り返し そのメールが含まれます。これにより、以前に返送されたメール アドレスに送信しようとするのを防ぐことができます。 npm run build を実行すると と npm run start 、ターミナルに次の出力が表示されるはずです:

SendGrid API を使用してメール ニュースレターを送信する方法
スキップされたメールと成功したメールのコンソール出力の例

この時点までの進捗状況をご覧ください。

SendGrid で失敗したメールをキャプチャする方法

現在、電子メールの送信に失敗した場合、アプリケーションはエラーをログに記録します。これは小規模なユースケースでは機能しますが、アプリケーションをスケールアップすると、それらの失敗を特定して再送信を試みることがますます難しくなることがわかります。

代わりに、アプリケーションでこれらのメールを新しいファイルに保存することができます。

failedEmails.csv を作成します prod のファイル フォルダ。このファイルは空にすることができます。ヘッダー行を追加するコードを記述します。

send.ts に戻る ファイルの 38 行目のパス宣言に進みます。新しい failedEmails.csv 用にもう 1 つ追加しましょう。 :

// Here we concatenate our file paths for the CSV files
const filePath = path.join(__dirname + "/validEmails.csv");
const bouncePath = path.join(__dirname + "/bouncedEmails.csv");
const failedPath = path.join(__dirname + "/failedEmails.csv");

他のパスとは異なり、このパスは write に使用されます 手術。メールの処理中に継続的に書き込みたいため、そのためのストリームを作成する必要があります。これらのパス宣言のすぐ下に、そのストリームを作成し、最初のヘッダー行を追加しましょう。

// Here we create our write stream for failed emails
const failedStream = createWriteStream(failedPath);

// Here we add the header row
failedStream.write("email,unsubscribeId\n")

この新しいストリームを組み込むために、エラー処理ロジックを改善する時が来ました。別の write を追加する必要があります send のエラー処理への操作

    // Here we send the message we just constructed!
    sgMail
      .send(message)
      .then(() => {
        // Here we log successful send requests
        console.info(`Message send success: ${user.email}`);
      })
      .catch((err) => {
        // Here we log errored send requests
        console.error(err);
        console.error(`Message send failed: ${user.email}`);
        // And here we add that email to the failedEmails.csv
        failedStream.write(`${user.email},${user.unsubscribeId}\n`)
      });
スクリプトの実行中にフィードバックを確認できるように、コンソール ステートメントを保持したいと考えています。

これは email を書き込みます と unsubscribeId 新しい failedEmails.csv に 適切な形式で - そのデータを validEmails.csv にコピーできるようにします 別の送信試行を行います。

おめでとう!これで、電子メールを一斉送信するための完全に機能するツールを構築できました。作業を確認したい場合は、完成したコードを見ることができます。ただし、いくつかのオプションの「あると便利な」機能については、引き続きお読みください。

メール ツールのオプション機能

私たちのツールは CLI ベース (コマンドライン インターフェイスまたはターミナルで使用されることを意味します) であるため、ユーザーからのフィードバックはあまりありません。追加のコンソール機能を利用して、スクリプトの進行状況に関する詳細情報を提供できます。

いくつかの「チェックポイント」を追加することから始めましょう。環境変数の検証の前に、スクリプトが開始され、変数をチェックしていることを示すメッセージを出力しましょう:

console.info('Script started. Validating environment variables...')
console.info は、これが情報メッセージであることを示します

次に、検証後、成功メッセージを出力できます。

// Here we set the SendGrid API key
sgMail.setApiKey(apiKey);

console.info('Variables confirmed!')

バウンスされたファイルを読み取る関数内で、開始、失敗、成功のメッセージを追加できます。

console.info('Reading bounced email list...')

// Read through the bounce list, parse into array
readFile(bouncePath, "utf8", (err, data) => {
  if (err) {
    console.error(err);
    console.error('Failed to read bounced emails!')
    process.exit(1);
  }
  bounceList = data.split("\n").slice(1);

console.info('Bounced emails read!')

有効なメーリング リストについても同様です:

console.info('Reading send list...')
// This is where we start reading the file!
readFile(filePath, "utf8", (err, data) => {
  if (err) {
    console.error(err);
    console.error('Failed to read send list!')
    return;
  }

ここで、操作が完了したときにメッセージが出力されると非常に便利です。ただし、 console.info を追加すると .forEach の後 ループ、それは実際に before を出力します メールの送信が完了しました!

これは .send メソッドはネットワーク呼び出しを作成し、Promise を返します。その Promise は、反復が完了する前に解決/拒否されていない可能性があります。

その代わりに、送信したメールの数とメールの総数を追跡するカウンターを構築できます。 .forEachの直前 ループ、次の変数を追加:

    // Here we create variables for counting
    const emailTotal = emailList.length;
    let emailCount = 0;
.length を変数に代入することで、反復ごとに読み取る必要がなくなります。

バウンスされたメールをスキップしていても、処理済みとしてカウントしたいと考えています。

  // Here we iterate through the emailList array
  emailList.forEach((user) => {
    // Here we check if the email has been bounced
    if (bounceList.includes(user.email)) {
      console.info(`Message send skipped: ${user.email}`);
      emailCount++;
      if (emailCount === emailTotal) {
        console.info(
          `Sending complete! Sent ${emailTotal} emails. Have a nice day!`
        );
        return;
      }
    }

最後に、送信したメールが最後のメールかどうかを確認するロジックを追加する必要があります。このロジックは、send 呼び出しの成功およびエラー ハンドラーに入ります。

    // Here we send the message we just constructed!
    sgMail
      .send(message)
      .then(() => {
        // Here we log successful send requests
        console.info(`Message send success: ${user.email}`);
        // Here we handle the email counts
        emailCount++;
        if (emailCount === emailTotal) {
          console.info(
            `Sending complete! Sent ${emailTotal} emails. Have a nice day!`
          );
        }
      })
      .catch((err) => {
        // Here we log errored send requests
        console.error(err);
        console.error(`Message send failed: ${user.email}`);
        // And here we add that email to the failedEmails.csv
        failedStream.write(`${user.email},${user.unsubscribeId}\n`);
        // Here we handle the email counts
        emailCount++;
        if (emailCount === emailTotal) {
          console.info(
            `Sending complete! Sent ${emailTotal} emails. Have a nice day!`
          );
        }
      });

以上で、アプリは完全に完成しました。 npm run build を実行すると と npm run send スクリプトを実行すると、ターミナルに次の出力が表示されます:

SendGrid API を使用してメール ニュースレターを送信する方法
完成したアプリケーションのコンソール出力の例

そして、次のようなメールを数通受け取っているはずです:

SendGrid API を使用してメール ニュースレターを送信する方法
テスト メールの結果のサンプル画像

ここで最終的なコードを表示するか、freeCodeCamp 用に構築された拡張バージョンを表示できます。


  1. EmailJS を使用して Vue.js アプリケーションからメールを送信する方法

    数日前、私は単純な Vue プロジェクトに取り組むことに決め、作成した連絡先からメールを送信する必要がありました。誰かが私の連絡先フォームに記入するたびに、自動化された電子メールを受け取りたいと思っていました。 そこで私は検索を開始し、EmailJs にたどり着きました。この記事を書くことにしたのは、彼らのドキュメントが素晴らしく、とても使いやすいと感じたからです。また、それが誰かの助けになることを願っています:) 始めましょう! この記事では、EmailJS を使用して Vuejs アプリケーションからメールを送信する方法を紹介します。 続行する前に、Vue CLI を使用してミニ

  2. 匿名でメールを送信する方法

    市場には、Gmail、Outlook、Yahoo! などの機能豊富な電子メール クライアントがたくさんあります。メールは、最も評判の良いインターネット企業の一部が所有しています。多くのユーザーは、オンライン プライバシーに関していまだに安全を感じていません。これらのプラットフォームはすべて、ユーザーをスパイしてユーザーの行動を見つけ出し、他のオンライン アクティビティを追跡しようとするためです。 私たちは通常、双方向のコミュニケーションに電子メールを使用しますが、特定されずに電子メールを送受信する必要があると感じる場合があり、その理由は完全に正当です. プライバシーが好きなだけかもしれません