>  기사  >  백엔드 개발  >  Python3이 SMTP 프로토콜을 사용하여 이메일 이메일을 보내는 방법의 예

Python3이 SMTP 프로토콜을 사용하여 이메일 이메일을 보내는 방법의 예

黄舟
黄舟원래의
2017-10-02 09:43:143319검색

SMTP(Simple Mail Transfer Protocol)는 편지의 전송 방법을 제어하는 ​​간단한 메일 전송 프로토콜입니다. 다음 기사에서는 Python3가 SMTP 프로토콜을 사용하여 도움이 필요한 친구가 이를 참조할 수 있도록 하는 방법을 주로 소개합니다.

머리말

이 기사에서는 주로 SMTP 프로토콜을 사용하여 이메일을 보내는 Python3에 대한 관련 내용을 소개합니다. Python 프로그램을 사용하여 지정된 사서함으로 이메일을 보내는 방법을 소개해야 합니다. 이메일 관련 정보.

이메일은 웹보다 오랜 역사를 가지고 있습니다. 지금까지 이메일은 인터넷에서도 매우 널리 사용되는 서비스입니다.

거의 모든 프로그래밍 언어는 이메일 보내기 및 받기를 지원하지만, 코드 작성을 시작하기 전에 이메일이 인터넷에서 어떻게 작동하는지 이해해야 합니다.

우리의 이메일 주소가 me@163.com이고 상대방의 이메일 주소가 friend@sina.com이라고 가정해 보겠습니다. 이제 Outlook이나 Foxmail과 같은 소프트웨어를 사용하여 이메일을 작성하고 상대방의 이메일 주소를 입력한 후 클릭합니다. "보내기"를 누르면 이메일이 전송됩니다. 이러한 이메일 소프트웨어를 MUA(Mail User Agent - 메일 사용자 에이전트)라고 합니다.

MUA에서 보낸 이메일은 상대방의 컴퓨터에 직접 도달하지 않고 MTA: 메일 전송 에이전트 - NetEase, Sina 등과 같은 이메일 서비스 제공업체인 메일 전송 에이전트로 전송됩니다. 우리의 이메일은 163.com이므로 이메일은 먼저 NetEase가 제공하는 MTA로 전달된 다음 NetEase의 MTA를 통해 다른 서비스 제공업체인 Sina의 MTA로 전송됩니다. 이 프로세스는 다른 MTA를 통과할 수도 있지만 우리는 특정 경로에 관심이 없고 속도에만 관심이 있습니다.

이메일이 Sina의 MTA에 도달한 후 상대방이 @sina.com이라는 이메일 주소를 사용하기 때문에 Sina의 MTA는 이메일의 최종 목적지인 MDA: Mail Delivery Agent로 이메일을 전달하게 됩니다. 이메일이 MDA에 도달한 후 Sina의 서버에 조용히 보관되어 파일이나 특수 데이터베이스에 저장됩니다. 우리는 이메일이 오랫동안 보관되는 곳을 이메일 상자라고 부릅니다. 메일을 받으려면 상대방이 MUA를 사용하여 MDA에서 자신의 컴퓨터로 메일을 가져와야 합니다.

이메일의 여정은 다음과 같습니다.

발신자-> MTA -> MTA -> MDA <- MUA <- 수신자 위의 기본 개념을 이해하려면 이메일을 보내고 받기 위한 프로그램을 작성해야 합니다. 기본적으로:

1. MTA에 이메일을 보내려면 MUA를 작성하세요.

2. MDA로부터 이메일을 받으려면 MUA를 작성하세요.

이메일을 보낼 때 MUA와 MTA에서 사용하는 프로토콜은 SMTP: Simple Mail Transfer Protocol입니다. 후속 MTA도 다른 MTA에 SMTP 프로토콜을 사용합니다.

이메일을 받을 때 MUA와 MDA는 두 가지 프로토콜을 사용합니다. POP: Post Office Protocol, 현재 버전은 3이며 일반적으로 POP3로 알려져 있습니다: Internet Message Access Protocol, 현재 버전은 4입니다. 이메일을 검색할 뿐 아니라 받은 편지함에서 휴지통으로 이동하는 등 MDA에 저장된 이메일을 직접 조작할 수도 있습니다.

이메일을 보낼 때 이메일 클라이언트 소프트웨어는 먼저 SMTP 서버, 즉 어떤 MTA로 보내려는지 구성하라는 메시지를 표시합니다. 163의 이메일 주소를 사용한다고 가정하면 Sina의 MTA는 Sina 사용자에게만 제공되므로 직접 보낼 수 없습니다. 따라서 163에서 제공하는 SMTP 서버 주소(smtp.163.com)를 입력해야 합니다. 163 사용자의 경우 SMTP 서버에서는 MUA가 일반적으로 SMTP 프로토콜을 통해 MTA에 이메일을 보낼 수 있도록 이메일 주소와 이메일 비밀번호를 입력해야 합니다.

마찬가지로 MDA에서 이메일을 받을 때 MDA 서버에서는 누구도 귀하인 것처럼 위장하여 이메일을 받지 못하도록 이메일 비밀번호 확인을 요구합니다. 따라서 Outlook과 같은 이메일 클라이언트에서는 POP3를 입력하도록 요청합니다. 또는 IMAP 서버 주소, 이메일 주소 및 비밀번호. MUA가 POP 또는 IMAP 프로토콜을 통해 MDA에서 이메일을 성공적으로 검색할 수 있도록 합니다.

마지막 특별 참고 사항:

현재 대부분의 이메일 서비스 제공업체는 SMTP 전송 및 POP 수신 기능을 수동으로 켜야 합니다. 그렇지 않으면 웹에서만 로그인할 수 있습니다. 예: QQ 메일함

다음으로 주요 주제인 Python을 통해 이메일을 보내는 방법을 시작합니다.

-------------------------------------- --------------------------------

간단한 문자 이메일 보내기

SMTP는 전송을 위한 프로토콜입니다. emails , Python에는 SMTP에 대한 지원이 내장되어 있으며 일반 텍스트 이메일, HTML 이메일 및 첨부 파일이 있는 이메일을 보낼 수 있습니다.

Python은 smtplib과 email의 두 가지 모듈로 SMTP를 지원합니다. 이메일은 이메일 구성을 담당하고 smtplib는 이메일 전송을 담당합니다.

먼저 가장 간단한 일반 텍스트 이메일을 만들어 보겠습니다.

from email.mime.text import MIMEText
msg = MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;)

참고:MIMEText 객체를 생성할 때 첫 번째 매개변수는 이메일 본문이고 두 번째 매개변수는 MIME의 하위 유형입니다. 'plain'을 전달하면 일반 텍스트를 의미하고 최종 MIME은 'text/plain'입니다. '. 마지막으로 다중 언어 호환성을 보장하려면 UTF-8 인코딩을 사용해야 합니다.

본문 내용뿐만 아니라 보내려는 이메일에 헤더 정보도 추가해야 합니다. 헤더 정보에는 보낸 사람, 받는 사람, 이메일 제목 등의 정보가 포함됩니다.


msg = MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;) #邮件正文
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;aa <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题

보내고 싶은 정보를 구성한 후 Python에서 해당 함수를 호출하고 SMTP를 통해 보내기만 하면 됩니다.


server = smtplib.SMTP(smtp_server, 25) #SMTP协议默认端口是25
server.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件
server.quit()

set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。SMTP协议就是简单的文本命令和响应。login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()를 사용하여 MIMEText 개체를 str로 변환합니다.

전체 코드 예제는 다음과 같습니다.


from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

import smtplib

def _format_addr(s): #格式化一个邮件地址
name, addr = parseaddr(s)
return formataddr((Header(name, &#39;utf-8&#39;).encode(), addr))

from_addr = &#39;fengxinlinux@sina.com&#39; #发送者邮箱地址
password = &#39;******&#39; #发送者邮箱密码,不告诉你密码=。=
to_addr = &#39;903087053@qq.com&#39; #接收者邮箱地址
smtp_server = &#39;smtp.sina.com&#39; #发送者所在的邮箱供应商的MTA地址
#from_addr = input(&#39;From: &#39;)
#password = input(&#39;Password: &#39;)
#to_addr = input(&#39;To: &#39;)
#smtp_server = input(&#39;SMTP server: &#39;)

msg = MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;) #邮件正文
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;axin <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题


server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
server.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件
server.quit()
1

프로그램을 실행하면 테스트한 사서함에 새 이메일이 수신된 것을 확인할 수 있습니다.

다른 정보는 동일하지만 수신자의 정보는 우리 프로그램에 입력된 액신이 아니라는 것을 알게 됩니다.

많은 이메일 서비스 제공업체에서는 이메일을 표시할 때 자동으로 수신자의 이름을 사용자의 등록된 이름으로 대체하지만 다른 수신자의 이름 표시에는 영향을 미치지 않습니다.

테스트를 하다가 가끔 제가 보낸 이메일이 이메일 서비스 제공업체에서 스팸으로 판단되어 바로 휴지통으로 들어가는 경우가 있었습니다. . . 무엇이 스팸으로 간주될지는 모르겠습니다. .

첨부 파일이 포함된 이메일 보내기

위에서 문자 이메일을 보내는 방법을 소개했습니다. 위의 지식을 바탕으로 첨부 파일이 포함된 이메일을 보내는 것은 실제로 매우 간단합니다.

첨부 파일이 있는 이메일은 여러 부분(텍스트와 각 첨부 파일 자체)을 포함하는 이메일로 간주할 수 있습니다. 따라서 MIMEMultipart 개체를 구성하여 이메일 자체를 표시한 다음 이메일 본문으로 MIMEText를 추가할 수 있습니다. 계속해서 첨부 파일의 MIMEBase 개체로 충분합니다.


# 邮件对象:
msg= MIMEMultipart()
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;axin <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题

# 邮件正文是MIMEText:
msg.attach(MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;))

# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open(&#39;/home/fengxin/图片/11.jpg&#39;,&#39;rb&#39;) as fhandle:
mime = MIMEBase(&#39;image&#39;,&#39;jpeg&#39;,filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;, filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-ID&#39;, &#39;<0>&#39;)
mime.add_header(&#39;X-Attachment-Id&#39;, &#39;0&#39;)
# 把附件的内容读进来:
mime.set_payload(fhandle.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)

그런 다음 일반적인 전송 프로세스에 따라 msg를 보내면(유형이 MIMEMultipart로 변경됨에 유의) 이메일을 받을 수 있습니다. 첨부 파일과 함께.

전체 코드 예시는 다음과 같습니다.


from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase


import smtplib

def _format_addr(s): #格式化一个邮件地址
name, addr = parseaddr(s)
return formataddr((Header(name, &#39;utf-8&#39;).encode(), addr))

from_addr = &#39;你的邮箱地址&#39; #发送者邮箱地址
password = &#39;你的邮箱密码&#39; #发送者邮箱密码
to_addr = &#39;903087053@qq.com&#39; #接收者邮箱地址
smtp_server = &#39;smtp.sina.com&#39; #发送者所在的邮箱供应商的MTA地址
#from_addr = input(&#39;From: &#39;)
#password = input(&#39;Password: &#39;)
#to_addr = input(&#39;To: &#39;)
#smtp_server = input(&#39;SMTP server: &#39;)


msg= MIMEMultipart()
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;axin <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题

msg.attach(MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;))

with open(&#39;/home/fengxin/图片/11.jpg&#39;,&#39;rb&#39;) as fhandle:
mime = MIMEBase(&#39;image&#39;,&#39;jpeg&#39;,filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;, filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-ID&#39;, &#39;<0>&#39;)
mime.add_header(&#39;X-Attachment-Id&#39;, &#39;0&#39;)
# 把附件的内容读进来:
mime.set_payload(fhandle.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)

server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
server.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件
server.quit()
1

실행 후. 테스트 사서함은 그림과 같이 이메일을 올바르게 받았습니다.

Summary

위 내용은 Python3이 SMTP 프로토콜을 사용하여 이메일 이메일을 보내는 방법의 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.