Python SMTP가 메일을 보냅니다.


SMTP(Simple Mail Transfer Protocol)는 단순 메일 전송 프로토콜로, 보낸 사람 주소에서 대상 주소로 메일을 전송하는 규칙 집합으로, 편지의 전송 방법을 제어합니다.

Python의 smtplib는 이메일을 보내는 매우 편리한 방법을 제공합니다. 이는 단순히 SMTP 프로토콜을 캡슐화합니다.

SMTP 개체를 생성하는 Python 구문은 다음과 같습니다.

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

매개변수 설명:

  • host: SMTP 서버 호스트. w3cschool.cc와 같이 호스트의 IP 주소 또는 도메인 이름을 지정할 수 있습니다. 이는 선택적 매개변수입니다.

  • port: 호스트 매개변수를 제공하는 경우 SMTP 서비스에서 사용하는 포트 번호를 지정해야 합니다. 일반적으로 SMTP 포트 번호는 25입니다.

  • local_hostname: SMTP가 로컬 컴퓨터에 있는 경우 서버 주소를 localhost로 지정하기만 하면 됩니다.

Python SMTP 개체는 sendmail 메서드를 사용하여 이메일을 보냅니다. 구문은 다음과 같습니다.

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

매개변수 설명:

  • from_addr: 이메일 전송 또는 주소.

  • to_addrs: 문자열 목록, 이메일 전송 주소.

  • msg: 메시지 보내기

여기에서 세 번째 매개변수인 msg는 이메일을 나타내는 문자열입니다. 이메일은 일반적으로 제목, 보낸 사람, 받는 사람, 이메일 내용, 첨부 파일 등으로 구성됩니다. 이메일을 보낼 때 메시지 형식에 주의하세요. 이 형식은 smtp 프로토콜에 정의된 형식입니다.

다음은 Python을 사용하여 이메일을 보내는 간단한 예입니다.

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import smtplib
from email.mime.text import MIMEText
from email.header import Header

sender = 'from@php.cn'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("php中文网", 'utf-8')
message['To'] =  Header("测试", 'utf-8')

subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')


try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    print "邮件发送成功"
except smtplib.SMTPException:
    print "Error: 无法发送邮件"

표준 이메일에는 세 개의 헤더가 필요합니다. 정보: From, To, 제목, 각 정보는 빈 줄로 직접 구분됩니다.

smtplib 모듈의 SMTP 개체 smtpObj를 인스턴스화하여 SMTP 액세스에 연결하고 sendmail 메서드를 사용하여 메시지를 보냅니다.

sendmail을 로컬에 설치하면 다음과 같이 출력됩니다.

$ python test.py 
邮件发送成功

받은 편지함(보통 휴지통에 있음)을 확인하면 이메일 정보를 볼 수 있습니다.

1029.jpg

로컬에서 sendmail 액세스 권한이 없는 경우 다른 이메일 서비스 제공업체(QQ, NetEase, Google 등)의 SMTP 액세스를 사용할 수도 있습니다.

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 第三方 SMTP 服务
mail_host="smtp.XXX.com"  #设置服务器
mail_user="XXXX"    #用户名
mail_pass="XXXXXX"   #口令 


sender = 'from@php.cn'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("php中文网", 'utf-8')
message['To'] =  Header("测试", 'utf-8')

subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')


try:
    smtpObj = smtplib.SMTP() 
    smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
    smtpObj.login(mail_user,mail_pass)  
    smtpObj.sendmail(sender, receivers, message.as_string())
    print "邮件发送成功"
except smtplib.SMTPException:
    print "Error: 无法发送邮件"

Python을 사용하여 HTML 형식으로 이메일 보내기

Python을 사용하여 HTML 형식으로 이메일을 보내는 것과 일반 텍스트 메시지를 보내는 것의 차이점은 MIMEText의 _subtype을 html로 설정하는 것입니다. 구체적인 코드는 다음과 같습니다:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import smtplib
from email.mime.text import MIMEText
from email.header import Header

sender = 'from@php.cn'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.php.cn">这是一个链接</a></p>
"""
message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("php中文网", 'utf-8')
message['To'] =  Header("测试", 'utf-8')

subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')


try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    print "邮件发送成功"
except smtplib.SMTPException:
    print "Error: 无法发送邮件"

위 프로그램을 실행합니다. 로컬 컴퓨터에 sendmail을 설치하면 다음이 출력됩니다.

$ python test.py 
邮件发送成功

받은 편지함(보통 휴지통에 있음)을 확인하면 됩니다. 이메일 정보:

1030.jpg


Python은 첨부 파일이 포함된 이메일을 보냅니다.

첨부 파일이 포함된 이메일을 보내려면 먼저 MIMEMultipart() 인스턴스를 생성한 다음 첨부 파일 구성 , 첨부 파일이 여러 개인 경우 순차적으로 구성하고 smtplib.smtp를 사용하여 최종적으로 보낼 수 있습니다.

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

sender = 'from@php.cn'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("php中文网", 'utf-8')
message['To'] =  Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')

#邮件正文内容
message.attach(MIMEText('这是php中文网Python 邮件发送测试……', 'plain', 'utf-8'))

# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)

# 构造附件2,传送当前目录下的 php.txt 文件
att2 = MIMEText(open('php.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="php.txt"'
message.attach(att2)

try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    print "邮件发送成功"
except smtplib.SMTPException:
    print "Error: 无法发送邮件"
$ python test.py 
邮件发送成功

받은 편지함(보통 휴지통)을 확인하면 이메일 정보를 볼 수 있습니다.

1031.jpg


HTML 텍스트에 사진 추가

이메일의 HTML 텍스트에 일반 이메일 서비스 제공업체가 외부 링크를 추가하는 것은 유효하지 않습니다. 돌파구를 올바르게 추가하는 예는 다음과 같습니다.

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header

sender = 'from@php.cn'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

msgRoot = MIMEMultipart('related')
msgRoot['From'] = Header("php中文网", 'utf-8')
msgRoot['To'] =  Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'
msgRoot['Subject'] = Header(subject, 'utf-8')

msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)


mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.php.cn">php中文网链接</a></p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))

# 指定图片为当前目录
fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()

# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)

try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, msgRoot.as_string())
    print "邮件发送成功"
except smtplib.SMTPException:
    print "Error: 无法发送邮件"
rrree

받은 편지함을 확인하세요(휴지통에 있는 경우). , 정상적으로 표시하려면받은 편지함으로 이동해야 할 수도 있습니다), 이메일 정보를 볼 수 있습니다:

1032.jpg

자세한 내용은 https://docs를 참조하세요. .python.org/2/library/email-examples.html.