gmailからメールを送信する方法について記載
Node ver
v14.18.2
1.プロジェクトを作成
GCPにログインして適当なプロジェクトを作成、
2.GmailAPIの有効化
APIのライブラリを開いてGmailAPIを有効化する
https://console.cloud.google.com/apis/library
3.認証情報を作成
認証情報画面を開く
https://console.cloud.google.com/apis/api/gmail.googleapis.com/
「+認証情報を作成」をクリック
「同意画面を設定を クリック」
User Type:外部を選択し、作成ボタンを押す
アプリ登録の編集画面で各情報を入力
スコープを追加または削除から、
「.../auth/gmail.send」を選択し、追加、保存
4.認証情報を作成 OAuth クライアント ID
認証情報を作成、からOAuth クライアント IDを作成する
以下のように選択
アプリケーション:デスクトップアプリ
名前:任意
クライアントを 作成したら、ポップアップ画面左下、
「JSONをダウンロード」からcredencialをダウンロードする、名前をcredentials.jsonにしておく
5.ローカル環境でソースコードを作成
Nodejsに以下のパッケージをインストール
npm install googleapis nodemailer
以下のコードを実行
setSendMail()の箇所は送る内容を書き換えてください。
credentials.jsonは上記で作成したクライアント IDのjson、
token.jsonは認証が通ると生成されます。
const MailComposer = require('nodemailer/lib/mail-composer');
const { Buffer } = require('node:buffer');
const fs = require('fs').promises;
const path = require('path');
const process = require('process');
const {authenticate} = require('@google-cloud/local-auth');
const {google} = require('googleapis');
const credentials = require ( "./credentials.json" );
const tokens = require ( "./_token.json" );
const SCOPES = [
'https://www.googleapis.com/auth/gmail.send'
];
const TOKEN_PATH = path.join(process.cwd(), 'token.json');
const CREDENTIALS_PATH = path.join(process.cwd(), 'credentials.json');
async function loadSavedCredentialsIfExist() {
try {
const content = await fs.readFile(TOKEN_PATH);
const credentials = JSON.parse(content);
return google.auth.fromJSON(credentials);
} catch (err) {
return null;
}
}
async function saveCredentials(client) {
const content = await fs.readFile(CREDENTIALS_PATH);
const keys = JSON.parse(content);
const key = keys.installed || keys.web;
const payload = JSON.stringify({
type: 'authorized_user',
client_id: key.client_id,
client_secret: key.client_secret,
refresh_token: client.credentials.refresh_token,
});
await fs.writeFile(TOKEN_PATH, payload);
}
async function authorize() {
let client = await loadSavedCredentialsIfExist();
if (client) {
return client;
}
client = await authenticate({
scopes: SCOPES,
keyfilePath: CREDENTIALS_PATH,
});
if (client.credentials) {
await saveCredentials(client);
}
return client;
}
async function createMail(subject, to, text){
const mail = await new MailComposer({
to,
text,
subject,
textEncoding: "base64",
}).compile().build()
const raw = Buffer.from(mail)
.toString("base64")
.replace(/\+/g, "-")
.replace(/\//g, "_")
.replace(/=+$/, "")
return raw
}
function setSendMail(auth) {
const gmail = google.gmail({version: 'v1', auth});
sendMail(gmail,
"題名",
"test_taro@gmail.com",
"本文")
}
async function sendMail (gmail,subject, to, text){
const raw = await createMail(subject, to, text)
await gmail.users.messages.send({
userId: "me",
requestBody: {
raw,
},
})
}
authorize().then(setSendMail).catch(console.error);
以上