본문 바로가기
ETC/Python

Python을 이용해서 Email 보내기

by Guardy 2020. 7. 23.
728x90

Python을 이용해서 Gmail을 보내는 프로그램을 작성하려고 한다.

우선 자동화 메일을 위해서는 IAMP를 설정해야 한다.

Gmail 로그인 후 톱니바퀴를 누른뒤 모든 설정 보기를 눌러준다.

그 다음 전달 및 POP/IMAP 아래에 IMAP 액세스를 사용안함에서 사용으로 바꿔준다.

여기까지 완료하였다면 이제 프로그래밍을 진행하면 된다.

import os , re
from email.mime.text import MIMEText
import smtplib
import codecs

def sendemail(gmail,gmail_pw,receive_email,text):
    email_msg = MIMEMultipart('SendMail')
    email_msg['Subject'] = "test"
    email_msg['From'] = gmail
    email_msg['To'] = gmail_pw
    MIME_text = MIMEText(text)
    email_msg.attach(MIME_text)

    with smtplib.SMTP_SSL("smtp.gmail.com") as server:
        server.login(login, password)
        server.sendmail(gmail,
                        receive_email,
                        email_msg.as_string())
    print('Email sent successfully') 

if __name__ == "__main__":
    gmail = ""
    gmail_pw = ""
    receive_email=""
    text = ""
    sendemail(gmail,gmail_pw,receive_email,text)

다음은 이메일을 보내는 완성코드이다.

gmail, gmail_pw, receive_email, text에 채워주면 된다.

프로그램을 실행시켰더니 다음과 같이 뜬다.

내가 만들었지만 구글입장에서는 타사앱

해킹에 잘 대응해놓은 것 같다. 찾아보니 앱을 등록하고 OAuth인증을 해야한다.

다음 주소로 이동하여 Oauth 클라이언트를 받아주어야 한다.

https://console.developers.google.com/

만든 뒤에 다운받아서 코드를 사용하면 된다.

 

완성된 코드는 다음과 같다.

import os , re
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
import codecs
import pickle
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient import errors
from googleapiclient.discovery import build

def get_service():
    # If modifying these scopes, delete the file token.pickle.
    SCOPES = [
        'https://www.googleapis.com/auth/gmail.readonly',
        'https://www.googleapis.com/auth/gmail.send',
    ]

    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(
                'email.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)
    return service

def sendemail(gmail,gmail_pw,receive_email,text):
    email_msg = MIMEMultipart('SendMail')
    email_msg['Subject'] = "test"
    email_msg['From'] = gmail
    email_msg['To'] = gmail_pw
    MIME_text = MIMEText(text)
    email_msg.attach(MIME_text)

    with smtplib.SMTP_SSL("smtp.gmail.com") as server:
        server.login(gmail, gmail_pw)
        server.sendmail(gmail,
                        receive_email,
                        email_msg.as_string())
    print('Email sent successfully') 

if __name__ == "__main__":
    get_service()
    gmail = ""
    gmail_pw = ""
    receive_email=""
    text = ""
    sendemail(gmail,gmail_pw,receive_email,text)
728x90