- 작성시간 : 2018/05/01 09:06
- 퍼머링크 : mcchae.egloos.com/11294763
- 덧글수 : 0
그동안 파이썬으로 이메일 보내는 작업을 몇번 했었던 것 같습니다.
그런데 구글 쥐메일 보내는 것도 여러 번 시도를 했었지만,
다시금 해 보았습니다.
그리고 간단한 클래스로 만들었습니다.
중요한 것은 다음 링크로 들어가서, 보안 수준을 낮춰줘야 한다는 것입니다.
소스는 다음과 같습니다.
import os | |
import smtplib | |
import time | |
from email.mime.multipart import MIMEMultipart | |
from email.mime.text import MIMEText | |
from email.mime.base import MIMEBase | |
from email.utils import COMMASPACE, formatdate | |
from email import encoders | |
################################################################################ | |
class Email(object): | |
# ========================================================================== | |
def __init__(self, mail_server, port, email_from, password, use_tls=True): | |
self.mail_server = mail_server | |
self.port = port | |
self.email_from = email_from | |
self.password = password | |
self.use_tls = use_tls | |
self.server = None | |
self.open() | |
# ========================================================================== | |
def __del__(self): | |
self.close() | |
# ========================================================================== | |
def open(self): | |
server = smtplib.SMTP('%s:%s' % (self.mail_server, self.port)) | |
server.ehlo() | |
if self.use_tls: | |
server.starttls() | |
# https://myaccount.google.com/lesssecureapps 에서 풀어줘야 함 | |
server.login(self.email_from, self.password) | |
self.server = server | |
# ========================================================================== | |
def close(self): | |
if self.server is not None: | |
self.server.close() | |
self.server = None | |
# ========================================================================== | |
def send(self, to, subject, | |
body=None, html=None, attachments=None): | |
try: | |
msg = MIMEMultipart('mixed') | |
msg['From'] = self.email_from | |
msg['To'] = COMMASPACE.join(to) | |
msg['Date'] = formatdate(localtime=True) | |
msg['Subject'] = subject | |
if body: | |
msg.attach(MIMEText(body, 'plain')) | |
if html: | |
msg.attach(MIMEText(html, 'html')) | |
if attachments is None: | |
attachments = [] | |
for f in attachments: | |
if not os.path.exists(f): | |
continue | |
part = MIMEBase('application', 'octet-stream') | |
part.add_header("Content-Type", | |
"multipart/form-data; boundary=MyBoundary") | |
with open(f, "rb") as ifp: | |
part.set_payload(ifp.read()) | |
encoders.encode_base64(part) | |
part.add_header('Content-Disposition', | |
"attachment; filename= %s" % f) | |
msg.attach(part) | |
self.server.sendmail(self.email_from, to, msg.as_string()) | |
print('<%s> Email sent!' % subject) | |
except Exception as e: | |
print('Something went wrong...: %s' % e) | |
raise | |
################################################################################ | |
def test(): | |
mail_server = 'smtp.gmail.com' | |
port = 587 | |
email_from = 'your_gmail_address@gmail.com' | |
password = 'your_gmail_password' | |
es = Email(mail_server, port, email_from, password) | |
to = ['mcchae@vivans.net', 'mcchae@argos-labs.com'] | |
for i in range(3): | |
subject = '[%02d] OMG Super Important 테스트 메시지' % i | |
body = "[%02d] Hey, what's up?\n\n- 브로" % i | |
html = """ | |
<html> | |
<head></head> | |
<body> | |
<p>here is some html<br> | |
Here is some 링크 <a href="https://www.python.org">link</a>. | |
</p> | |
</body> | |
</html> | |
""" | |
attachments = ['shabu-stars.png'] | |
es.send(to, subject, body, html, attachments) | |
time.sleep(2) | |
################################################################################ | |
if __name__ == '__main__': | |
test() |
어느 분께는 도움이 되셨기를..
덧글