crossin的编程教室python入门_简单三步,用 Python 发邮件

0. 前言

发送电子邮件是个很常见的开发需求。比如你写了个监控天气的脚本,发现第二天要下雨,或者网站上关注的某个商品降价了,就可以发个邮件到邮箱来提醒自己。

使用 Python 脚本发送邮件并不复杂。不过由于各家邮件的发送机制和安全策略不同,常常会因为一些配置问题造成发送失败。今天我们来举例讲讲如何使用 Python 发送邮件。

本文主要内容包括,了解发邮件的思路,发送邮件需要的一些设置,发送一封简单的邮件,发送一封包含附件的邮件,在写代码过程中我们需要注意哪些问题等等。(完整参考代码地址见文末)

1. 思路

使用脚本发送邮件的思路其实和客户端发送邮件一样,过程都是:

登录 —> 写邮件 —> 发送

只不过通过脚本发送时我们需要考虑到整个过程的方方面面。以下为思路导图:

2. Python-email 模块

与发送邮件相关的 Python 模块:

smtplib

是关于 SMTP(简单邮件传输协议)的操作模块,在发送邮件的过程中起到服务器之间互相通信的作用。

email

简单来说,即服务器之间通信的信息,包括信息头、信息主体等等。

举个简单的例子,当你登录邮箱,写好邮件后点击发送,这部分是由 SMTP 接管;而写邮件、添加附件是由 email 模块控制。

3. 开通电子邮箱的SMTP功能

在使用脚本发邮件之前,我们需要打开自己邮箱的 SMTP 功能,各家邮箱的设置方法就不一一讲述了,具体使用时可以百度一下,下面以 163 邮箱设置为例做一个简单的演示:

4. 简单代码

实践出真知,我们结合一个简单的代码来理解这一过程:登录 163 邮箱,向 qq 邮箱发送邮件。

脚本分为三个步骤:

设置好服务器端信息

邮件主体信息

登录发送

另外在处理文本时,我们需要使用 MIMEText 类。

import smtplib

from email.mime.text import MIMEText

#设置服务器所需信息

#163邮箱服务器地址

mail_host = 'smtp.163.com'

#163用户名

mail_user = '159*****02'

#密码(部分邮箱为授权码)

mail_pass = '7******x'

#邮件发送方邮箱地址

sender = '159*****02@163.com'

#邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发

receivers = ['59*****02@qq.com']

#设置email信息

#邮件内容设置

message = MIMEText('content','plain','utf-8')

#邮件主题

message['Subject'] = 'title'

#发送方信息

message['From'] = sender

#接受方信息

message['To'] = receivers[0]

#登录并发送邮件

try:

smtpObj = smtplib.SMTP()

#连接到服务器

smtpObj.connect(mail_host,25)

#登录到服务器

smtpObj.login(mail_user,mail_pass)

#发送

smtpObj.sendmail(

sender,receivers,message.as_string())

#退出

smtpObj.quit()

print('success')

except smtplib.SMTPException as e:

print('error',e) #打印错误

结果:

注意事项:

一些邮箱登录比如 QQ 邮箱需要 SSL 认证,所以 SMTP 已经不能满足要求,而需要SMTP_SSL,解决办法为:

#启动

smtpObj = smtplib.SMTP()

#连接到服务器

smtpObj.connect(mail_host,25)

#######替换为########

smtpObj = smtplib.SMTP_SSL(mail_host)

5. 带有附件的email

上面我们介绍了发送字符串的邮件,但这明显不满足现代邮件的需求,下面我们介绍如何发送内容以 HTML 格式,并且带有图片和文本文件的邮件。

处理多种形态的邮件主体我们需要 MIMEMultipart 类,而处理图片需要 MIMEImage 类。

import smtplib

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from email.mime.image import MIMEImage

#设置登录及服务器信息

mail_host = 'smtp.163.com'

mail_user = '159*****02'

mail_pass = '7******x'

sender = '159*****02@163.com'

receivers = ['7******0@qq.com']

#设置eamil信息

#添加一个MIMEmultipart类,处理正文及附件

message = MIMEMultipart()

message['From'] = sender

message['To'] = receivers[0]

message['Subject'] = 'title'

#推荐使用html格式的正文内容,这样比较灵活,可以附加图片地址,调整格式等

with open('abc.html','r') as f:

content = f.read()

#设置html格式参数

part1 = MIMEText(content,'html','utf-8')

#添加一个txt文本附件

with open('abc.txt','r')as h:

content2 = h.read()

#设置txt参数

part2 = MIMEText(content2,'plain','utf-8')

#附件设置内容类型,方便起见,设置为二进制流

part2['Content-Type'] = 'application/octet-stream'

#设置附件头,添加文件名

part2['Content-Disposition'] = 'attachment;filename="abc.txt"'

#添加照片附件

with open('1.png','rb')as fp:

picture = MIMEImage(fp.read())

#与txt文件设置相似

picture['Content-Type'] = 'application/octet-stream'

picture['Content-Disposition'] = 'attachment;filename="1.png"'

#将内容附加到邮件主体中

message.attach(part1)

message.attach(part2)

message.attach(picture)

#登录并发送

try:

smtpObj = smtplib.SMTP()

smtpObj.connect(mail_host,25)

smtpObj.login(mail_user,mail_pass)

smtpObj.sendmail(

sender,receivers,message.as_string())

print('success')

smtpObj.quit()

except smtplib.SMTPException as e:

print('error',e)

6.小结

通过上面的代码,想必大家已经对发邮件有了基本的认识。

从整体上我们要把握整个过程的思路:

登录

写邮件

发送

微观上我们需要了解:

smtplib/email 模块的代码规则;

什么时候使用 SMTP,什么时候使用 SMTP_SSL?

针对不同的邮件内容需要使用到不同的类,MIMEmultipart、MIMEText、MIMEIamge 等等;

怎么去设置附件信息

当然,看再多教程,不如亲自动手写一段代码。大家不妨都自己发一封邮件试一试。

在公众号(crossincode)中回复『email』,可以获取实例代码。

其他文章及回答:

Crossin的编程教室

微信ID:crossincode

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中线提取算法_综述|线结构光中心提取算法研究发展

摘 要: 线结构光扫描是三维重建领域的关键技术。光条纹中心提取算法是决定线结构光三维重建精度以及光条纹轮廓定位准确性的重要因素。本文详细阐述了光条纹中心提取算法的理论基础及发展历程,将现有算法分为三类,传统光条纹中心提取算法、基于传统光条纹…

oracle并行parallel update两张表_Oracle与并行性 parallel

Oracle与并行性并行化操作能力是巨型数据库(VeryLargeDatabase,简称VLDB)最重要的特性之一。带有多个CPU的数据库服务器,也被称作SMP,目前是大多数数据库服务器的标准配置。当性能需求以及数据量不断的增长,更加需要使用多处理器和…

创建数组_如何创建数组

js数组js的数组不是典型的数组典型的数组元素的数据类型相同使用连续的内存储存通过数字下标获取元素但是js的数组不这样元素的数据类型可以不同内存不一定连续的(对象是随机储存的)不可以通过数字下标,而是通过字符串下标这意味着数组可以有…

node.js 实现udp传输_Node.js实战15:通过udp传输文件。

本文将要写一个udp服务器,和一个udp客户端,并实现客户端发送文件给服务器。服务器端代码如下:var dgram require("dgram");server();function server(){var socket dgram.createSocket("udp4");socket.on("messag…

mysql在单片机移植_移植MySQL到嵌入式ARM平台

因为MySQL5.5之后,编译是用的cmake不再使用./configure,因此,只好倒回支持./configure的版本来用,这里使用了文档上的5.1.51版本。进行如下步骤完成移植:1) 下载mysql5.1.51:http://www.mirrorservice.org/…

mysql镜像压缩包使用_如何连接docker的mysql镜像

展开全部推荐使用Dockerfile方式。服务的管理使用的是supervisord, 因为dockerfile里只会有一个cmd生效,如果我想62616964757a686964616fe58685e5aeb931333361326332通过ssh去管理容器还要有mysql服务的启动起来 cmd的方式就无法实现,当然容器不需要以sshd的方式去管…

mysql导出数据 程序_mysql导出数据

导出某库全表为SQL语句直接导出某库全表(包括表设计和表数据)为SQL语句mysqldump -h172.16.*.* -uroot -p somedatabase sometable > somewhere/table.sql导出某个表为特定文件格式导出某个表为特定文件格式(txt, xls)(只是数据)可以通过sql自行过滤某些数据mysql -h172.16.…

mysql通用日志不打印_解决logback不打印mybatis的SQL日志的问题

工作这么多年,今天还是因为Logback的这个问题稍微卡了一下,惭愧。问题描述:logback配置了如下信息:...此处省略File Appender内容${logbase}sql.%d{yyyy-MM-dd}.log30[%d{yyyy-MM-dd HH:mm:ss} [%t] [%X{traceId}] %5p %c:%L] %m%…

alibaba 实体转json_com.alibaba.fastjson 转换List Map等对象

原文:http://www.cnblogs.com/goody9807/p/4244862.html本文讲解2点:1. fastjson生成和解析json数据(举例:4种常用类型:JavaBean,List,List,List)2.通过一个android程序测试fastjson的用法。fastjson简介:Fastjson是一个Java语言编…

centos mysql rpm re_centos7和centos6.5环境rpm方式安装mysql5.7和mysql5.6详解

centos环境安装mysql5.7其实不建议安装mysql5.7 语法和配置可能和以前的版本区别较大,多坑,慎入1.yum方式安装(不推荐)a.安装mysql5.7 yum源centos6:wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpmyum localinstall mysql-community-…

mysql galera haproxy_安装配置Haproxy代理MySQL Galera集群

这篇文章,我讲介绍如何为MariaDB Galera 集群添加负载均衡,大致步骤如下:确认所有Galera节点作为一个单一集群运行(所有节点都是主节点而且相互同步)安装Haproxy(你可以安装到独立的服务器或者应用服务器)配置集群监控检测脚本,用…

nvme固态硬盘开机慢_为何我使用了固态硬盘开机速度还是需要20-30秒

1、加速网上邻居在Windows XP中访问网上邻居是相当恼人的,系统会搜索自己的共享目录和可作为网络共享的打印机以及计划任务中和网络相关的计划任务,然后才显示出来,显然这样速度就会比Windows 9x中慢很多。其实这些功能我们并没有使用上&…

高性能mysql看不懂_高性能mysql笔记1

转载请注明&#xff1a;TheViper http://www.cnblogs.com/TheViper<>这本书写的真的很好&#xff0c;只可惜本屌不才&#xff0c;大部分都看不懂&#xff0c;暂且记下与mysql优化有关&#xff0c;对自己有用的东西。测试指标吞吐量吞吐量指的是单位时间内的事务处理数&am…

python 热词分析_Python笔记:热词分析2020-01-01

热词分析在公众趋势分析、舆情分析有很宽广的应用&#xff0c;我们来看看怎么从一个TXT文件中分析出文章的热词出来&#xff0c;我们采用流行的第三方“结巴”包来实现。首先安装第三方包(matplotlib&#xff0c;jieba&#xff0c;wordcloud&#xff0c;numpy)mmatplotlib主要来…

子进程会继承父进程的哪些内容_【学习教程】Node.js创建子进程方法

来源 | https://github.com/CommanderXL/biu-blog/issues/25exec其中exec可用于在指定的shell当中执行命令。不同参数间使用空格隔开&#xff0c;可用于复杂的命令。const { exec } require(child_process)exec(cat *.js bad_file | wc -l)exec方法用于异步创建一个新的子进程…

python元编程运用_Python 中的元编程

就像元数据是有关数据的数据一样&#xff0c;元编程就是编写用于操纵程序的某些程序。人们普遍认为&#xff0c;元程序就是生成其他程序的某些程序&#xff0c;但范式更加广泛。所有旨在自我读取、分析、转换或修改的程序都是元编程的范例。例如&#xff1a;领域特定语言 (DSL)…

wamp怎么安装mysql服务器_用wamp的mysq安装pythonmysql

(我不确定这是应该在这里问还是在苏。。但是看到this question就这样&#xff0c;我在这里要求它…)我在我的vista机器上安装了wamp(mysql-5.1.33)服务器&#xff0c;我正试图安装pythonmysql 1.2.3c1&#xff0c;以使用wamp提供的mysql版本。在起初&#xff0c;当我运行python…

mysql筛选两个表有相同项的数据库_用SQL查询两个表中相同的数据

展开全部 1、创建测试表; create table test_col_1(id number, var varchar2(200)); create table test_col_2(id number, var varchar2(200)); 2、插入测试数据, insert into test_col_1 select level*8, var||32313133353236313431303231363533e59b9ee7ad9431333431373839l…

MySQL建表添加乐观锁字段_Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化...

Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化项目介绍基于SpringBootMybatis搭建的秒杀系统&#xff0c;并且针对高并发场景进行了优化&#xff0c;保证线程安全的同时极大地提高了服务器的吞吐量&#xff0c;主要优化手段有页面静态化、Redis缓存(页…

叶金荣mysql教程_mysql优化--叶金荣老师讲座笔记

copy to tmp table执行ALTER TABLE修改表结构时建议&#xff1a;凌晨执行Copying to tmp table拷贝数据到内存中的临时表&#xff0c;常见于GROUP BY操作时建议&#xff1a;创建索引Copying to tmp table on disk临时结果集太大&#xff0c;内存中放不下&#xff0c;需要将内存…