0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

reactでfirebaseを使ってgmailを送信

Last updated at Posted at 2024-08-22

はじめに

 reactでfirebaseを使ってgmailを送信するアプリ作成に関する忘備録です。

条件

・node.jsがインストール済み
・firebaseのプロジェクトがあること(従量加算)

フロントエンドとバックエンドの同時作成

フロントエンドはhostingにデプロイし、バックエンドはfunctionにデプロイする必要があるようですが、reactでは同時に作成できるようです。

アプリ作成

ターミナル
npx create-react-app firebase-email-sender
cd firebase-email-sender

Firebase SDKのインストール:

ターミナル
npm install firebase

Firebase.jsファイルの作成:

配置先はsrc/firebase.js

Firebase.js
import { initializeApp } from "firebase/app";
import { getFunctions } from "firebase/functions";

const firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  projectId: "YOUR_PROJECT_ID",
  storageBucket: "YOUR_STORAGE_BUCKET",
  messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
  appId: "YOUR_APP_ID",
};

const app = initializeApp(firebaseConfig);
export const functions = getFunctions(app);

メール送信フォームの作成:

src/App.js に、メール送信フォームを作成

APP.js
import { httpsCallable } from "firebase/functions";
import React, { useState } from "react";
import "./App.css";
import { functions } from "./firebase";

function App() {
  const [emailContent, setEmailContent] = useState("");
  const [emailAddresses, setEmailAddresses] = useState("");
  const [emailSubject, setEmailSubject] = useState(""); // 件名用のステート

  const sendEmail = async () => {
    const sendMail = httpsCallable(functions, "sendBulkEmail");
    try {
      const result = await sendMail({
        subject: emailSubject, // 件名を追加
        content: emailContent,
        recipients: emailAddresses.split(",").map((email) => email.trim()),
      });
      console.log("Result:", result);
      alert("Email sent successfully!");
    } catch (error) {
      console.error("Error sending email:", error);
      alert("Failed to send email.");
    }
  };

  return (
    <div className="EmailForm-container">
      <div className="content">
        <div className="title">
          <h1>メール送信</h1>
        </div>
        <div className="subject">
          <label htmlFor="subject">件名</label>
          <input
            type="text"
            id="subject"
            value={emailSubject}
            onChange={(e) => setEmailSubject(e.target.value)}
            placeholder="Enter email subject"
          />
        </div>
        <div className="emailaddress">
          <label htmlFor="emailAddresses">Email Address</label>
          <input
            type="text"
            id="emailAddresses"
            value={emailAddresses}
            onChange={(e) => setEmailAddresses(e.target.value)}
            placeholder="Enter email addresses separated by commas"
          />
        </div>
        <div className="text">
          <label htmlFor="emailContent">内容</label>
          <textarea
            id="emailContent"
            value={emailContent}
            onChange={(e) => setEmailContent(e.target.value)}
            placeholder="Enter email content here..."
          />
        </div>
        <button onClick={sendEmail}>Send Email</button>
      </div>
    </div>
  );
}

export default App;

App.cssの設定

App.css
/* 全体のコンテナ */
.EmailForm-container {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  background-color: #f0f4f8;
  font-family: "Arial", sans-serif;
}

/* 内部のコンテンツ */
.EmailForm-container .content {
  background-color: #fff;
  padding: 30px;
  border-radius: 8px;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
  max-width: 500px;
  width: 100%;
}

/* タイトル */
.EmailForm-container .content .title h1 {
  font-size: 24px;
  margin-bottom: 20px;
  color: #333;
  text-align: center;
}

/* ラベル */
.EmailForm-container .content .subject label,
.EmailForm-container .content .emailaddress label,
.EmailForm-container .content .text label {
  font-size: 22px;
  font-weight: bold;
  color: #555;
  margin-bottom: 5px;
  display: block;
}

/* 入力フィールド */
.EmailForm-container .content .subject input,
.EmailForm-container .content .emailaddress input,
.EmailForm-container .content .text textarea {
  width: 100%;
  padding: 10px;
  margin-bottom: 15px;
  border-radius: 4px;
  border: 1px solid #ccc;
  font-size: 16px;
}

/* テキストエリアのスタイル */
.EmailForm-container .content .text textarea {
  height: 100px;
  resize: none;
}

/* ボタンのスタイル */
.EmailForm-container .content button {
  width: 100%;
  padding: 12px;
  border: none;
  border-radius: 4px;
  background-color: #007bff;
  color: #fff;
  font-size: 16px;
  cursor: pointer;
  transition: background-color 0.3s ease;
}

.EmailForm-container .content button:hover {
  background-color: #0056b3;
}

### バックエンドのセットアップ
バックエンドは、同一アプリの中のfunctionsフォルダに作成します。
今回の場合、firebase-email-sender/functionフォルダの中です。
まず、Nodemailerをインストールします。

ターミナル
cd functions
npm install nodemailer

メール送信用のCloud Functionの作成:

アプリの中に存在するfunctions/index.js ファイルを編集します

index.jp
require("dotenv").config();
const functions = require("firebase-functions");
const nodemailer = require("nodemailer");

// メール送信者の設定
const transporter = nodemailer.createTransport({
  service: "gmail", // Gmailを使用する場合
  auth: {
    user: process.env.EMAIL_USER, // .env ファイルから環境変数を読み込む
    pass: process.env.EMAIL_PASS, // 送信者のメールアカウントのパスワード
  },
});

exports.sendBulkEmail = functions.https.onCall((data, context) => {
  const mailOptions = {
    from: "your-email@gmail.com", // 差出人のメールアドレス
    to: data.recipients.join(", "), // 受信者のメールアドレス
    subject: data.subject, // クライアントから送信された件名を使用
    text: data.content, // クライアントから送信された本文を使用
  };

  return transporter
    .sendMail(mailOptions)
    .then((info) => {
      return { success: true, messageId: info.messageId };
    })
    .catch((error) => {
      throw new functions.https.HttpsError("internal", error.message);
    });
});

###.envファイルの作成
functionsファイルの直下に設ける。
パスワードはアプリ用のものを入手する必要があります。

.env
EMAIL_USER=********@gmail.com
EMAIL_PASS=****************


### メールアドレスを環境変数を設定しているので、functionsにdotenvモジュールをインストールする。
```:ターミナル
cd functions
npm install dotenv

アプリのHostingを実施

ターミナル
npm run build
firebase deploy --only hosting

Firebase Functionsのデプロイ:

全てではなく、functionsだけをデプロイします。

ターミナル
firebase deploy --only functions
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?