Home SMTP로 메일 보내기
Post
Cancel

SMTP로 메일 보내기

1. 메일 보내기

  • 구글 계정을 이용해 메일을 보내는 프로그램을 작성

IMAP 사용 설정

1. 구글 보안 수준 변경하기

  • 계정 관리 - 보안 탭 - 보안 수준이 낮은 앱의 액세스 허용

    2. 구글 IMAP 설정하기

  • Gmail 설정 - 전달 및 POP/IMAP 탭 - IMAP 액세스/상태 값을 ‘사용’으로 변경

2. SMTP

  • STMP 서버를 이용해 우리가 원하는 곳으로 메일을 보낼 수 있음
  1. SMTP 메일 서버를 연결
  2. SMTP 메일 서버에 로그인
  3. SMTP 메일 서버로 메일을 보냄
1
2
3
4
5
6
7
8
import smtplib

SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465

smtp = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) # 서버주소와 포트번호

print(smtp)
1
<smtplib.SMTP_SSL object at 0x000002965B13AC40>

SMTP 함수를 사용하면 SMTPServerDisconnected: Connection unexpectedly closed 에러 발생

  • 보안 연결(SSL)만 허용하는데 일반 연결을 시도할 경우 발생
  • STMP 함수가 아닌 SMTP_SSL 함수로 해결 가능
1
2
3
4
5
6
7
8
9
10
11
import smtplib

SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465

smtp = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
correct_pw = smtp.login("올바른 아이디", "올바른 비밀번호")
wrong_pw = smtp.login("올바른 아이디", "잘못된 비밀번호")

print(correct_pw)
print(wrong_pw)
1
2
(235, b'2.7.0 Accepted')
(503, b'5.5.1 MAIL first. b4-20020a170902650400b0015e8d4eb1dcsm7334212plk.38 - gsmtp')

3. MINE

  • 일반적인 텍스트 파일은 SMTP로 넘길 수 없음
  • MINE 형태로 변환해 넘겨줘야 함
  • MINE 형태를 만드는 방법은 다양하나, email.message 모듈을 사용
    • .EmailMessage
  1. 이메일을 만든다
  2. 이메일에 내용을 담는다
  3. 발신자, 수신자를 설정한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import smtplib
from email.message import EmailMessage

SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465

# 1 이메일을 만든다
message = EmailMessage()
# 2 이메일에 내용을 담는다
message.set_content("내용") # 이메일을 보냈을때 본문에 나타나는 부분


smtp = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
smtp.login("올바른 아이디", "올바른 비밀번호")
smtp.send_message()

4. Header

  • Subject: 제목
  • From: 발신자
  • To: 수신자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import smtplib
from email.message import EmailMessage

SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465

# 1 이메일을 만든다
message = EmailMessage()
# 2 이메일에 내용을 담는다
message.set_content("내용") # 이메일을 보냈을때 본문에 나타나는 부분
# 3
message["Subject"] = "이것은 제목입니다."
message["From"] = "발신 메일"
message["To"] = "수신 메일"


smtp = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
smtp.login("발신 메일", "비밀번호")
smtp.send_message()

5. 메일 전송하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import smtplib
from email.message import EmailMessage

SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465

message = EmailMessage()
message.set_content("내용")

message["Subject"] = "이것은 제목입니다."
message["From"] = "발신 메일"
message["To"] = "수신 메일"

smtp = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
smtp.login("발신 메일", "비밀번호")
smtp.send_message(message)
smtp.quit()
1
2
(221,
 b'2.0.0 closing connection p23-20020a637f57000000b003c14af5062fsm14375391pgn.71 - gsmtp')

6. 사진 첨부하기

|이름|설명| |—|—| |rb|read binary| |wb|write binary| |ab|append binary|

with

1
2
with open("파일 이름", "모드") as 파일 변수:
    변수 = 파일변수.read()
  • close 없이 파일을 열고 닫을 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import smtplib
from email.message import EmailMessage
import imghdr # 이미지의 확장자를 판단해줌

SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465

message = EmailMessage()
message.set_content("내용")

message["Subject"] = "이것은 제목입니다."
message["From"] = "발신 메일"
message["To"] = "수신 메일"

with open("파일 이름", "rb") as image:
    image_file = image.read()
    
image_type = imghdr.what("mail_image", image_file)
    
# message.add_attachment(image_file, maintype='image', subtype='jpg') # image, maintype, subtype
message.add_attachment(image_file, maintype='image', subtype=image_type)

smtp = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
smtp.login("발신 메일", "비밀번호")
smtp.send_message(message)
smtp.quit()

7. 유효성 검사하기

우리가 보내고자하는 주소가 진짜 이메일이 맞는지 확인 -> 정규표현식

정규표현식

  • 문자열에서 나타나는 특정한 패턴을 확인
  • 이메일의 경우: ^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$
    • ^: 정규표현식 시작
    • $: 정규표현식 끝
    • [a-zA-Z0-9.+_-]: a~ A~Z 0~9 . + _ -
    • +: 가 1회 이상 반복된다
    • @: @가 붙는다
    • \.: 그 뒤에 .이 붙는다
    • {2,3}: 가 최소 2회, 최대 3번 반복된다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import smtplib
from email.message import EmailMessage
import imghdr
import re # 정규표현식을 위한 모듈


SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465

def sendEmail(addr):
    reg = "^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$"
    if bool(re.match(reg, addr)):
        smtp.send_message(message)
        print("정상적으로 메일이 발송되었습니다.")
    else:
        print("유효한 이메일 주소가 아닙니다.")

message = EmailMessage()
message.set_content("내용")

message["Subject"] = "이것은 제목입니다."
message["From"] = "발신 메일"
message["To"] = "수신 메일"

with open("파일 이름", "rb") as image:
    image_file = image.read()
    
image_type = imghdr.what("mail_image", image_file)
    
# message.add_attachment(image_file, maintype='image', subtype='jpg') # image, maintype, subtype
message.add_attachment(image_file, maintype='image', subtype=image_type)

smtp = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
smtp.login("발신 이메일", "비밀번호")

sendEmail("수신 이메일")
smtp.quit()
This post is licensed under CC BY 4.0 by the author.

Google Trans로 번역하기

!와 % 명령어 차이

Comments powered by Disqus.