Python3 SMTP menghantar mel


SMTP (Simple Mail Transfer Protocol) ialah protokol pemindahan mel yang ringkas Ia adalah satu set peraturan untuk menghantar mel dari alamat sumber ke alamat destinasi, yang mengawal kaedah pemindahan surat.

Smtplib Python menyediakan cara yang sangat mudah untuk menghantar e-mel. Ia hanya merangkum protokol SMTP.

Sintaks untuk mencipta objek SMTP dalam Python adalah seperti berikut:

import smtplib

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

Penerangan parameter:

  • hos: hos pelayan SMTP. Anda boleh menentukan alamat IP atau nama domain hos seperti: w3cschool.cc Ini adalah parameter pilihan.

  • port: Jika anda memberikan parameter hos, anda perlu menentukan nombor port yang digunakan oleh perkhidmatan SMTP Secara amnya, nombor port SMTP ialah 25.

  • local_hostname: Jika SMTP berada pada mesin tempatan anda, anda hanya perlu menentukan alamat pelayan sebagai localhost.

Objek Python SMTP menggunakan kaedah sendmail untuk menghantar e-mel Sintaks adalah seperti berikut:

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

Perihalan parameter:

  • <. 🎜>from_addr: Penghantaran atau alamat e-mel.

  • to_addrs: senarai rentetan, alamat penghantaran e-mel.

  • msg: Hantar mesej

Sila ambil perhatian parameter ketiga di sini, msg ialah rentetan, mewakili e-mel. Kami tahu bahawa e-mel secara amnya terdiri daripada tajuk, penghantar, penerima, kandungan e-mel, lampiran, dll. Semasa menghantar e-mel, perhatikan format mesej. Format ini ialah format yang ditakrifkan dalam protokol smtp.

Contoh

Berikut ialah contoh mudah menghantar e-mel menggunakan Python:

#!/usr/bin/python3

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: 无法发送邮件")

Kami menggunakan tiga tanda petikan untuk menetapkan maklumat e-mel standard maklumat:

Dari, Kepada, dan Subjek, setiap maklumat dipisahkan secara langsung oleh baris kosong.

Kami menyambung ke akses SMTP dengan membuat seketika objek SMTP modul smtplib

smtpObj dan menggunakan kaedah sendmail untuk menghantar mesej.

Laksanakan program di atas Jika anda memasang sendmail pada mesin tempatan anda, ia akan mengeluarkan:

$ python3 test.py 
邮件发送成功

Semak peti masuk kami (biasanya dalam tong sampah), anda boleh melihat maklumat e-mel:

1029.jpg

Jika kami tidak mempunyai akses sendmail secara setempat, kami juga boleh menggunakan akses SMTP daripada pembekal perkhidmatan lain (QQ, NetEase, Google, dll.).

#!/usr/bin/python3

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: 无法发送邮件")


Gunakan Python untuk menghantar e-mel dalam format HTML

Perbezaan antara menghantar e-mel dalam format HTML dengan Python dan menghantar mesej teks biasa adalah untuk menetapkan _subtype dalam MIMEText kepada html. Kod khusus adalah seperti berikut:

#!/usr/bin/python3

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: 无法发送邮件")

Jalankan program di atas Jika anda memasang sendmail pada mesin tempatan anda, ia akan mengeluarkan:

$ python3 test.py 
邮件发送成功

Semak peti masuk kami (biasanya dalam tong sampah) dan anda. boleh melihatnya Maklumat e-mel:

1030.jpg


Python menghantar e-mel dengan lampiran

Untuk menghantar e-mel dengan lampiran, mula-mula buat tika MIMEMultipart() dan kemudian bina lampiran , jika terdapat berbilang lampiran, ia boleh dibina secara berurutan dan akhirnya dihantar menggunakan smtplib.smtp.

#!/usr/bin/python3

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: 无法发送邮件")
$ python3 test.py 
邮件发送成功

Semak peti masuk kami (biasanya dalam tong sampah) dan anda boleh melihat maklumat e-mel:

1031.jpg


Tambahkan gambar pada teks HTML

Dalam teks HTML e-mel, adalah tidak sah untuk pembekal perkhidmatan e-mel am untuk menambah pautan luaran Contoh menambah kejayaan dengan betul adalah seperti berikut:

#!/usr/bin/python3

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

Semak peti masuk kami (jika ia berada dalam tong sampah. , ia mungkin perlu dialihkan ke peti masuk untuk dipaparkan seperti biasa), anda boleh melihat maklumat e-mel:

1032.jpg

Untuk maklumat lanjut, sila rujuk: https://docs .python.org/3/ library/email-examples.html.