Python 은 SMTP 프로 토 콜 을 바탕 으로 메 일 발송 기능 에 대한 상세 한 설명 을 실현 합 니 다.

이 사례 는 Python 이 SMTP 프로 토 콜 을 바탕 으로 메 일 발송 기능 을 실현 하 는 것 을 다 루 었 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
SMTP(Simple Mail Transfer Protocol),즉 간단 한 메 일 전송 프로 토 콜 입 니 다.원본 주소 에서 목적 주소 로 메 일 을 전송 하 는 규칙 입 니 다.메 일의 중간 방식 을 제어 합 니 다.Python 은 SMTP 에 대한 지원 을 내장 하여 일반 텍스트 메 일,HTML 메 일,첨부 파일 이 있 는 메 일 을 보 낼 수 있 습 니 다.
파 이 썬 의 SMTP 지원 은smtplibemail두 모듈 로email메 일 을 구성 하고smtplib메 일 을 보 내 는 것 을 책임 진다.
Python 에서 SMTP 를 만 드 는 문법 은 다음 과 같 습 니 다.

import smtplib
smtpObj = mstplib.SMTP(host,port)

SSL 프로 토 콜 이 있 는 SMTP 만 들 기:

import smtplib
smtpObj = mstplib.SMTP_SSL(host,port)

SMTP 대상 으로 메 일 보 내기:

# from_addr:     
# to_addrs:     ,list
# msg:   
smtpObj.sendmail(from_addr, to_addrs, msg, mail_options=[],
         rcpt_options=[])

다음 예 는 모두 왕 이 메 일 을 메 일 서버 로 쓴 것 입 니 다.왕 이 163 무료 메 일 관련 서버 정 보 는 다음 과 같 습 니 다.

왕 이 메 일 을 발송 자 메 일 로 사용 할 때 메 일 비밀 번 호 는 메 일의 로그 인 비밀번호 가 아니 라 클 라 이언 트 가 비밀 번 호 를 권한 을 부여 하 는 것 임 을 주의해 야 한다.
일반 텍스트 메 일 보 내기
우선,우 리 는 메시지 체 를 구성 해 야 한다.

from email.header import Header
from email.mime.text import MIMEText
#           ,      MINE subtype,  ‘plain',   MINE  ‘text/plain',       
msg = MIMEText('hello email','palin','utf-8')
def _format_addr(s):
  name,addr = parseaddr(s)
  return formataddr((Header(name,'utf-8').encode(),addr.encode('utf-8') if isinstance(addr,unicode) else addr))
#      
msg['From'] = _format_addr('      <%s>'%from_addr) 
#      
msg['To'] = _format_addr('      <%s>'%to_addr)
#   
msg['Subject'] = Header('  ','utf-8').encode()

이때 간단 한 소식 체 를 만 들 었 다.제목 과 닉네임 을 지정 하지 않 고 인 코딩 을 포맷 하면 매 운 닭 메 일 로 여 겨 져 발송 에 실패 할 수 있 습 니 다!!
다음은 일반 텍스트 메 일 예제 를 보 내 는 전체 코드 입 니 다.

import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.utils import formataddr,parseaddr
host = 'smtp.163.com'
port = 25
from_addr = '[email protected]'
from_addr_pwd = 'xxxxxx'
to_addr = '[email protected]'
def _format_addr(s):
  name,addr = parseaddr(s)
  return formataddr((Header(name,'utf-8').encode(),addr.encode('utf-8') if isinstance(addr,unicode) else addr))
msg = MIMEText('hello email','palin','utf-8')
msg['From'] = _format_addr('      <%s>'%from_addr) 
msg['To'] = _format_addr('      <%s>'%to_addr)
msg['Subject'] = Header('  ','utf-8').encode()
smtpObj = smtplib.SMTP(host,25)
smtpObj.set_debuglevel(1)
smtpObj.login(sender,password)
smtpObj.sendmail(sender, [receivers], message.as_string())
smtoObj.quit()

주의해 야 할 것 은sendmail방법 을 호출 할 때 수신 자 메 일 은 list 형식 으로 단체 발송 기능 에 사용 된다 는 것 이다.
HTML 메 일 보 내기
만약 에 HTML 메 일 을 보 내 는 수요 가 있다 면 우 리 는 먼저MIMEText대상 에 게 html 문자열 을 전달 해 야 합 니 다.다음 과 같 습 니 다.

htmlStr = '''
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h1>Hello SMTP</h1>
  <p>  <a href="https://www.baidu.com" rel="external nofollow" rel="external nofollow" >  </a></p>
</body>
</html>'''
msg = MIMEText(htmlStr,'html','utf-8')

전체 코드 는 다음 과 같 습 니 다:

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr,parseaddr
def _format_addr(s):
  name,addr = parseaddr(s)
  return formataddr((Header(name,'utf-8').encode(),addr.encode('utf-8') if isinstance(addr,unicode) else addr))
server = 'smtp.163.com'
from_addr = '[email protected]'
from_addr_pwd = 'xxxxxx'
to_addr = '[email protected]'
htmlStr = '''
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h1>Hello SMTP</h1>
  <p>  <a href="https://www.baidu.com" rel="external nofollow" rel="external nofollow" >  </a></p>
</body>
</html>'''
msg = MIMEText(htmlStr,'html','utf-8')
msg['From'] = _format_addr("    <%s>"%from_addr)
msg['To'] = _format_addr("    <%s>"%to_addr)
msg['Subject'] = Header('       ','utf-8').encode()
smtpObj = smtplib.SMTP(server,25)
smtpObj.set_debuglevel(1)
smtpObj.login(from_addr,from_addr_pwd)
smtpObj.sendmail(from_addr,[to_addr],msg.as_string())
smtpObj.quit()

첨부 메 일 보 내기
만약 우리 가 첨부 파일 을 보 낼 필요 가 있다 면,우 리 는 어떻게 메시지 체 를 개조 해 야 합 니까?우 리 는 이때MIMEMultipart메 일 자 체 를 구성 하여MIMEText대상 에 게 메 일의 본문 을 전달 하고MIMEBase대상 으로 첨부 된 정 보 를 저장 하면 됩 니 다.코드 는 다음 과 같 습 니 다.

msg = MIMEMultipart()
msg.attach(MIMEText('      ...','plain','utf-8'))
path = os.path.join(os.getcwd(),'1.png')
with open(path,'rb') as f:
  #      MIME
  mime = MIMEBase('image','png',filename='1.png')
  #         
  mime.add_header('Content-Disposition','attachment',filename='1.png')
  mime.add_header('Content-ID','<0>')
  mime.add_header('X-Attachment-Id','0')
  #       
  mime.set_payload(f.read())
  #   base64  
  encode_base64(mime)
  msg.attach(mime)

전체 코드 는 다음 과 같 습 니 다:

import smtplib,os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart,MIMEBase
from email.header import Header
from email.encoders import encode_base64
from email.utils import formataddr,parseaddr
msg = MIMEMultipart()
msg.attach(MIMEText('      ...','plain','utf-8'))
def _format_addr(s):
  name,addr = parseaddr(s)
  return formataddr((Header(name,'utf-8').encode(),addr.encode('utf-8') if isinstance(addr,unicode) else addr))
server = 'smtp.163.com'
from_addr = '[email protected]'
from_addr_pwd = 'xxxxxx'
to_addr = '[email protected]'
path = os.path.join(os.getcwd(),'1.png')
with open(path,'rb') as f:
  mime = MIMEBase('image','png',filename='1.png')
  mime.add_header('Content-Disposition','attachment',filename='1.png')
  mime.add_header('Content-ID','<0>')
  mime.add_header('X-Attachment-Id','0')
  mime.set_payload(f.read())
  encode_base64(mime)
  msg.attach(mime)
msg['From'] = _format_addr("    <%s>"%from_addr)
msg['To'] = _format_addr("    <%s>"%to_addr)
msg['Subject'] = Header('         ','utf-8').encode()
smtpObj = smtplib.SMTP(server,25)
smtpObj.set_debuglevel(1)
smtpObj.login(from_addr,from_addr_pwd)
smtpObj.sendmail(from_addr,[to_addr],msg.as_string())
smtpObj.quit()

사진 메 일 보 내기
만약 우리 가 텍스트 에 그림 을 메 일 본문 으로 삽입 해 야 한다 면,우 리 는 어떻게 실현 해 야 합 니까?HTML 을 사용 하고 싶 은 사람 이 있 을 것 입 니 다.그 안에 img 라벨 을 박 으 면 됩 니 다.하지만 문제 가 있 습 니 다.img 라벨 은 그림 경 로 를 참조 하기 때문에 그림 파일 도 보 낼 수 는 없 을 것 입 니 다.그렇게 오랫동안 방법 이 없 었 습 니까?물론 있 습 니 다.우 리 는 HTML 과 첨부 메 일 발송 방식 을 결합 하여 사진 메 일 을 보 낼 수 있 습 니 다.먼저 우 리 는 사진 을 첨부 파일 로 추가 한 다음 에 HTML 에서 img 태그 참조src='cid:0'로 사진 을 인용 할 수 있 습 니 다.다음 과 같 습 니 다.

msg = MIMEMultipart()
path = os.path.join(os.getcwd(),'1.png')
with open(path,'rb') as f:
  mime = MIMEBase('image','png',filename='1.png')
  mime.add_header('Content-Disposition','attachment',filename='1.png')
  mime.add_header('Content-ID','<0>')
  mime.add_header('X-Attachment-Id','0')
  mime.set_payload(f.read())
  encode_base64(mime)
  msg.attach(mime)
htmlStr = '''
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h1>    </h1>
  <p>      <img src="cid:0"/></p>
</body>
</html>'''
msg.attach(MIMEText(htmlStr,'html','utf-8'))

전체 코드 는 다음 과 같 습 니 다:

import smtplib,os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart,MIMEBase
from email.header import Header
from email.encoders import encode_base64
from email.utils import parseaddr,formataddr
server = 'smtp.163.com'
from_addr = '[email protected]'
from_addr_pwd = 'xxxxxx'
to_addr = '[email protected]'
def _format_addr(s):
  name,addr = parseaddr(s)
  return formataddr((Header(name,'utf-8').encode(),addr.encode('utf-8') if isinstance(addr,unicode) else addr))
msg = MIMEMultipart()
path = os.path.join(os.getcwd(),'1.png')
with open(path,'rb') as f:
  #      MIME
  mime = MIMEBase('image','png',filename='1.png')
  #         
  mime.add_header('Content-Disposition','attachment',filename='1.png')
  mime.add_header('Content-ID','<0>')
  mime.add_header('X-Attachment-Id','0')
  #       
  mime.set_payload(f.read())
  #   base64  
  encode_base64(mime)
  msg.attach(mime)
htmlStr = '''
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h1>    </h1>
  <p>      <img src="cid:0"/></p>
</body>
</html>'''
msg.attach(MIMEText(htmlStr,'html','utf-8'))
msg['From'] = _format_addr('    <%s>'%from_addr)
msg['To'] = _format_addr('    <%s>'%to_addr)
msg['Subject'] = Header('      ','utf-8').encode()
smtpObj = smtplib.SMTP(server,25)
smtpObj.set_debuglevel(1)
smtpObj.login(from_addr,from_addr_pwd)
smtpObj.sendmail(from_addr,[to_addr],msg.as_string())
smtpObj.quit()

여러 개의 그림 이 있 으 면 순서대로 번 호 를 매 긴 다음 에 다른 것cid:x을 인용 하면 된다.
더 많은 파 이 썬 관련 내용 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.
본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기