본문 바로가기

Programming/코딩 짤팁

파이썬으로 첨부파일이 있는 gmail 보내기

728x90
반응형

업무중에 만든 뉴스센싱 결과를 메일로 보내기 위해 파이썬 코드를 작성하였다. 단순 뉴스 수집을 위한 코드 였기 때문에 내부 메일 서버를 사용하지 않고 외부에 별도의 gmail 계정을 만들어 해당 계정으로 보내도록 만들었다.

간단하게 코드의 중요 부분들을 설명하자면 먼저 gmail의 smtp 서버 설정과 사용할 계정으로 로그인을 해줘야 한다.

구글의 경우 SMTP 서비스로 587번 포트를 이용하고 있다. 계정 로그인의 경우 패스워드 유출 위험이 있으므로 별도의 앱비밀번호를 만들어 넣는것을 추천한다. 앱 비밀번호 발급은 아래 포스팅을 참고하면 된다.

 

구글 앱 비밀번호 발급받기

구글 앱 비밀번호 발급의 필요성 파이썬 등의 프로그래밍 언어를 이용해 메일 송수신 모듈을 구현해야 할 경우가 있다. 주로 SMTP를 이용해 구현을 하게 되는데 구글메일(gmail)을 사용할 경우 구��

garnetiger.com

s = smtplib.SMTP('smtp.gmail.com', 587)
s.starttls()
s.login('YOUR_GMAIL_ADDRESS', 'YOUR_GOOGLE_KEY or PASSWORD')

 

그리고 보내는사람, 받는사람, 메일 주소를 설정해 준다.

to_list = ["YOUR_RECEIVE_LIST"]
msg['From'] = formataddr((str(Header('YOUR_SENDER_NAME', 'utf-8')), 'YOUR_GMAIL_ADDRESS'))
msg['To'] = ", ".join(to_list)
msg['Subject'] = 'YOUR_MAIL_TITLE'

 

첨부파일이 있다면 MIMEBase를 otect-stream 으로 설정을 해주고 첨부파일을 설정해 메시지에 첨부해준다.

part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment', filename=name_tmp)
msg.attach(part)

 

마지막으로 메일을 보내고 연결을 종료한다. 코드의 경우에는 to_list에 받는 사람들을 설정해주고 한번에 발송을 해주었다.

s.sendmail(msg['From'], to_list, msg.as_string())

s.quit()

 

코드 전문은 아래와 같다. 메일 본문에 Dataframe 써서 표를 추가해야 하는 부분들이 있어서 html 본문이 존재한다. 

def Send_Gmail():
	msg = MIMEMultipart()
	
	html = '''
		<html>
			<head>
			</head>
			<body>
				"YOUR MESSAGE"
			</body>
		</html>
		'''

	part_html = MIMEText(html, 'html')
	msg.attach(part_html)
	
	name_tmp = "YOUR_ATTACH_FILE_NAME"


	s = smtplib.SMTP('smtp.gmail.com', 587)
	s.starttls()
	s.login('YOUR_GMAIL_ADDRESS', 'YOUR_GOOGLE_KEY or PASSWORD')

	to_list = ["YOUR_RECEIVE_LIST"]
	msg['From'] = formataddr((str(Header('YOUR_SENDER_NAME', 'utf-8')), 'YOUR_GMAIL_ADDRESS'))
	msg['To'] = ", ".join(to_list)
	msg['Subject'] = 'YOUR_MAIL_TITLE'

	attachment = open("YOUR_ATTACH_FILE_PATH", 'rb')

	part = MIMEBase('application', 'octet-stream')
	part.set_payload((attachment).read())
	encoders.encode_base64(part)
	part.add_header('Content-Disposition', 'attachment', filename=name_tmp)
	msg.attach(part)

	s.sendmail(msg['From'], to_list, msg.as_string())

	s.quit()
반응형