Python 자동화 이메일 사용 방법

사진은 Webaroo 에서 Unsplash
Python으로 일상적인 작업을 자동화하는 것은 매우 쉽다.API와 이해하기 쉬운 라이브러리의 조합으로 사이트를 캡처하고 이메일을 보내며 데이터를 관리하고 분석할 수 있는 시스템을 쉽게 설정할 수 있습니다.
기업계에서 자동화가 필요한 매우 흔히 볼 수 있는 임무는 공공 정부의 데이터를 긁어내는 능력이다.이것은 통상적으로 데이터 등 사이트에서 온다.gov와 기타 단점은 의료 보건, 무역, 운송, 법률 등 분야의 정보를 얻기 위한 것이다.
실제로 많은 정부 기구 사이트들이 숨겨져 있다. 그들은 여전히 대량의 가치 있는 데이터를 생성하고 있으며, 수십억 달러의 회사들은 이 데이터에 의존하여 수백만 달러의 결정을 내리고 있다.
본고에서, 우리는 파이썬 스크립트를 어떻게 작성하는지 개괄할 것이다. 이 스크립트는 특정한 정부 데이터 세트를 다운로드하여 전자메일에 올리고 원하는 사람에게 보낼 수 있다.
그러면 Gmail APIPython Requests library와 Gmail API를 쉽게 사용할 수 있습니다.따라서 Python을 사용하여 미래의 전자메일을 자동화하기를 원한다면 이것은 좋은 출발점이다.

Python으로 파일 다운로드


첫 번째 단계에서는 HTTP를 사용하여 실제 데이터 파일 다운로드를 요청해야 합니다.
Python의 장점은 HTTP 요청 작성 등 코드의 복잡성을 없애는 데 있다.반대로 요청 라이브러리를 가져와서 요청을 발표하고 가져올 수 있습니다.
이런 상황에서 우리가 다운로드할 파일은 심지어 아래의 링크에 간단한 종점이 있다.따라서 사용할 필요가 없습니다 library like Selenium to try to click a download button.
다운로드 버튼이 있더라도 URL이 첨부되어 있는지 확인해야 합니다.일반적으로 URL이 있다면 검색 단추를 만드는 인터넷 파충류보다 링크를 사용하여 다운로드하는 것이 훨씬 쉽다.
https://data.medicaid.gov/api/views/u72p-j37s/rows.json?accessType=DOWNLOAD
이 문서는 의료 보조와 개인 보험 가입자에 대한 정보를 제공했다.이것은 내부 데이터와 연결시켜 시장을 더욱 잘 이해하는 의료 공급업체에 매우 가치가 있다.
그것을 다운로드하기 위해서 우리는 함수 requests.get()를 사용할 것이다.이렇게 하면 HTTP 요청을 사용하여 지정된 URL로 데이터를 끌어다 놓을 수 있습니다.
예를 들어, 다음 스크립트를 볼 수 있습니다.
# Part 1: Fetch the data.

# Get the webpage, store it in a Response object and assign the text
# About: https://requests.readthedocs.io/en/master/api/#requests.Response

# This URL contains the .csv download of
# 'https://catalog.data.gov/dataset/' \
#   'share-of-medicaid-enrollees-in-managed-care'
# used to send to the destination e-mail.
csvFileURL = 'https://data.medicaid.gov/api/' \
    'views/u72p-j37s/rows.csv?accessType=DOWNLOAD'
csvFileRequest = requests.get(csvFileURL)
csvFile = csvFileRequest.content
이것은 짧고 달콤합니다. 현재 변수로 설정된 요청의 일부로 CSV를 되돌려줍니다.잠시 후에 우리는 전자메일을 구축할 때 그것을 사용할 것이다.하지만 이제 Gmail API에 대한 자격 증명을 설정해야 합니다.

Gmail API 설정


구글은 API를 쉽게 설정할 수 있게 해 준다.너는 갈 수 있다Google API console.여기서 API 및 서비스 사용을 선택하고 Gmail API를 검색할 수 있습니다.
API 콘솔은 다음 그림과 같습니다.

이 버튼을 클릭하면 다양한 API를 검색할 수 있는 검색 엔진이 표시됩니다.다음 그림과 같습니다.
너는 Gmail을 입력할 수 있다. 그것은 유일하게 나타날 것이다.

그리고 Gmail API를 선택할 수 있습니다. 그 옆에 활성화 단추가 있습니다.

Gmail API에서 ENABLE(사용)을 클릭하면 자격 증명을 다운로드하거나 API 키 및 암호를 사용할 수 있습니다.
저희 코드는 JSON으로 다운로드되지만, 마음에 드시면 픽업으로 변환할 수 있습니다.

이 모든 것이 설정되어 있습니다. 우리는 지금 당신의 기능을 구축하여 설정한 후에 자동으로 당신의 전자메일을 보낼 수 있습니다.

Gmail API를 사용하여 이메일 보내기


현재 우리는 이미 이 데이터를 추출하는 방법을 찾았으니, 우리는 어떻게 실제적으로 전자메일을 보내는지 확실히 알아야 한다.
이를 위해 우리는 email 라이브러리를 사용할 것이다.이 라이브러리는 전자 우편의 각 부분을 설정할 것입니다. 보내는 사람, 받는 사람, 테마 등입니다.
우리는 이 점을 실현하기 위해 이메일의 [MIMEBase](https://docs.python.org/2/library/email.mime.html) 클래스를 사용합니다. 이것은 정확한 데이터 포인트를 설정하는 것을 매우 쉽게 하고 Gmail API에 간단한 클래스를 제공하여 장래에 해석할 수 있도록 합니다.
클래스 MIMEBase 를 사용하는 것은 매우 간단합니다. 새 클래스를 초기화하고 필요한 많은 구성 요소를 참조할 수 있기 때문입니다. 예를 들어 다음과 같습니다.
# Function required for Part 2: Send e-mail with Google API.
# a) Create the message
def create_message(sender, to, subject, csv):
    #message = MIMEMultipart()
    message = MIMEMultipart()
    message['from'] = sender
    message['to'] = to
    message['subject'] = subject

    # Send the time it was updated as the body of the e-mail
    dt_object = datetime.utcnow() - timedelta(hours = 7)
    msg = MIMEText('Hi! Your file was updated.' \
        '\nTime of update: ' + dt_object.strftime('%m/%d/%Y, %I:%M:%S %p') \
        + ' (Los Angeles Time)')

    message.attach(msg)

    # Attach the .csv file
    record = MIMEBase('application', 'octet-stream')
    # print(csv)
    record.set_payload(csv)
    encoders.encode_base64(record)
    record.add_header('Content-Disposition', 'attachment', filename='medicare.csv')
    message.attach(record)

    # Return the message
    raw = base64.urlsafe_b64encode(message.as_bytes())
    raw = raw.decode()
    return {'raw': raw}
메시지 ['from]= [email protected]
아래에 이 매개 변수의 전체 함수를 설정할 수 있습니다.
마지막으로 우리는 함수urlsafe_b64encode를 사용했다는 것을 알게 될 것이다.이것은 메시지를 바이트로 설정합니다.이는 이메일 데이터를 Gmail API로 쉽게 전송하는 데 사용됩니다.그래서 쉽게 전해져요.
이제 드디어 첫 번째 자동 이메일을 보낼 때가 되었다.

Python을 사용하여 첫 번째 자동 전자 메일 보내기


이제 Gmail API 자격 증명을 설정하여 첫 번째 이메일을 보낼 수 있습니다.
Gmail API 및 자격 증명에 설정된 서비스 변수를 사용합니다.
이것은 함수send_message에 표시됩니다.
# b) Send the message
def send_message(service, user_id, message):
    try:
        message = service.users().messages(). \
        send(userId=user_id, body=message).execute()
        print('Message Id: %s' % message['id'])
        return message
    except Exception as e:
        print('An error occurred: %s' % e)
        return None
여기서부터 우리가 해야 할 일은 소식을 전하고 실행하는 것이다.
이로써 우리는 첫 번째 이메일을 보냈다.
전체 스크립트는 아래의 코드처럼 보인다.
# 1. Pull data from a URL whenever there is a new data set.
# 2. Send an e-mail using Google API

# Pre-requisites:
# 1) Create a project at the Google API console at the top-left of GDC
# 2) Enable Gmail API by clicking 'Library' on the left sidebar
# 3) Create OAuth client ID credentials at the top sidebar
# 4) Quickstart guide for Python in URL (see below)
# 5) pip install --upgrade google-api-python-client \
# google-auth-httplib2 google-auth-oauthlib
# 6) Access to Gmail
# 7) Create the e-mail

# Download a text file with the last updated date, or even data!
# If different, send an e-mail.

# Google API required modules
from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

# Ability to download the page
# Also, the ability to read files without downloading them
# allowing us to check for real-time updates.
import requests

# Ability to run a loop using the time module
import time

# Ability to convert a time value to a datetime object
from datetime import datetime, timedelta
import math

# Ability to create the e-mail
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import base64
import os

# If modifying these scopes, delete the file token.pickle.
# You need this scope in particular for full access to Google Mail API.
SCOPES = 'https://mail.google.com/'

# Function required for Part 2: Send e-mail with Google API.
# a) Create the message
def create_message(sender, to, subject, csv):
    #message = MIMEMultipart()
    message = MIMEMultipart()
    message['from'] = sender
    message['to'] = to
    message['subject'] = subject

    # Send the time it was updated as the body of the e-mail
    dt_object = datetime.utcnow() - timedelta(hours = 7)
    msg = MIMEText('Hi! Your file was updated.' \
        '\nTime of update: ' + dt_object.strftime('%m/%d/%Y, %I:%M:%S %p') \
        + ' (Los Angeles Time)')

    message.attach(msg)

    # Attach the .csv file
    record = MIMEBase('application', 'octet-stream')
    # print(csv)
    record.set_payload(csv)
    encoders.encode_base64(record)
    record.add_header('Content-Disposition', 'attachment', filename='medicare.csv')
    message.attach(record)

    # Return the message
    raw = base64.urlsafe_b64encode(message.as_bytes())
    raw = raw.decode()
    return {'raw': raw}

# b) Send the message
def send_message(service, user_id, message):
    try:
        message = service.users().messages(). \
        send(userId=user_id, body=message).execute()
        print('Message Id: %s' % message['id'])
        return message
    except Exception as e:
        print('An error occurred: %s' % e)
        return None


# Part 1: Fetch the data.

# Get the webpage, store it in a Response object and assign the text
# About: https://requests.readthedocs.io/en/master/api/#requests.Response

# This URL contains the .csv download of
# 'https://catalog.data.gov/dataset/' \
#   'share-of-medicaid-enrollees-in-managed-care'
# used to send to the destination e-mail.
csvFileURL = 'https://data.medicaid.gov/api/' \
    'views/u72p-j37s/rows.csv?accessType=DOWNLOAD'
csvFileRequest = requests.get(csvFileURL)
csvFile = csvFileRequest.content

# COMMENTED OUT: The below is necessary if file is not .csv.
# Now we add the important SEP metadata command.
# This tells Excel to use a delimiter.
#decoded = csvFile.decode('utf-8')
#decoded = 'SEP=,\n' + decoded
#csvFile = decoded.encode('utf-8')

# This URL contains the .json download of
# 'https://catalog.data.gov/dataset/' \
#   'share-of-medicaid-enrollees-in-managed-care'
# used to compare files.
jsonOfFile = 'https://data.medicaid.gov/api/views/u72p-j37s/' \
    'rows.json?accessType=DOWNLOAD'

r = requests.get(jsonOfFile)
firstJSON = r.text

# Part 2: Use the Google API to send an e-mail with the updated metadata

# Find out whether the file was changed or not.
# Originally it checked for the last updated date,
# but it then occurred to me that there could be
# multiple changes made in one day.
# Old code: print(BeautifulSoup(URL, 'html.parser). \
# find_all('td')[0].get_text())
# returns the last updated date based on the current site's layout.

# Now, the new code compares the .json version of the files every minute.

# This will run the code every 60 seconds (except for the first iteration)
# instead of time.sleep(60) which only runs the loop every 60 seconds.
# In the latter case, the code may take some time "x" to finish executing
# so your total time would have been 60 + x seconds (bad).

r = requests.get(jsonOfFile)
secondJSON = r.text

# If the site was updated or the script just began, send the message.
if firstJSON != secondJSON:

    # Create the message
    sender = '[email protected]'
    to = '[email protected]'
    subject = 'The Medicare metadata has been updated'
    message = create_message(sender, to, subject, csvFile)

    # Send the message using the Google API
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('gmail', 'v1', credentials=creds)
    send_message(service, sender, message)

    # Update the variable
    firstJSON = secondJSON

    print('Message sent')

자동화 시작 시간


이 스크립트는 Python을 사용하여 미래의 전자 메일을 자동으로 처리하고 검색하는 데 도움을 줄 수 있기를 바랍니다 other tasks you can automate.
위의 예에서, 우리는 수동으로 이 스크립트를 스케줄링한다.그러나 미래에 더 많은 자동화를 실현하고 싶다면effectively, you could use a framework like Airflow.그리고 이 스크립트를 수동으로 실행하지 않고 매일 실행할 수 있습니다.
우리는 당신의 자동화 프레임워크를 구축하는 것을 건의하지 않습니다. 특히 이렇게 좋은 옵션이 많을 때.이것이 바로 우리가 대본만 보여주는 이유다.
그것 이 있으면, 행운 을 빌고, 즐거운 자동 운전 을 하세요!
데이터 과학이나 클라우드 컴퓨팅에 대한 더 많은 정보를 알고 싶으면 아래를 누르십시오.
Kafka Vs RabbitMQ
Data Engineering 101: Writing Your First Pipeline
Data Engineering 101: An Introduction To Data Engineering
What Are The Different Kinds Of Cloud Computing
4 Simple Python Ideas To Automate Your Workflow
4 Must Have Skills For Data Scientists
SQL Best Practices --- Designing An ETL Video
5 Great Libraries To Manage Big Data With Python
Joining Data in DynamoDB and S3 for Live Ad Hoc Analysis

좋은 웹페이지 즐겨찾기