Table des matières
相关模块
smtplib模块
email模块
几个实例代码
发送普通文本邮件
发送Html格式邮件
发送带附件的邮件
发送带图片的邮件
hello
一个综合示例
代码下载
Maison interface Web tutoriel HTML 使用Python发送邮件_html/css_WEB-ITnose

使用Python发送邮件_html/css_WEB-ITnose

Jun 24, 2016 am 11:25 AM

Python是一门很简单和强大的语言,在熟悉其他编程语言的基础上,可以很快的入门Python。Python本身内置了很多工具模块,远比C++方便的多(当然各自的适合场景不同)。

这里简单介绍下我使用python中email模块发送邮件的相关知识。

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。python发送邮件主要使用到了smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

相关模块

smtplib模块

smtplib.SMTP()smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])
Copier après la connexion

SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接可以向smtp服务器发送指令,执行相关操作(如:登陆、发送邮件)。所有参数都是可选的。参数意义如下:

 host:smtp服务器主机名 port:smtp服务的端口,默认是25;如果在创建SMTP对象的时候提供了这两个参数,在初始化的时候会自动调用connect方法去连接服务器。
Copier après la connexion

smtplib模块还提供了SMTP_SSL类和LMTP类,对它们的操作与SMTP基本一致。

smtplib.SMTP提供的方法:

 SMTP.set_debuglevel(level):#设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息。 SMTP.connect([host[, port]]):#连接到指定的smtp服务器。参数分别表示smpt主机和端口。注意: 也可以在host参数中指定端口号(如:smpt.yeah.net:25),这样就没必要给出port参数。 SMTP.docmd(cmd[, argstring]):向smtp服务器发送指令。可选参数argstring表示指令的参数。 SMTP.helo([hostname]) :使用"helo"指令向服务器确认身份。相当于告诉smtp服务器“我是谁”。 SMTP.has_extn(name):判断指定名称在服务器邮件列表中是否存在。出于安全考虑,smtp服务器往往屏蔽了该指令。 SMTP.verify(address) :判断指定邮件地址是否在服务器中存在。出于安全考虑,smtp服务器往往屏蔽了该指令。 SMTP.login(user, password) :登陆到smtp服务器。现在几乎所有的smtp服务器,都必须在验证用户信息合法之后才允许发送邮件。 SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]) :发送邮件。这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。 SMTP.quit() :断开与smtp服务器的连接,相当于发送"quit"指令。
Copier après la connexion

email模块

emial模块用来处理邮件消息,包括MIME和其他基于RFC 2822 的消息文档。使用这些模块来定义邮件的内容,是非常简单的。其包括的类有( 点此查看更加详细的介绍):

class email.mime.base.MIMEBase(_maintype, _subtype, **_params):这是MIME的一个基类。一般不需要在使用时创建实例。其中_maintype是内容类型,如text或者image。_subtype是内容的minor type 类型,如plain或者gif。 **_params是一个字典,直接传递给Message.add_header()。class email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]]:MIMEBase的一个子类,多个MIME对象的集合,_subtype默认值为mixed。boundary是MIMEMultipart的边界,默认边界是可数的。class email.mime.application.MIMEApplication(_data[, _subtype[, _encoder[, **_params]]]):MIMEMultipart的一个子类。class email.mime.audio. MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]]): MIME音频对象class email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]]):MIME二进制文件对象。class email.mime.message.MIMEMessage(_msg[, _subtype]):具体的一个message实例.class email.mime.text.MIMEText(_text[, _subtype[, _charset]]):MIME文本对象,其中_text是邮件内容,_subtype邮件类型,可以是text/plain(普通文本邮件),html/plain(html邮件),  _charset编码,可以是gb2312等等。
Copier après la connexion

几个实例代码

发送普通文本邮件

#!/usr/bin/env python# -*- coding: utf-8 -*-import smtplibfrom email.mime.text import MIMETextfrom email.Header import Headerdef sendMailText(title, content, sender, receiver, serverip, serverport, username, pwd):    msg = MIMEText(content, _subtype="plain", _charset="utf-8")    # 设置正文为符合邮件格式的HTML内容    msg['Subject'] = Header(title, "utf-8")     # 设置邮件标题    msg['From'] = sender                        # 设置发件人    msg['To'] = receiver                        # 设置收件人    s = smtplib.SMTP(serverip, serverport)      # 注意!如果是使用SSL端口,这里就要改为SMTP_SSL    #s.ehlo()    #s.starttls()    s.login(username, pwd)                      # 登陆邮箱    s.sendmail(sender, receiver, msg.as_string())  # 发送邮件if __name__ == "__main__":    config = {    "from": "XXXXXXXXX@163.com",            # 发件人邮箱    "to": "YYYYYYYYYY@163.COM",             # 收件人邮箱    "serverip": "smtp.163.com",             # 发件服务器IP    "serverport":"25",                      # 发件服务器Port    "username": "XXXXXXXXX@163.com",        # 发件人用户名    "pwd": "AAAAAAAAAAAAAA"                 # 发件人密码    }    title = "python send mail"    body = "<a href='http://cpper.info'>cpper</a>"    sendMailText(title, body, config['from'], config['to'], config['serverip'], config['serverport'], config['username'], config['pwd'])
Copier après la connexion

发送Html格式邮件

与上面介绍的文本邮件基本一致,除了一点不同:

msg = MIMEText(content, _subtype="html", _charset="utf-8")
Copier après la connexion

发送带附件的邮件

如果发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

def sendMailWithAttachment(title, content, sender, receiver, serverip, serverport, username, pwd, attach = {}):    attachsize = len(attach)    if attachsize > 0 :        print 'send attach'        msg = MIMEMultipart()   #创建一个带附件的实例        for path, name in attach.items():            print path, name            if os.path.exists(path):                att = MIMEText(open(path, 'rb').read(), 'base64', 'gb2312')   #构造附件                att["Content-Type"] = 'application/octet-stream'                att["Content-Disposition"] = 'attachment; filename="' + name + '"'                msg.attach(att)                # http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html 提示发送病毒或垃圾邮件 554, 'DT:SPM 163    else:        msg = MIMEText(content, _subtype="html", _charset="utf-8")    # 设置正文为符合邮件格式的HTML内容    msg['Subject'] = Header(title, "gb2312")    # 设置邮件标题    msg['From'] = sender                        # 设置发件人    msg['To'] = receiver                        # 设置收件人    s = smtplib.SMTP(serverip, serverport)      # 注意!如果是使用SSL端口,这里就要改为SMTP_SSL    s.login(username, pwd)                      # 登陆邮箱    s.sendmail(sender, receiver, msg.as_string())  # 发送邮件attach = {}  # key : 要发送的文件,需要存在,否则读取不到:value :自定义发送邮件中的文件名attach['sendEmail.py'] = '1.py'  attach['memset.cpp'] = '2.c'#attach['noexist.cpp'] = '3.cpp'sendMailWithAttachment(title, body, config['from'], config['to'], config['serverip'], config['serverport'], config['username'], config['pwd'], attach)
Copier après la connexion

发送带图片的邮件

def sendMailWithImage(title, content, sender, receiver, serverip, serverport, username, pwd, images = []):    imagesize = len(images)    if imagesize > 0 :        msg = MIMEMultipart()   #创建一个带附件的实例        for path in images:            print path            if os.path.exists(path):                image = MIMEImage(open(path,'rb').read())                name = path.split(os.sep)[-1]                image.add_header("Content-Disposition", "attachment", filename=name)                image.add_header('Content-ID', '<0>')                image.add_header('X-Attachment-Id', '0')                    # We reference the image in the IMG SRC attribute by the ID we give it below                         #msg.attach(MIMEText('

hello

' + '

使用Python发送邮件_html/css_WEB-ITnose

' + '', 'html', 'utf-8')) msg.attach(image) else: msg = MIMEText(content, _subtype="html", _charset="utf-8") # 设置正文为符合邮件格式的HTML内容 msg['Subject'] = Header(title, "gb2312") # 设置邮件标题 msg['From'] = sender # 设置发件人 msg['To'] = receiver # 设置收件人 s = smtplib.SMTP(serverip, serverport) # 注意!如果是使用SSL端口,这里就要改为SMTP_SSL s.login(username, pwd) # 登陆邮箱 s.sendmail(sender, receiver, msg.as_string()) # 发送邮件
Copier après la connexion

一个综合示例

# 发送含有各种元素的邮件def sendMail(title, content, sender, receiver, serverip, serverport, username, pwd, attach = {}, images = {}):    msg = MIMEMultipart()    msg['Subject'] = Header(title, "utf-8")     # 设置邮件标题    msg['From'] = sender                        # 设置发件人    msg['To'] = receiver                        # 设置收件人    #msg['To'] = ";".join(receiver)             # 多个收件人    attachsize = len(attach)    if attachsize > 0 :        print 'send attach'        for path, name in attach.items():            3print path, name            if os.path.exists(path):                att = MIMEText(open(path, 'rb').read(), 'base64', 'gb2312')   #构造附件                att["Content-Type"] = 'application/octet-stream'                att["Content-Disposition"] = 'attachment; filename="' + name + '"'                print att["Content-Disposition"]                msg.attach(att)    imagesize = len(images)    if imagesize > 0 :        for path, name in images.items():            #print path, name            if os.path.exists(path):                image = MIMEImage(open(path,'rb').read())                #image = MIMEImage(open(path,'rb').read(), _subtype="jpg")                image.add_header("Content-Disposition", "attachment", filename=name)                image.add_header('Content-ID', '<0>')                image.add_header('X-Attachment-Id', '0')                msg.attach(image)    s = smtplib.SMTP(serverip, serverport)      # 注意!如果是使用SSL端口,这里就要改为SMTP_SSL    s.login(username, pwd)                      # 登陆邮箱    s.sendmail(sender, receiver, msg.as_string())  # 发送邮件if __name__ == "__main__":    config = {        "from": "XXXXXXXXX@163.com",            # 发件人邮箱        "to": "YYYYYYYYYY@163.COM",             # 收件人邮箱        "serverip": "smtp.163.com",             # 发件服务器IP        "serverport":"25",                      # 发件服务器Port        "username": "XXXXXXXXX@163.com",        # 发件人用户名        "pwd": "AAAAAAAAAAAAAA"                 # 发件人密码    }    title = "python send mail"    body = "<a href='http://cpper.info'>cpper</a>"    attach = {}  # key : 要发送的文件,需要存在,否则读取不到:value :自定义发送邮件中的文件名    attach['sendEmail.py'] = '1.py'      attach['memset.cpp'] = '2.c'    attach['noexist.cpp'] = '3.cpp'    images = {}    images['lizheng3.jpg'] = '1.jpg'    sendMail(title, body, config['from'], config['to'], config['serverip'], config['serverport'], config['username'], config['pwd'], attach, images)
Copier après la connexion

代码下载

本文所有代码可以点此下载:sendEmail.py。

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quel est le but du & lt; Progress & gt; élément? Quel est le but du & lt; Progress & gt; élément? Mar 21, 2025 pm 12:34 PM

L'article traite du HTML & lt; Progress & GT; élément, son but, son style et ses différences par rapport au & lt; mètre & gt; élément. L'objectif principal est de l'utiliser & lt; Progress & gt; pour l'achèvement des tâches et & lt; mètre & gt; pour stati

Quel est le but du & lt; datalist & gt; élément? Quel est le but du & lt; datalist & gt; élément? Mar 21, 2025 pm 12:33 PM

L'article traite du HTML & lt; Datalist & GT; élément, qui améliore les formulaires en fournissant des suggestions de saisie semi-automatique, en améliorant l'expérience utilisateur et en réduisant les erreurs. COMMANDE COMPRES: 159

Quel est le but du & lt; mètre & gt; élément? Quel est le but du & lt; mètre & gt; élément? Mar 21, 2025 pm 12:35 PM

L'article traite du HTML & lt; mètre & gt; élément, utilisé pour afficher des valeurs scalaires ou fractionnaires dans une plage, et ses applications courantes dans le développement Web. Il différencie & lt; mètre & gt; De & lt; Progress & gt; et ex

Quelle est la balise Meta de la fenêtre? Pourquoi est-ce important pour une conception réactive? Quelle est la balise Meta de la fenêtre? Pourquoi est-ce important pour une conception réactive? Mar 20, 2025 pm 05:56 PM

L'article traite de la balise Meta de la fenêtre, essentielle pour la conception Web réactive sur les appareils mobiles. Il explique comment une utilisation appropriée garantit une mise à l'échelle optimale du contenu et une interaction utilisateur, tandis que la mauvaise utilisation peut entraîner des problèmes de conception et d'accessibilité.

Quel est le but du & lt; iframe & gt; étiqueter? Quelles sont les considérations de sécurité lorsque vous l'utilisez? Quel est le but du & lt; iframe & gt; étiqueter? Quelles sont les considérations de sécurité lorsque vous l'utilisez? Mar 20, 2025 pm 06:05 PM

L'article traite du & lt; iframe & gt; L'objectif de Tag dans l'intégration du contenu externe dans les pages Web, ses utilisations courantes, ses risques de sécurité et ses alternatives telles que les balises d'objet et les API.

HTML est-il facile à apprendre pour les débutants? HTML est-il facile à apprendre pour les débutants? Apr 07, 2025 am 12:11 AM

HTML convient aux débutants car il est simple et facile à apprendre et peut rapidement voir les résultats. 1) La courbe d'apprentissage de HTML est fluide et facile à démarrer. 2) Il suffit de maîtriser les balises de base pour commencer à créer des pages Web. 3) Flexibilité élevée et peut être utilisée en combinaison avec CSS et JavaScript. 4) Les ressources d'apprentissage riches et les outils modernes soutiennent le processus d'apprentissage.

Les rôles de HTML, CSS et JavaScript: responsabilités de base Les rôles de HTML, CSS et JavaScript: responsabilités de base Apr 08, 2025 pm 07:05 PM

HTML définit la structure Web, CSS est responsable du style et de la mise en page, et JavaScript donne une interaction dynamique. Les trois exercent leurs fonctions dans le développement Web et construisent conjointement un site Web coloré.

Quel est un exemple d'une balise de départ dans HTML? Quel est un exemple d'une balise de départ dans HTML? Apr 06, 2025 am 12:04 AM

Anexampleofastartingtaginhtmlis, qui abinginsaparagraph.startingtagsaressentialtinhtmlastheyinitiateelements, définit les éventualités, et la faculté de réduction des pages et de la construction de la création.

See all articles