본문 바로가기
코딩 연습/코딩배우기

[Python] 파이썬을 활용한 업무자동화 - 이메일 보내기 받기 연습 코드 정리

by good4me 2021. 7. 9.

goodthings4me.tistory.com

 

[출처] [나도코딩] 파이썬 코딩 무료 강의 (활용편4) - 업무자동화(RPA), 이제는 일하는 척(?)만 하세요 https://youtu.be/exgO1LFl9x8

■ 이메일 환경 설정 - 구글 G메일 설정

#1. Google 계정관리 > 보안 > Google에 로그인 '2단계 인증' 사용으로 전환
#2. 앱 비밀번호 설정 : 앱 선택(메일) > 기기 선택(Windows 컴퓨터)

import smtplib
from account import *  # 계정이 있는 모듈(파일) import
# EMAIL_ADDRESS = 'apaqueen123@gmail.com'
# EMAIL_PASSWORD = '앱 비밀번호 '
from email.message import EmailMessage

### 간단하게 메일 보내는 방법 - 한글 안됨
with smtplib.SMTP('smtp.gmail.com', 587) as smtp:  # smtp 객체 생성
    smtp.ehlo()  # smtp 연결이 잘 수립되는지 확인
    smtp.starttls()  # 모든 내용이 암호화되어 전송
    smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)  # 로그인
    
    subject = 'test mail'  # 메일 제목
    body = 'mail body'  # 메일 본문
    msg = f'Subject: {subject}\n{body}'
    
    # 보내기 smtp.sendmail(From, To, Msg) 발신자, 수신자, 정해진 형식의 메시지
    smtp.sendmail(EMAIL_ADDRESS, 'parkbaeda@gmail.com', msg)
 
 
 ### 메일 보내기 고급
 msg = EmailMessage()  # 객체 생성
# msg['To'] = 'abc123@gmail.com'  # 받는 사람
# msg['To'] = 'abc123@gmail.com, wook123@nate.com, goto123@naver.com'  # 여러 사람
#---- 리스트나 엑셀로 메일을 관리하는 경우
to_list = ['abc123@gmail.com, wook123@nate.com, goo123@naver.com, hajo@yahoo.com']
msg['To'] = ', '.join(to_list)
# msg['Cc'] = 'webmater@naver.com'  # 참조
# msg['Bcc'] = 'secret@daum.net'  # 비밀 참조
msg['Subject'] = '테스트 메일입니다...'  # 제목
msg['From'] = account.EMAIL_ADDRESS  # 보내는 사람
msg.set_content('테스트로 보내는 본문입니다...')  # 본문 내용

## 첨부 파일 같이 보내기 msg.add_attachment()
# MIME TYPE 지정 필요 -  https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
# maintype/subtype --> text/plain image/png  image/jpeg application/pdf application/zip
# application/msword application/vnd.ms-powerpoint application/vnd.ms-excel application/octet-stream

with open('./email/메일홍보_1.png', 'rb') as f:
    msg.add_attachment(f.read(), maintype='image', subtype='png', filename=f.name)
    
with open('./email/메일홍보.pdf', 'rb') as f:
    msg.add_attachment(f.read(), maintype='application', subtype='pdf', filename=f.name)

with open('./email/메일홍보리스트.xlsx', 'rb') as f:
    msg.add_attachment(f.read(), maintype='application', subtype='octet-stream', filename=f.name)
    
with smtplib.SMTP('smtp.gmail.com', 587) as smtp:
    smtp.ehlo()
    smtp.starttls()
    smtp.login(account.EMAIL_ADDRESS, account.EMAIL_PASSWORD)
    smtp.send_message(msg)
    print('발송 완료!')
    
   
### 메일 수신 - imap은 불편, imap-tools 사용 pip install imap-tools
from imap_tools import MailBox

mailbox = MailBox('imap.gmail.com', 993)  # 객체 생성
mailbox.login(EMAIL_ADDRESS, EMAIL_PASSWORD, initial_folder='INBOX')  # INBOX = 받은편지함

# fetch() 하면 전체 메일, limit=1은 한 개 한정, reverse=True는 최근 메일부터(기본은 False)
for msg in mailbox.fetch(limit=1, reverse=True):
    print('제목:', msg.subject)
    print('발신자:', msg.from_)
    print('수신자:', msg.to)
    print('참조자:', msg.cc)
    print('비밀참조자:', msg.bcc)
    print('날짜:', msg.date)
    print('본문:', msg.text)
    print('HTML 메시지:', msg.html)
    print('=' * 50)
    
    # 첨부 파일 가져오기 - 다운로드
    for att in msg.attachments:
        print('첨부파일 이름:', att.filename)
        print('타입:', att.content_type)
        print('크기:', att.size)
        
        # 파일 다운로드
        with open(att.filename, 'wb') as f:
            f.write(att.payload)  # payload는 파일명에 첨부 파일 쓰기
            print(f'첨부 파일 {att.filename} 다운로드 완료!')

mailbox.logout()

 

good4me.co.kr

 

■ 엑셀에서 이메일을 하나씩 불러온 후 홍보 자료 전송해보기

## wooksung_imentor.py

body_content ='''
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div style="background-color:#eee;padding:10px 20px;">
        언택트 시대에 필요한 소프트웨어 및 하드웨어 기반 고급 화상회의 시스템 
        <h1 style="font-family:Georgia, 'Times New Roman', Times, serif;color:blue;font-weight:bold;">'화상회의(원격교육) 솔루션 - iMentor' <span style="font-size:18px">소개</span> </h1>
    </div>
    <div style="padding:20px 20px">
        <div style="width: 900px;">
            <!-- <img src="" style="width: 900px;"> -->
            <div style="text-align:left">
                <h2>▣ 'iMentor'는</h2>
                <ul>
                    <li style="padding: 5px;font-size:16px;">화상회의 전용 하드웨어 코덱(셋톱박스)와 PC, 노트북, 스마트폰 등으로 구성(하이브리드 형태의 화상회의)</li>
                    <li style="padding: 5px;font-size:16px;">화상회의, 원격교육 재택근무 시 PC(또는 노트북) 입력으로 파워포인트, 워드 등의 문서 화면공유 가능</li>
                    <li style="padding: 5px;font-size:16px;">문서카메라로 오프라인 문서(책, 인쇄자료, 수기자료 등)를 양측이 화상으로 동시에 보며 설명할 수 있음</li>
                    <li style="padding: 5px;font-size:16px;">기업의 다자간 회의, 지점(지사) 간 미팅, 대리점(체인점) 교육 및 세미나 등 다양한 분야에서 활용 가능</li>
                    <li style="padding: 5px;font-size:16px;">자세한 사항은 <a href="http://wooksungmedia.com/bbs/content.php?co_id=b1"
                            target="_blank">홈페이지 iMentor 제폼 소개</a> 참조</li>
                </ul>
                <h2>▣ 'iMentor'를 만든 곳은</h2>
                <ul>
                    <li style="padding: 5px;font-size:16px;">ETRI 연구원 창업 기업으로 국내 유일의 전용 화상 장비(H/W코덱 방식) 개발뿐만 아니라</li>
                    <li style="padding: 5px;font-size:16px;">PC/노트북/스마트폰 등의 웹 브라우저로 동시에 접속(SW코덱 방식)할 수 있는</li>
                    <li style="padding: 5px;font-size:16px;">하이브리드형 화상회의(원격교육, 재택근무) 서비스를 제공하는 기업입니다.</li>
                </ul>

                <table style="padding:20px 10px;border-collapse:collapse;border-spacing:0;">
                    <tr><td colspan="2"><hr></td></tr>
                    <tr>
                        <td style="border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:18px;
                    overflow:hidden;padding:10px 15px;word-break:normal;text-align:center;vertical-align:center;">(주)욱성미디어<br />
                            <span style="font-size:14px;text-align:center;"><a href="http://www.wooksungmedia.com" target="_blank">http://www.wooksungmedia.com</a></span>
                        </td>
                        <td style="border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:16px;
                    overflow:hidden;padding:10px 15px;word-break:normal;text-align:left;vertical-align:top;">
                            <span style="font-size:14px">⊙전화문의: 010-2825-1908 / 042-931-5025 / 070-7729-5000</span><br />
                            <span style="font-size:14px">⊙E-mail: pkjuls@wooksungmedia.com</span><br />
                            <span style="font-size:14px">⊙주소: 대전광역시 유성구 테크노2로 340(원플러스 2층)</span><br />
                        </td>
                    </tr>
                </table>
            </div>
        </div>
    </div>
</body>
</html>
'''

홍보 페이지

 

import smtplib
from email.message import EmailMessage
import openpyxl
import time
import random
import account
import wooksung_imentor


def email_sender(email, cnt):
    result = ''
    try:
        msg = EmailMessage()  # 객체 생성
        msg['To'] = email
        msg['Subject'] = '화상회의(원격교육) 솔루션 - iMentor 소개'
        msg['From'] = account.EMAIL_ADDRESS
        
        ### 본문 내용 작성 방법 ----------------------------------------
        ## 1.직접 작성
        # body_content = '''
        # 언택트 시대에 필요한 소프트웨어 및 하드웨어 기반 고급 화상회의 시스템 
        # '화상회의(원격교육) 솔루션 - iMentor' 소개
        # ▣ 'iMentor'는
        # - 화상회의 전용 하드웨어 코덱(셋톱박스)와 PC, 노트북, 스마트폰 등으로 구성(하이브리드 형태의 화상회의)
        # - 화상회의, 원격교육 재택근무 시 PC(또는 노트북) 입력으로 파워포인트, 워드 등의 문서 화면공유 가능
        # - 문서카메라로 오프라인 문서(책, 인쇄자료, 수기자료 등)를 양측이 화상으로 동시에 보며 설명할 수 있음
        # - 기업의 다자간 회의, 지점(지사) 간 미팅, 대리점(체인점) 교육 및 세미나 등 다양한 분야에서 활용 가능
        # - 자세한 사항은 홈페이지(http://wooksungmedia.com) iMentor 제폼 소개 참조
        # 놓치지 마세요.'''
        
        # msg.set_content(body_content)
        
        
        # ## 2. html 직접 코딩
        # msg.set_content('''
        # <!DOCTYPE html>
        # <html>
        #     <body>
        #         <div style="background-color:#eee;padding:10px 20px;">
        #             언택트 시대에 필요한 소프트웨어 및 하드웨어 기반 고급 화상회의 시스템 
        #             <h1 style="font-family:Georgia, 'Times New Roman', Times, serif;color:blue;font-weight:bold;">
        #             '화상회의(원격교육) 솔루션 - iMentor' <span style="font-size:18px">소개</span> </h1>
        #         </div>    
        #     </body>
        # </html>
        # ''', subtype='html')


        ## 3. html 파일을 파이썬 파일(wooksung_imentor.py)로 만든 후 import 하여 사용 
        msg.set_content(wooksung_imentor.body_content, subtype='html')
        
        
        # 홍보 파일(이미지) 첨부
        with open('./email/iMentor.png', 'rb') as f:
            msg.add_attachment(f.read(), maintype='image', subtype='png', filename=f.name)

        with smtplib.SMTP('smtp.gmail.com', 587) as smtp:  # 587 or 465
            smtp.ehlo()
            smtp.starttls()
            smtp.login(account.EMAIL_ADDRESS, account.EMAIL_PASSWORD)  # 계정 로그인
            smtp.send_message(msg)
            print(f'{cnt}번째 발송 완료!')
        result = True
    except:
        result = False
    return result


def main():
    wb = openpyxl.load_workbook('./email/emailTestList.xlsx')
    ws = wb.active
    cnt = 0
    success_cnt = 0
    
    # 엑셀에서 이메일 불러온 후, email_sender() 함수 호출
    for x in range(2, ws.max_row + 1):
        email = ws.cell(x, 1).value
        cnt += 1
        result = email_sender(email, cnt)
        print(f'{email}: {result}')
        
        if result:
            success_cnt += 1
            ws.cell(x, 2).value = ws.cell(x, 1).value  # 전송 성공 건 표시
        time.sleep(random.uniform(3, 5))
    
    print(f'\n발송 건 {cnt:=,}개 중 {success_cnt:=,}개 성공\n메일 발송이 완료됨')
    
    wb.save('./email/emailTestList.xlsx')
    wb.close()

main()

 

 

댓글