Ich habe einen Zeilenbot erstellt, der Python verwendet, um ungelesene E-Mails aus Google Mail abzurufen!

Zweck

Erhalten Sie mit Line Bot E-Mails von Google Mail und senden Sie ungelesene Nachrichten an den Absender und Betreff von Line.

Entwicklungsumgebung

Referenz

Überprüfen Sie Google Mail-E-Mails mit Python

Quellcode

main.py


from flask import Flask, request, abort
 
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, LocationMessage, VideoMessage,
    FollowEvent, UnfollowEvent, PostbackEvent, TemplateSendMessage,
    ButtonsTemplate, CarouselTemplate, CarouselColumn, PostbackTemplateAction
)
from linebot.exceptions import LineBotApiError

import os
import json
import sys
import re

import Gmail 
 
app = Flask(__name__)

YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']
 
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)
 
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    text = event.message.text
    user_id = event.source.user_id
    if 'Email' in text:
      mail = Gmail.GmailAPI()
      # get the reply message
      messages = mail.process_message()
      # reply
      line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=str(messages))
        )

if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

Wenn der Bot eine Nachricht mit der Zeichenfolge "mail" empfängt, ruft er die ungelesene Nachricht aus Google Mail ab und antwortet darauf.

Gmail.py


from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools

class GmailAPI:
    def __init__(self):
        # If modifying these scopes, delete the file token.json.
        self._SCOPES = 'https://www.googleapis.com/auth/gmail.readonly'

    def ConnectGmail(self):
        store = file.Storage('token.json')
        creds = store.get()
        if not creds or creds.invalid:
            flow = client.flow_from_clientsecrets('credentials.json', self._SCOPES)
            creds = tools.run_flow(flow, store)
        service = build('gmail', 'v1', http=creds.authorize(Http()))

        return service

    def GetMessageList(self):

        # connect to API
        service = self.ConnectGmail()

        MessageList = []

        query = 'is:unread'

        # get all the messages (maximum=20)
        messageIDlist = service.users().messages().list(userId='me',maxResults=20,q=query).execute()

        # if no messages, stop return error
        if messageIDlist['resultSizeEstimate'] == 0: 
            return 'error'
        # Get information about the mails
        for message in messageIDlist['messages']:
            row = {}
            MessageDetail = service.users().messages().get(userId='me',id=message['id']).execute()
            for header in MessageDetail['payload']['headers']:
                # get the senders of the messages
                if header['name'] == 'From':
                    row['from'] = header['value']
                # get the subject of the messages
                elif header['name'] == 'Subject':
                    row['subject'] = header['value']
            MessageList.append(row)
        return MessageList

    def process_message(self):
        messagelist = self.GetMessageList()
        # If there is no messages new, reply 'No message'
        if messagelist == 'error':
            reply = 'No message'
            return reply 

        # make reply message
        reply = ''
        for mlist in messagelist:
            from_name = mlist['from'].split('<')[0] + ':'
            sub = '「' + mlist['subject'] + '」'
            message = '{}\n{}'.format(from_name, sub)
            reply += message 
            reply += '\n\n'
        return reply

GetMessageList verwendet die Google Mail-API, um den Absender und den Betreff ungelesener E-Mails abzurufen, und process_message konvertiert sie beim Antworten in eine Zeichenfolge und gibt sie zurück.

Ergebnis

Screenshot_20200531-181629905 (1)_1.jpg Ich habe den Namen des Absenders gelöscht, aber ich konnte den Namen und den Titel erhalten und antworten!

Über die Zukunft

Ich möchte die folgenden zwei in Zukunft implementieren.

Recommended Posts

Ich habe einen Zeilenbot erstellt, der Python verwendet, um ungelesene E-Mails aus Google Mail abzurufen!
[Python] Ich habe einen Line-Bot erstellt, der zufällig nach englischen Wörtern fragt
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
[Python] Ich habe einen LINE-Bot erstellt, der Gesichter erkennt und Mosaikverarbeitungen durchführt.
In Python habe ich einen LINE-Bot erstellt, der Polleninformationen aus Standortinformationen sendet.
Ich möchte eine Nachricht von Python an LINE Bot senden
[Python] Ich habe einen Dekorateur gemacht, der keinen Nutzen zu haben scheint.
Ich habe eine Webanwendung in Python erstellt, die Markdown in HTML konvertiert
Ich habe in Python einen Discord-Bot erstellt, der übersetzt, wenn er reagiert
Ich habe einen Stempelersatzbot mit Linie gemacht
Ich habe einen LINE Bot mit Serverless Framework erstellt!
Mattermost Bot mit Python gemacht (+ Flask)
[Python] Ich habe einen Bot erstellt, der mir die aktuelle Temperatur anzeigt, wenn ich einen Ortsnamen in LINE eingebe
Ich habe einen LINE BOT erstellt, der mithilfe der Flickr-API ein Bild von Reis-Terroristen zurückgibt
Ich habe einen LINE-Bot erstellt, der jeden Tag pünktlich empfohlene Bilder sendet
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
[AWS] Ich habe BOT mit LINE WORKS daran erinnert
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe mit LINE Bot ein Haushaltsbuch für Bot erstellt
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Ich habe ein Python-Modul erstellt, um Kommentare zu übersetzen
Ich habe eine Python-Bibliothek erstellt, die einen rollierenden Rang hat
Python-Anfänger haben einen Chat-BOT erstellt, also habe ich versucht, zusammenzufassen, wie man es macht
Ich habe einen Python-Text gemacht
Ich habe einen Zwietrachtbot gemacht
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
[Python] Ich habe versucht, LINE BOT die Wettervorhersage beantworten zu lassen
Ich habe Chatbot mit LINE Messaging API und Python erstellt
[AWS] Ich habe BOT mit LINE WORKS (Implementierung) in Erinnerung gerufen.
Erstellt einen Toolsver, der Betriebssystem, Python, Module und Toolversionen an Markdown ausspuckt
Ich habe einen Line-Bot mit Python gemacht!
Ich habe einen Wikipedia Gacha Bot gemacht
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Ich möchte das Wetter mit LINE bot feat.Heroku + Python wissen
Ich habe eine Python-Bibliothek erstellt, um die API von LINE WORKS aufzurufen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich habe einen Twitter-Bot erstellt, der das von #PokemonGO gefangene Pokemon murmelt
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
Ich habe Chatbot mit der LINE Messaging API und Python (2) ~ Server ~ erstellt
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
Ich habe einen Linienbot erstellt, der das Geschlecht und das Alter einer Person anhand des Bildes errät
Ich habe einen verstümmelten Generator erstellt, der Ihre Lieblingssätze von UTF-8 bis Shift-JIS (cp932) in Python codiert
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Ich habe einen Docker-Container erstellt, um JUMAN ++, KNP, Python (für pyKNP) zu verwenden.
Ich habe einen Passwortgenerator erstellt, um Kindern Python3 beizubringen (Bonus) * Vollständig neu erstellt
Da ich zu verschiedenen Zeiten anfing zu arbeiten, machte ich einen Bot, der mir die Zeit sagt, die Arbeit zu verlassen
Python-Anfänger haben beschlossen, einen LINE-Bot mit Flask zu erstellen (Flask-Kommentar)
Ich habe ein Tool zum automatischen Durchsuchen mehrerer Websites mit Selenium (Python) erstellt.
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe Othello dazu gebracht, Kindern Python3 beizubringen (2)