반응형

@Project 14 - 구글 및 네이버 이메일 보내기 및 대량 전송

 

1. 네이버와 구글에 외부에서 접속하여 메일을 보낼 수 있도록 설정한다.

2. 메일 보내는 모듈을 불러와서 접속 아이디와 비번을 넣고, 제목, 내용을 추가하여 메일을 보낸다.

3. 네이버, 구글 해 본다. : 구글이 안됐다. 왜 안됐는지 모른다. 비번이 틀린것 같은데 추후에 다시 해 보겠다.

4. 첨부파일을 넣어 보내본다. : 다른 모듈 추가

5. HTML 형식의 본문을 만들어 보내본다. : 다른 모듈이 추가로 필요하다.

6. 엑셀에서 여러개의 메일 주소를 읽어들여 차례로 보낸다.


1. 네이버 설정 변경하기 : 외부에서 접속하여 메일을 보낼 수 있도록 한다.

 - POP3/IMAP 설정에서 IMAP/SMTP 사용 설정하기

 

 - IMAP(아이맵) : Internet Message Access Protocol > 서버에서 이메일을 읽기 위한 표준 프로토콜

 - POP3(팝쓰리) : Post Office Protocal version 3 > 사용자의 기기로 이메일을 다운로드하여 읽는 프로토콜

 - SMTP(에셈티피) : Simple Mail Transfer Protocol > 이메일을 보내기 위한 프로토콜

 

 > 송신 프로토콜은 SMTP로 동일하고

 > 수신 프로토콜을 POP3로 할 것인지 IMAP으로 할 것인지 구분된다.

참고 : https://blog.naver.com/lw_mailplug/221463114087

 

POP3(수신) / SMTP(송신) 선택
IMAP(수신) / SMTP(송신) 선택

 - SMTP를 이용해 보낼 때, 어느 서버와 포트를 통해서 보낼 지 네이버에서 알려준다.

 - SMTP 서버명 체크 : smtp.naver.com

 - SMTP 포트 : 587, 보안연결(TLS) 필요

 - 로그인은 네이버 ID와 PW

 


2. 메일 보내는 모듈을 불러와서 접속 아이디와 비번을 넣고, 제목, 내용을 추가하여 메일을 보낸다.

 

# 메일 보내기 모듈
import smtplib
from email.mime.text import MIMEText

send_email = '네이버ID@naver.com'
send_pwd = '네이버비밀번호'

recv_email = '받는사람주소***@gmail.com'


# SMTP서버 접속 (접속주소와 포트번호)
smtp_name = 'smtp.naver.com'  
smtp_port = 587

# 메일내용
text  = '''
메일 내용이 들어갈 자리입니다.
여러줄을 입력해도 파이썬이 알아서
줄도 바꿔주고 그러네요
정말 좋아요
이스케이프 문자도 그대로 보내주나요?
\t탭이 되면 이스케이프 문자는 적용되는거에요.
흐흐흐흐
'''

# 메시지 형식을 문자 형식으로 지정
msg = MIMEText(text)

# 메일 제목
msg['Subject'] = '내가 파이썬으로 보낸 메일'
# 보내는 사람
msg['from'] = send_email
# 받는 사람
msg['to'] = recv_email

# 문자화된 형식 터미널 창에서 확인
#print(msg.as_string())

# 실제 메일 보내기
# SMTP 서버명, 포트 설정
s = smtplib.SMTP(smtp_name, smtp_port)
# TLS 보안설정
s.starttls()
# 로그인
s.login(send_email, send_pwd)
# 메일 보내기 (보내는 사람, 받는사람, 메시지)
s.sendmail(send_email, recv_email, msg.as_string())
# 끝내고 나오기
s.quit()

결과.

잘 보내짐


3. 네이버는 잘 되는데

구글이 실패했다.

 

구글에서 SMTP 설정하려면,

이중보안을 한 다음에, 웹 비밀번호를 만들어서

그 웹 비밀번호로 접속을 해야하는데 잘 안된다.

 

원래의 비밀번호를 바꾸는 것은 아닌것 같은데...

나중에 다른 아이디로 다시 해 봐야겠다.

 


4. 첨부파일 넣기

> MIME : Multipurpose Internet Mail Extensions > '다목적 인터넷 메일 확장'기능에 대한 표준 규격이다.

 - 텍스트 외에 이미지, 멀티미디어 등을 처리할 수 있도록 한 것임.

# SMTP 모듈
import smtplib
from email.mime.text import MIMEText

# 멀티파트로 부터 MIMEMultipart 와 Application 가져오기
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication


send_email = '네이버ID@naver.com'
send_pwd = '패스워드'

recv_email = '받는사람 주소'

# SMTP 접속정보
smtp_name = 'smtp.naver.com'
smtp_port = 587

# 메시지를 MIMEMultipart로 설정
msg = MIMEMultipart()

# 메시지에 제목, 보내는 사람, 받는 사람 추가하고
msg['Subject'] = '첨부파일 테스트'
msg['From'] = send_email
msg['To'] = recv_email

# 텍스트도 적어서
text  = '''
공부는 내 인생에서 계속 해 나갑시다.
우리 힘 내서 잘 해 봅시다.
화이팅!!
'''

# 멀티미디어확장 텍스트로 만들어서
contentPart = MIMEText(text)

# 메시지에 같이 첨부한다.
msg.attach(contentPart)

# 추가할 파일을 하나 가져와서
etc_file_path = r'기초프로그램\13_emailcollector\email.xlsx'

# 파일을 메시지에 첨부한다.
with open(etc_file_path, 'rb') as f:
    etc_part = MIMEApplication(f.read())
    etc_part.add_header('Content-Disposition', 'attachment', filename ='email.xlsx')
    msg.attach(etc_part)
    
# 보내는 방식은 같다.
s = smtplib.SMTP(smtp_name, smtp_port)
s.starttls()
s.login(send_email, send_pwd)
s.sendmail(send_email, recv_email, msg.as_string())
s.quit()

결과.

잘 간다.

 


5. HTML 형식의 본문을 만들어 보내본다. : 다른 모듈이 추가로 필요하다.

# 메일 보내기 모듈
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

send_email = '네이버메일'
send_pwd = '비밀번호'

recv_email = '받는사람 메일'

smtp_name = 'smtp.naver.com'
smtp_port = 587

msg = MIMEMultipart()

msg['Subject'] = 'HTML style'
msg['from'] = send_email
msg['to'] = recv_email

# HTML 형식의 메시지를 적는다.

html_body  = '''
<!-- #######  THIS IS A COMMENT - Visible only in the source editor #########-->
<h2>Welcome To The Best Online HTML Web Editor!</h2>
<p style="font-size: 1.5em;">You can <strong style="background-color: #317399; padding: 0 5px; color: #fff;">type your text</strong> directly in the editor or paste it from a Word Doc, PDF, Excel etc.</p>
<p style="font-size: 1.5em;">The <strong>visual editor</strong> on the right and the <strong>source editor</strong> on the left are linked together and the changes are reflected in the other one as you type! <img src="https://html5-editor.net/images/smiley.png" alt="smiley" /></p>
<table class="editorDemoTable">
<tbody>
<tr>
<td><strong>Name</strong></td>
<td><strong>City</strong></td>
<td><strong>Age</strong></td>
</tr>
<tr>
<td>John</td>
<td>Chicago</td>
<td>23</td>
</tr>
<tr>
<td>Lucy</td>
<td>Wisconsin</td>
<td>19</td>
</tr>
<tr>
<td>Amanda</td>
<td>Madison</td>
<td>22</td>
</tr>
</tbody>
</table>
<p>This is a table you can experiment with.</p>
'''


# 메시지를 MIMEText로 바꿀 때 형식을 html로 지정해서 바꾸면 되는 듯.
msg.attach(MIMEText(html_body, 'html'))

s = smtplib.SMTP(smtp_name, smtp_port)
s.starttls()
s.login(send_email, send_pwd)
s.sendmail(send_email, recv_email, msg.as_string())
s.quit()

결과.

잘 간다.

 


6. 엑셀에서 여러개의 메일 주소를 읽어들여 차례로 보낸다.

from openpyxl import load_workbook
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# 이메일 주소가 들어있는 엑셀파일 열기
load_wb = load_workbook(r'기초프로그램\14_automailing\custom_email.xlsx', data_only=True)
load_ws = load_wb.active


# 주소값을 하나씰 읽어서 그 메일로 보낸다.
for i in range(1, load_ws.max_row + 1):
    recv_email_value = load_ws.cell(i, 1).value
    print('Success : ', recv_email_value)
    
    try:
                
		# 여긴 for문 안에 안들어와도 될 것 같다.                
        # 만약 보내는 사람도 달라지면 엑셀에 저장했다가 읽어서 쓸 수는 있겠다.
        send_email = '보내는 주소'
        send_pwd = '비번'

		# 보내는 메일 설정
        recv_email = recv_email_value


        # SMTP : Simple Mail Transfer Protocol
        smtp_name = 'smtp.naver.com'
        smtp_port = 587

        msg = MIMEMultipart()
        
        text  = '''
        잘 살아보세
        '''

        # 메시지 형식을 문자 형식으로 지정
        msg.attach(MIMEText(text))

        msg['Subject'] = '엑셀안에 있는 메일 주소로 보내기'
        msg['from'] = send_email
        msg['to'] = recv_email

        s = smtplib.SMTP(smtp_name, smtp_port)
        s.starttls()
        s.login(send_email, send_pwd)
        s.sendmail(send_email, recv_email, msg.as_string())
        s.quit()

    except:
    	# 에러나면 에러로 표시
        print('Error : ', recv_email_value)

결과.

잘 간다.


회사를 이리저리 옮기고, 일을 띄엄띄엄 하다보니

메일을 언제는 다음으로 받았다가, 언제는 지메일로 받았다가 한다.

그걸 한 군데서 보겠다고 POP3 설정하고 뭐하고 그랬었는데,

사실 그게 뭔지 잘 모르고 이렇게 하니까 되더라 했었는데

오늘 공부하면서 그게 수신,송신 프로토콜이고 어떤 차이가 있는지 알게됐다.

 

생각해보면... 그 때도 공부해서 알고 썼던 것 같다.

지금은 그걸 알았었는지도 잊어버렸지만.

 

흠...

 

나이가 들다보니 기억이...

엇그제는 파일을 불러오는 코드에 자꾸 r을 써서 뭔지 찾아봤다.

raw 라는 의미로 '' 안에 들어가는 이스케이프 문자들을 이스케이프 문자가 아닌

\(역슬래시) 그대로 받아들이게 하기 위함이었다.

 

왜 이런 설명도 안해주고 코드에 그냥 넣지? 하면서 궁시렁댔는데...

 

오늘 책을 뒤적이다가 보니

책 초반 print를 설명할 때, 떡 하니 'r' 에 대한 설명이 있었다.

그것도 내가 빨간 줄까지 쳐 가면서 동글뱅이까지 쳐 가면서 봤었더라...

 

허허허.

 

그렇다.

 

공부를 한 지가 너무 오래되었네 그려...

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기