どのようにGmailを介してウェブフックをトリガする電報上のニュースレターの電子メールを取得する方法


おいそこ!
WEB 3世界に深く飛び込み、エコシステムのニュースに追いつこうとしています.

マークコップ

ねえ、パトリック!私はあなたのコンテンツを愛する!任意のWeb 3/ブロック/スマート契約ニュースレターをお勧めしますか?
午後13時55分- 2022年3月17日
しかし、ものは、私は非常に頻繁に私のニュースレターをチェックするために使用されていません.私はそれを習慣にしようとしたが、それはちょうど私のために動作しません.
しかしながら、私が使用しているものは、電報の上で発表とグループチャンネルをチェックしているので、私はそれが私の電報チャットにそれらの電子メールを転送する良い考えであるとわかりました.

正直に言うと、それは私が思ったより難しい方法で終わったが、いくつかのコードと研究で私はこの目標を達成し、あなたとそれを共有したいと思った.

🤖 gmailボットの使用


この電報Gmail Bot それは私がラベルによって新しいメールをフィルタリングし、それらをテレグラムチャットで読めるようにすることを可能にするので、実際には良い解決策でした.

しかし、私はコマンドの間にいくつかの重い遅延を経験したときに、彼らはまったく動作しませんでした.
私はまた、すべての私の電子メールへのアクセスを与えて、むしろフィルタに基づいてそれらを転送したくなかった.

📫 電子メールをIFTTTと転送する


私が念頭に置いた最初のサービスはIFTTT これらのメールを直接電報に転送する.
iFTTTは、簡単にデバイスとサービスの多種多様なリンクのアクションをすることができます自動化ツールです.

それでも、私はこのアプローチを使用する際にいくつかの問題があった

😑 gmailはiftttと互換性がありません


私は私のニュースレターを受け取るためにGmailを使用しているので、自動的にiftttメールに転送する必要があります.
Gmailにフォワードメールアドレスを登録できるようにするにはconfirmation email ターゲット電子メールプロバイダ.
しかし、ユーザーはアクセスできません[email protected] 電子メールので、ソリューションはOutlookなどの別のメールサービスにこれらのメールを転送していた.

🧠 生のHTMLメールは読みにくい


別の電子メールサービスへの転送メールをしてください、そして、iftttに再び彼らを進めることは厄介でした、しかし、それは働きました.
しかし、あなたが想像できるように、それらのクールでカラフルな電子メール加入者は、通常の電子メールとしてちょうどプレーンテキストの代わりにHTMLのものの多くを持っています.
そして、電報はそれを解析することができません.少なくとも生のコンテンツではない.

🎣 iftttでウェブフックへの転送電子メール


それで、解決はパーサーをコーディングして、それから電報ロボットにそれを送ります.
私はすでに、このシステムのために使用しているHerokuにホストされているMicroServiceアプリケーションを持っているが、単純に作成し、明示的な残りのAPIを展開し、代わりにそれを使用することができます.
今すぐiFTTアプレットは、電子メールを取得しているウェブフックをトリガ-私たち自身が主催しています.

上記のイメージで、あなたは私がwebhook.site Webhook URLのURL.あなた自身のアプリケーションではなく、Webhookを使うべきです.サイトサービスは、あなたが期待するリクエストをデバッグするのに非常に役に立ちます.
このiFTTアプレットが動作しますが、いくつかの警告もあります.

🔨 iftttいくつかの行を"ランダム"


IFTT自体が追加されていることを把握するのに時間がかかった\n いくつかの行の文字.多分その線が長すぎたからでしょう.
これは大きな問題ではありませんが、テキストメッセージの中にいくつかの書式設定が壊れているのを見るのはちょっと悲しいことでした.

📜 IFTTは大きなメールを転送できません


今、これは私に選択肢を探すようにしたものでした.The Week in Ethereum ニュースレターメールはかなり大きいです、そして、iftttはちょうどそれを受け取るとき、Webhookを引き起こすことができませんでした.

✅ のメールを転送する


これは現在使用しているソリューションです.私は、人々が他の類似したアプリケーションのためにそれを使いたいならば、IFTTアプローチに言及する価値があると感じました.
私はredditポストにこのサービスでつまずいて、それは完全に私のニーズのために働いた.それだけではなく、OutlookのメールやGmailから直接メールを転送することもできますZoho Email .

Gmailを介してwebhookトリガする簡単な方法


Sep 3 ' 20
トムランナー
私が電子メールを介してウェブフックをトリガするために使用しようとしたサービスは、私が支払うか、または作業を停止したい以上ですautomate.io 最近では)
ここでは、私は多くの調査の後につまずいた単純な解決策です
  • 移動するZoho.com そして、無料の電子メールアドレスのサインアップ
  • 転送を許可するGmailを設定しますzoho.com メール.
  • See Full Post

    📠 HTMLメールの解析


    電子メールが正常に受信できるようになりました、彼らは読みやすくなって、電報ボットに送られなければなりません.
    私は残りのAPIアプリケーションを作成する方法の詳細を入力しません.HTMLをパースして作成する手順にフォーカスしますcompatible to telegram's API .
    以下はHTMLを解析するコードの一部を示します.
    const {decode} = require('html-entities')
    const FilterHTML = require('filterhtml')
    
    //...
    
    async onWebhookTrigger({html}) {
        try {
            const parsedHtml = html
                .replace(/<p[^>]+>(.|\n)*?<\/p>/g, match => '\n' + match.replace(/\n/g, ''))
                .replace(/<li[^>]+>((.|\n)*?)<\/li>/g, (match, p1) => `\n* ${p1.replace(/\n/g, '')}`)
                .replace(/<a([^>]+)><\/a>/g, '')
                .replace(/<a([^>]+)>((.|\n)*?)<\/a>/g, match => match.replace(/\n/g, ''))
                .replace(/<span([^>]+)>((.|\n)*?)<\/span>/g, match => match.replace(/\n/g, ''))
                .replace(/<h1([^>]*)>((.|\n)*?)<\/h1>/g, (match, p1, p2) => `\n<b>${p2.replace(/\n/g, '')}</b>\n`)
                .replace(/<h2([^>]*)>((.|\n)*?)<\/h2>/g, (match, p1, p2) => `\n<b>${p2.replace(/\n/g, '')}</b>\n`)
                .replace(/<h3([^>]*)>((.|\n)*?)<\/h3>/g, (match, p1, p2) => `\n<b>${p2.replace(/\n/g, '')}</b>\n`)
                .replace(/<ul([^>]*)>((.|\n)*?)<\/ul>/g, (match, p1, p2) => `\n${p2}\n`)
                .replace(/<br>/g, '\n')
    
            const filteredHtml = FilterHTML.filter_html(parsedHtml, {
                'a': {
                    'href': 'url'
                },
                'b': {},
                'strong': {},
                'i': {},
                'em': {},
                'u': {},
                's': {},
                'pre': {},
            })
    
            const decodedHtml = decode(filteredHtml)
    
            const text = decodedHtml
                .replace(/<b>\n*<\/b>/g, '')
                .replace(/<a([^>]+)><\/a>/g, '')
                .replace(/\n\s*\n\s*\n/g, '\n\n')
                .replace(/&nbsp;/g, ' ')
                .replace(/\n\n\s*/g, '\n\n')
                .replace(/<(([^<]*)@([^>]*))>/g, '')
    
            // Now you would send "text" to Telegram's Bot API
        } catch (error) {
            console.log(error)
        }
    },
    
    私は最初にタグの中にいくつかの改行を削除し、いくつかのタグを他のタグに変換するいくつかの置換を行っている.
    私も使っているFilterHTML 使用時に電報でサポートされていないタグを削除するにはHTML parse mode .
    それからHTMLエンティティをデコードするhtml-entities いくつかのブラジルポルトガル語ニュースレターで使用されるアクセントなどの特殊文字を復元するには、私は購読しています.
    最後に、空のタグと複数行の区切りを削除するためにいくつかの代替を行います.

    📩 解析された電子メールを電報に送る


    あなたが上記のコードで見ることができるように、私が電報のAPIを誘発する代わりに、私はコメントを加えました.それは私のアプリケーションでは、私は別のマイクロサービスを呼び出している電話の統合を処理します.あなたはそれをチェックすることができますhere .

    マルココップ / ネスト


    個人用マイクロサービスコレクション


    コードでは、単にsendMessage あなたのボットのトークンでエンドポイント.
    このような
    function sendMessage(chat_id, text) {
      return fetch(`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`, {
        method: "POST",
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          chat_id,
          text
        })
      });
    }
    
    あなたはどのように作成し、電報ボットを使用する上で他のチュートリアルを検索する必要があります.

    ✨ ヒントとトリック


    ✂️ 大きなメールの送信複数のメッセージ


    電報はテキストメッセージに4096文字の制限があり、text.substring(0, 4096) ループのようにHTMLタグを開くことができます.それは、電報のAPIにメッセージを送るとき、エラーを投げます.
    // This won't work for HTML parsed messages
    if (text.length >= 4096) {
        for (let i = 0; i < text.length; i+=4096) {
            await this.axios.post('/sendMessage', {
                ...options,
                text: text.substring(i, i+4096)
            })
        }
    } else {
        await this.axios.post('/sendMessage', options)
    }
    
    私の心に来た最善の解決策は、最後の改行文字を使用してメッセージをブロックに分割する再帰的な関数でした.
    async splitAndSend(text, options) {
        const subtext =  text.substring(0, 4096)
        const textSplittedByLineBreak = subtext.split('\n')
        if (textSplittedByLineBreak.length === 1) return
        textSplittedByLineBreak.splice(-1)
        const previousTextBlock = textSplittedByLineBreak.join('\n')
        if (!previousTextBlock) return
        await this.axios.post('/sendMessage', {
            ...options,
            text: previousTextBlock,
            disable_web_page_preview: true
        })
        const remainingText = text.substring(previousTextBlock.length, text.length)
        return this.splitAndSend(remainingText, options)
    },
    
    async sendTextToChatId(text, chatId, parseMode = 'html') {
        try {
            // ...
    
            if (text.length >= 4096) {
                await this.splitAndSend(text, options)
            } else {
                await this.axios.post('/sendMessage', options)
            }
    
            // ...
        } catch (error) {
            this.logger.error(error)
        }
    },
    

    🌐 Ngrokを使ってWebhookをローカルでテストする


    Ngrok あなたのlocalhostサーバーを安全に公開する素晴らしいツールです.
    あなたはローカルでアプリケーションを起動し、自分自身に電子メールを送信するので、どのようにあなたのwebhookによって受信されているチェックすることができますそれを使用することができます.

    🌙 不眠症を使用して


    使いたいかもしれないInsomnia あなたのゾーホーメールを介して同じメールを送信すると、したがって、あなたのwebhookをトリガのマニュアル作業を避けるために.

    🏁 結論


    私はそれがちょうどGmailの電報の統合サービスを使用していたと思うWebhookアプリケーションの開発になった.
    私はこれらの解決策を勉強し、自分自身を開発する楽しみがたくさんあった、私はいつか非開発者のユーザーは、この種の統合を行うには、よりユーザーフレンドリーな方法があることを願っています.
    選択肢はありますか.私に知らせて!