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 でメール送信者を承認する方法
注:メールにカスタム ドメインを使用している場合は、このセクションをスキップできます。
個人のメール アドレスからメールを送信するには、そのメール アドレスが自分のものであることを確認する必要があります。
左側のメニューで、[設定]、[送信者認証] の順に選択します。 [単一の送信者を確認する] を選択して、1 つのメール アドレスを追加するフローを順を追って説明します。
SendGrid でカスタム ドメインを認証する方法
注:メールにカスタム ドメインを使用していない場合は、このセクションをスキップできます。
カスタム メール ドメインからメールを送信するには、SendGrid でそのドメインを認証する必要があります。この画面に移動するには、[設定] メニューをもう一度選択し、[送信者認証] を選択します。
次に、「ドメイン認証」のオプションを含む画面が表示されます。 「Authenticate Your Domain」オプションを選択すると、SendGrid が DNS レコードを構成するプロセスを順を追って説明します (DNS プロバイダーに基づいた具体的な手順を示します)。
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:[email protected]"
v=DMARC
使用する DMARC ルールのバージョンを示します (現在、バージョン 1 のみが利用可能です)。p=none
電子メールが DKIM または SPF に失敗した場合に電子メール プロバイダーが実行するアクションを示します。この設定はnone
で始まる必要があります 、メールの到達率に影響を与えないようにします。 DKIM と SPF が正しく構成されていることを確認したら、この値をquarantine
に更新できます。 プロバイダーが失敗した電子メールを自動的にスパムフォルダーにルーティングするようにする、またはreject
プロバイダーに失敗したメールを拒否/バウンスしてもらいます。pct=100
アクションを適用する必要がある失敗したメールの割合を示します。rua=mailto:[email protected]
集計レポートの送信先の電子メール アドレスです。これらのレポートには、特定のプロバイダーが受信した IP からのすべての電子メールに関する情報が含まれています。[email protected]
を置き換えます これらのレポートを受け取りたいメール アドレスを入力してください。
SendGrid で動的テンプレートを作成する方法
今日作成するツールは、SendGrid の動的テンプレート機能を使用して、メールの件名と本文テキストを設定します。これを設定するには、サイド ナビゲーション メニューで [Email API] オプションを選択し、[Dynamic Templates] を選択します。
最初の動的テンプレートを作成するためのプロンプトが表示された画面が表示されます。 「動的テンプレートの作成」オプションを選択します。
新しいテンプレートに「freeCodeCamp SendGrid チュートリアル」という名前を付けます。 SendGrid は、このテンプレートを使用可能なテンプレートのリストに追加します。テンプレートを選択して Template ID
を表示します (後でツールで必要になるため、これをメモしておいてください)、[バージョンの追加] ボタンをクリックします。
表示された画面で「空のテンプレート」を選択し、「コードエディタ」を選択します。エディタ ビューが表示されます。 SendGrid のエディターは HTML を使用してメール本文を作成しますが、ツールを作成するときはプレーン テキスト バージョンを送信します。
とりあえず、エディタの内容を次のコードに置き換えます:
<p>This is a test email used with the freeCodeCamp SendGrid tutorial</p>
<p>Unsubscribe: {{{unsubscribeId}}}</p>
{{{unsubscribeId}}}
が追加されていることに気付くでしょう。 . SendGrid のテンプレートは、Handlebars を使用して値を動的に置き換えます。ツールを構築するときに、この機能を利用します。
左上から設定オプションを選択します。必要に応じて、テンプレート バージョンに名前を付けることができますが、「件名」フィールドを変更する必要があります。この値を {{{subject}}}
に設定します ツールから件名の値を動的にロードします。
ダイナミック テンプレートをテストするには、トップ メニューから [データのテスト] オプションを選択します。この JSON データをエディタに挿入します:
{
"unsubscribeId": "1",
"subject": "Testing emails!"
}
画面右側のプレビューに、これらの値がテンプレートに反映されているのがわかります。 Save
を押すことを忘れないでください ボタンをクリックして変更を保存してください!
SendGrid で API キーを生成する方法
SendGrid アカウントを構成する最後の手順は、ツールで使用する 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";
sgMail
は主要な API ラッパーであり、MailDataRequired
必要になる型定義です。
最後に、ファイルを処理するためのいくつかの組み込み Node 機能をインポートします。
import path from "path";
import { createWriteStream, readFile } from "fs";
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 を含むフォルダー。次のファイル構造が表示されます:
この時点で、git
を使用している場合 あなたは非常に確信したい その prod
フォルダはリポジトリにコミットされません。
prod
内 フォルダ、validEmails.csv
を作成します ファイル。アプリはこのファイルを使用してメーリング リストを読み取ります。次の内容でファイルを初期化します ([email protected]
を置き換えます)。 あなたの実際のメールアドレスと一緒に):
email,unsubscribeId
[email protected],1
[email protected],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)
});
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
プロパティ - 文字列よりもはるかにスムーズに操作できます。
今こそ、いくつかの電子メールを送信する時です。解析関数の下 (ただし 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}`)
});
npm run build
を実行すると と npm run send
受信トレイに美しいメールが表示されるはずです!
この時点で、機能する電子メール送信アプリケーションが完成しました。おめでとう!必要に応じて、この時点までの進行状況を表示できます。
バウンスされた電子メールを処理する方法と、次に説明する送信エラーの追加ロジックを確認してください。
SendGrid で返送されたメールを処理する方法
[email protected]
に気づいたかもしれません は実際のメールアドレスではありません。 SendGrid は、前日のアクティビティのバウンス レポートを毎日生成します。
メールが返送されるたびに SendGrid の評判が損なわれ、メール プロバイダーがメールをスパムとしてマークする可能性があります。そのため、既知のバウンス アドレスへの送信を防止するロジックを追加する必要があります。
bouncedEmails.csv
を作成することから始めます prod
のファイル フォルダー (validEmails.csv
の隣にある必要があります) )。 unsubscribeId
は必要ありません ここに値があるので、次のように初期化します:
email
[email protected]
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");
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 で失敗したメールをキャプチャする方法
現在、電子メールの送信に失敗した場合、アプリケーションはエラーをログに記録します。これは小規模なユースケースでは機能しますが、アプリケーションをスケールアップすると、それらの失敗を特定して再送信を試みることがますます難しくなることがわかります。
代わりに、アプリケーションでこれらのメールを新しいファイルに保存することができます。
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...')
次に、検証後、成功メッセージを出力できます。
// 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;
バウンスされたメールをスキップしていても、処理済みとしてカウントしたいと考えています。
// 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
スクリプトを実行すると、ターミナルに次の出力が表示されます:
そして、次のようなメールを数通受け取っているはずです:
ここで最終的なコードを表示するか、freeCodeCamp 用に構築された拡張バージョンを表示できます。
-
EmailJS を使用して Vue.js アプリケーションからメールを送信する方法
数日前、私は単純な Vue プロジェクトに取り組むことに決め、作成した連絡先からメールを送信する必要がありました。誰かが私の連絡先フォームに記入するたびに、自動化された電子メールを受け取りたいと思っていました。 そこで私は検索を開始し、EmailJs にたどり着きました。この記事を書くことにしたのは、彼らのドキュメントが素晴らしく、とても使いやすいと感じたからです。また、それが誰かの助けになることを願っています:) 始めましょう! この記事では、EmailJS を使用して Vuejs アプリケーションからメールを送信する方法を紹介します。 続行する前に、Vue CLI を使用してミニ
-
匿名でメールを送信する方法
市場には、Gmail、Outlook、Yahoo! などの機能豊富な電子メール クライアントがたくさんあります。メールは、最も評判の良いインターネット企業の一部が所有しています。多くのユーザーは、オンライン プライバシーに関していまだに安全を感じていません。これらのプラットフォームはすべて、ユーザーをスパイしてユーザーの行動を見つけ出し、他のオンライン アクティビティを追跡しようとするためです。 私たちは通常、双方向のコミュニケーションに電子メールを使用しますが、特定されずに電子メールを送受信する必要があると感じる場合があり、その理由は完全に正当です. プライバシーが好きなだけかもしれません