1
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?

More than 1 year has passed since last update.

【目指せ完走賞】なりかくんのDiscordAdvent Calendar 2022

Day 18

【18日目】Discordでメールを受け取る

Last updated at Posted at 2022-12-17

はじめに

こんにちは、なりかくんです。
今回は、Discord内でメールを受け取れるようにしてみたいと思います。

どうやってメールを受信するのか

今回はNode.jsで製作したいと思います。Node.jsにはメールを受信(IMAPクライアント)のライブラリが複数個存在します。その中でも私は、inboxというライブラリを使いました。
非常にシンプルである程度ドキュメントがあるためおすすめできます。

ドキュメントにあるサンプルコードをいろいろ合わせて以下のようなコードを作ると新着メールを受信できます。
このコードでは、新着メールを受け取るとそのメールのタイトルを表示するプログラムです。

const inbox = require("inbox");
 
let client = inbox.createConnection(false, "メールサーバーのアドレス(IMAP)", {
    secureConnection: true,
    auth:{
        user: "ユーザー名",
        pass: "パスワード"
    }
});
 
client.connect();
 
client.on("connect", function(){
    client.openMailbox("INBOX", function(error, info){
        if(error) throw error;
        console.log("Successfully connected to server");
    });
});

client.on("new", function(message){
    console.log("New incoming message " + message.title);
});

メールのソースを分析する

次にメールのソースからメッセージ内容などを分析します。これもライブラリを利用します。
今回は、mailpaserというライブラリを利用しました。

以下のようなコードでメールのソースを解析できます。

const { simpleParser } = require("mailparser");

let mailParse = await simpleParser(メールのソース);
let mailBody = mailParse.text;
let mailTitle = mailParse.subject;
let from = mailParse.from.text;
let to = mailParse.to.text;
let messageId = mailParse.messageId;

受信したメールのUIDからソースを取得

では、受信したメールのUIDからソースを取得するコードを作ってみましょう。
以下のようなコードでUIDからメール内容を取得できます。(ついでにさっきのパースも行います。)
createMessageStreamで内容を取得します。

mailClient.on("new", async function(message) {
    let mailSource = mailClient.createMessageStream(message.UID);
    let mailParse = await simpleParser(mailSource);
    console.log(mailParse);
});

すべてを組み合わせてDiscordに送ってみよう

では、すべてを組み合わせてDiscordに送信するプログラムを作ってみます。今回は、WebHookで通知するようにします。
メールを受信した際に送信するコードは以下のようになりました。メールの内容が長すぎるとDiscord APIに引っかかるので1900文字以内になるように切り取っています。

mailClient.on("new", async function(message) {
    let mailSource = mailClient.createMessageStream(message.UID);
    let mailParse = await simpleParser(mailSource);
    let mailBody = mailParse.text || "本文なし";
    let mailTitle = mailParse.subject || "件名なし";
    let from = mailParse.from.text;
    let to = mailParse.to.text;
    let messageId = mailParse.messageId;
    await getRequest({
        url: "WebHookのURL",
        headers: {
            'Accept': 'application/json',
            'Content-type': 'application/json',
        },
        method: "POST",
        json: {
            embeds: [{
                title: mailTitle,
                author: {
                    name: from
                },
                footer: {
                    text: to
                },
                description: `\`\`\`\n${String(mailBody).substring(0, 1900)}\n\`\`\``
            }],
            username: messageId
        }
    });
});

実際に動かしてみる

では、実際に動かしてみます。試しにメールを送信してみます。
image.png

すると、以下のように指定したWebHookチャンネルにメールの通知が届きます。
image.png

最後に

受信してみた感じ、ほぼリアルタイムだったのでこれはいろいろなところで使えそうだと思いました。
また、今回はWebHookで製作しましたがこれをBot化してスレッド等を活用してDiscordサーバー一つを丸々メールボックスにしてみたり、送信機能等をつけてみると面白そうですね。

以上です、最後までお読みいただきありがとうございました。

今回制作したコードを載せておきます。ぜひ参考にしてみてください。

discordmail.js
var inbox = require('inbox');
const { simpleParser } = require("mailparser");
const request = require("request");

var mailClient = inbox.createConnection(false, "メールサーバーのアドレス(IMAP)", {
    secureConnection: true,
    auth:{
        user: "ユーザー名",
        pass: "パスワード"
    }
});

mailClient.on("connect", function() {
    mailClient.openMailbox("INBOX", async function(err, info) {
        if (err) {
            console.error(err);
        }
        console.log("メールサーバーに接続しました。");
    });
});

mailClient.on("new", async function(message) {
    let mailSource = mailClient.createMessageStream(message.UID);
    let mailParse = await simpleParser(mailSource);
    let mailBody = mailParse.text || "本文なし";
    let mailTitle = mailParse.subject || "件名なし";
    let from = mailParse.from.text;
    let to = mailParse.to.text;
    let messageId = mailParse.messageId;
    await getRequest({
        url: "WebHookのURL",
        headers: {
            'Accept': 'application/json',
            'Content-type': 'application/json',
        },
        method: "POST",
        json: {
            embeds: [{
                title: mailTitle,
                author: {
                    name: from
                },
                footer: {
                    text: to
                },
                description: `\`\`\`\n${String(mailBody).substring(0, 1900)}\n\`\`\``
            }],
            username: messageId
        }
    });
});

mailClient.connect();

function getRequest(option) {
    return new Promise((resolve, reject) => {
        request(option, function (error, response, body) {
            if (error) {
                reject(error);
            } else {
                resolve(body);
            }
        });
    });
}
1
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
1
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?