3.python 发送邮件之smtplib模块

2023-05-16

 

 

SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到目的地址的邮件传输规则。

python中对SMTP进行了简单的封装,可以发送纯文本邮件,HTML邮件以及带附件的邮件

python创建SMTP对象语法如下:


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

参数说明:

  • host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: runoob.com,这个是可选参数。
  • port: 如果你提供了 host 参数, 你需要指定 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 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。

  • email模块:负责构建邮件
  • smtplib模块:负责发送邮件

email模块:支持发送的邮件内容为纯文本,HTML内容,图片,附件。email模块中有几类来针对不同的邮件内容形式,常用如下:

  • MIMEText : (MIME媒体类型)内容形式为纯文本,HTML页面(导入方式 : from email.mime.text import MIMEText)
  • MIMEImage : 内容形式为图片(导入方式 : from email.mime.image import MIMEImage)
  • MIMEMultupart : 多形式组合,可包含文本和附件(导入方式 : from email.mime.multipart import MIMEMultipart)

1.MIMEText语法:


MIMEText(msg,type,chartset)  

msg:文本内容

type:文本类型默认为plain(纯文本)

#发送HTML格式的时候,修改为html,但同时要求msg的内容也是html的格式。

chartset:文本编码,中文为“utf-8”

# 构造TEXT格式的消息

  msg = MIMEText("hello.text","plain","utf-8")

  msg["Subject"] = "xxxxx"

  msg["From"] = "xxxx"

  msg["To"] = "xxxx"

#发送以上构造的邮件内容要使用as_string将构造的邮件内容转换为string形式。

  s.sendmail("xxx","xxx",msg.as_string)

2.MIMEImage,MIMEMultipart语法

msg = MIMEMultipart()

#实例化一个文本对象 

msg_sub = MIMEText("hello.text","plain","utf-8")

#将text消息添加到MIMEMultipart中,作为邮件正文。

msg.attach(msg_sub)

 

#图片作为附件

import os

img_datas = open(os.getcwd()+ "/reports/xxxx.png","rb").read()

msg_img = MIMEImage(img_data)

msg_img.add_header('Content-Disposition','attachment', filename = "xxxx.png" )

msg_img.add_header('Content-ID','<0>')

#将图片添加到MIMEMultiplart中,作为附件发送。

msg.attach(mag_img)

~~~~~~~~~~~~~~~~~

下面来看具体代码:

发送文本邮件


# coding=utf-8
import smtplib
from email.mime.text import MIMEText
# 发送纯文本格式的邮件
msg = MIMEText('hello,send by python_test...','plain','utf-8')
#发送邮箱地址
sender = 'bmjoker@163.com'
#邮箱授权码,非登陆密码
password = 'xxxxxxx'
#收件箱地址
#receiver = '19xxxxxxx9@qq.com'
mailto_list = ['19xxxxxxx9@qq.com']   #群发邮箱地址

#smtp服务器
smtp_server = 'smtp.163.com'
#发送邮箱地址
msg['From'] = sender
#收件箱地址
#msg['To'] = receiver
msg['To'] =';'.join(mailto_list)  #发送多人邮件写法
#主题 
msg['Subject'] = 'hello,i just want to test'

server = smtplib.SMTP(smtp_server,25)  # SMTP协议默认端口是25
server.login(sender,password)          #ogin()方法用来登录SMTP服务器
server.set_debuglevel(1)               #打印出和SMTP服务器交互的所有信息。
server.sendmail(sender,mailto_list,msg.as_string()) #msg.as_string()把MIMEText对象变成str server.quit()

# 第一个参数为发送者,第二个参数为接收者,可以添加多个例如:['hello@163.com','xxx@qq.com',]# 第三个参数为发送的内容
server.quit()  

查看和SMTP服务器交互的所有信息:

其中login()用来登陆SMTP服务器,sendmail()用来发送邮件,群发邮件的话,可以传入一个收件人邮箱列表,邮箱的正文是str,使用as_string()把MIMEText对象变成str,password指的不是smtp服务器的登陆密码,是smtp客户端的授权密码:

发送带HTML的邮件:


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

sender = 'bmjoker@163.com' #发件邮箱
passwd = 'xxxxxxxx' #发送人邮箱授权码
receivers = '19xxxxxxx9@qq.com'   #收件邮箱

subject = 'python发邮Html邮件测试' #主题

content = "<html><h1>人生苦短,我是bmjoker</h1></html>"
msg = MIMEText(content,'html','utf-8')
# msg['Subject'] = subject
msg['Subject'] = Header(subject,'utf-8')
# msg['From'] = sender
msg['From'] = Header('hello','utf-8')
# msg['To'] = receivers
msg['To'] = Header('emmmm','utf-8')
try:
    s = smtplib.SMTP_SSL('smtp.163.com',25)
    s.login(sender,passwd)
    s.sendmail(sender,receivers,msg.as_string())
    print('Send Success')

except:
    print('Send Failure')  

emmm....遇到554/553问题居多,如果失败,请参考smtp退信排错:http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html

另附常见的邮箱服务器(pop3,smtp)地址,端口:

http://www.cnblogs.com/grefr/p/6089079.html

 

发送带图片的邮件:


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

sender = 'bmjoker@163.com'
passwd = 'xxxxxxxx'
receivers = '19xxxxxx9@qq.com'
subject = 'python发邮带img的邮件测试' #主题

# 创建一个带附件的实例
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = receivers

# 创建正文
msg.attach(MIMEText('使用python smtplib模块和email模块自动发送邮件测试','plain','utf-8'))

# 创建图片附件
import os
img_file = open(os.getcwd()+"/a4.jpg",'rb').read()
msg_img = MIMEImage(img_file)
msg_img.add_header('Content-Disposition','attachment', filename = "a4.jpg")
msg_img.add_header('Content-ID', '<0>')
msg.attach(msg_img)

try:
    s = smtplib.SMTP('smtp.163.com',25)
    s.set_debuglevel(1) #输出发送邮件详细过程
    s.login(sender,passwd)
    s.sendmail(sender,receivers,msg.as_string())
    print('Send Succese')

except:
    print('Send Failure')  

提示发送成功,不过emmm....

可能TX被APT攻击吓坏了吧....

 

发送带附件的邮件:


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

sender = 'bmjoker@163.com'  #发件邮箱
passwd = 'xxxxxxxxxx'  # 邮箱授权码
receivers = '19xxxxxx9@qq.com'  #收件邮箱

subject = 'python发带附件的邮件测试' #主题
# 创建一个带附件的实例
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = receivers

#创建正文,将文本文件添加到MIMEMultipart中
msg.attach(MIMEText('使用python smtplib模块和email模块自动发送邮件测试','plain','utf-8'))

#构造附件1,传送当前目录下  文件
att1 = MIMEText(open('testdata.xlsx','rb').read(),'base64','utf-8') # rb以二进制方式读取
# att1["Content-Type"] = 'application/octet-stream'
# filename为附件名称,可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename = "testdata.xlsx" '
#将附件添加到MIMEMultipart中
msg.attach(att1)

#构造附件2
att2 = MIMEText(open('db.cfg','rb').read(),'base64','utf-8')
# att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename = "db.cfg" '
#将附件添加到MIMEMultipart中
msg.attach(att2)

try:
    s = smtplib.SMTP('smtp.qq.com',25)
    s.set_debuglevel(1) #输出发送邮件详细过程
    s.login(sender,passwd)
    s.sendmail(sender,receivers,msg.as_string())
    print('Send Succese')

except:
    print('Send Failure')  

 

转载于:https://www.cnblogs.com/bmjoker/p/10561522.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3.python 发送邮件之smtplib模块 的相关文章

随机推荐

  • java 下划线开头_java-清洁代码-以下划线开头的受保护方法的...

    我正在阅读Bob叔叔的Clean Code 本书在第16章中介绍了如何重构示例 有一部分我无法抓住以这种方式写作的目的 gt 在这里使用保护关键字的目的是什么 xff1f gt 为什么诸如 getMinimumYear 之类的某些方法以下划
  • 使用 Word 2013 维护博客

    博客的发布 修改是一件非常耗时 耗精力的事情 借助 Word 2013 xff0c 维护博客将变得非常简单 1 新建博客文章 运行 Word 2013 xff0c 新建文档 如下图所示 xff1a 图 1 鼠标左键单击上图的 34 博客文章
  • SHTC3温湿度传感器的使用

    1 SHTC3简单说明 SHTC3是一个检测温度 湿度的传感器 xff0c 可以检测 40 125 的温度范围和0 100 的湿度范围 SHTC3的工作电压范围为 xff1a 1 62V 3 6V SHTC3使用的通讯方式是I2C xff0
  • mysql5.7报错1251_MySQL修改root密码的一些问题以及navicat连接1251错误

    闲来无事 xff0c 突然想学个MySQL xff0c 没想到开头就是这么难 xff0c 关于修改root密码可谓是一波三折 而这之中曲折的罪魁祸首这是MySQL的版本问题 xff0c 下面我就分为两部分来说说修改root密码 xff0c
  • Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    1 CMake编译原理 CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLists txt文件 xff0c 然后用cmake命令将CMakeLists txt文件
  • eclipse运行mapreduce的wordcount

    1 xff0c eclipse安装hadoop插件 插件下载地址 xff1a 链接 https pan baidu com s 1U4 6kLFNiKeLsGfO7ahXew 提取码 as9e 下载hadoop eclipse plugin
  • 软件测试时间被压缩,应如何应对

    紧急情况下测试周期被压缩在国内大多数公司都会出现这种情况 那出现这种情况该如何去面对并展开测试呢 首先我们需要弄清楚是什么原因导致出现这种情况 到底是内部原因导致还是外部原因导致 说到底如果是外部原因导致基本都是由于需求变更引起的 内部原因
  • 在winform界面上实现伸缩功能

    要想在winform界面点击某个按钮或是图标 xff0c 实现某个区域的伸缩 xff0c 而且界面的布局还要随着一起变化 xff0c 看似不好实现 xff0c 因为他们的在winform上的依据坐标点来排兵布局的 xff0c 但是也不是不能
  • Android开发mac /dev/kvm is not found

    主要内容 1 错误起因 2 错误提示 3 解决问题办法 一 错误起因 运行项目的时候选择部署目标的弹出来如下错误提示 xff0c 如图 xff1a 二 错误提示 dev kvm is not found 三 解决问题办法 首先去Androi
  • 华为解锁BL

    华为手机要怎么查看手机是否需要解锁呢 相信许多机油都不懂自己入手的手机是否需要解锁 而华为手机自华为C8812之后的高通手机均需要先解锁才能够尽兴刷机或获取Root权限的 那么下面我给大家分享一下华为手机查看是否需要解锁的查看教程 方法 步
  • ---rk3399 平台出现不出桌面问题解决

    有开机动画 xff0c 有如下错误 xff1a drm vop afbdc atomic check ERROR not support afbdc 关掉afbdc功能 xff0c 就好了 xff01 hardware rockchip l
  • Hadoop MapReduce编程 API入门系列之统计学生成绩版本2(十八)

    不多说 xff0c 直接上代码 统计出每个年龄段的 男 女 学生的最高分 这里 xff0c 为了空格符的差错 xff0c 直接 xff0c 我们有时候 xff0c 像如下这样的来排数据 代码 package zhouls bigdata m
  • C# 窗体显示自定义位置,任意位置,窗体显示在屏幕下方

    由于项目需要 xff0c 打开窗体的位置要位于屏幕的右下方 xff0c 所以默认的位置解决不了 xff0c 那就自定义显示位置 xff0c 可以设置显示到任意位置 我的窗体大小为240 109 xff0c 在显示器的右下角打开 int Wi
  • GoldenGate 复制进程报错"OGG-01296 Error mapping",丢弃文件报错“Mapping problem with delete record (target format)...

    故障描述 xff1a 1 复制进程 Abended xff0c 通过 view report语句查看可发现类似如下的报错 xff1a 2017 10 23 15 01 43 ERROR OGG 01296 Error mapping fro
  • MySQL在远程访问时非常慢的解决skip-name-resolve

    服务器放在局域网内进行测试时 xff0c 数据库的访问速度还是很快 但当服务器放到外网后 xff0c 数据库的访问速度就变得非常慢 后来在网上发现解决方法 my cnf里面添加 mysqld skip name resolve 这样速度就快
  • 一起学Hadoop——二次排序算法的实现

    二次排序 xff0c 从字面上可以理解为在对key排序的基础上对key所对应的值value排序 xff0c 也叫辅助排序 一般情况下 xff0c MapReduce框架只对key排序 xff0c 而不对key所对应的值排序 xff0c 因此
  • MySQL复制表结构和复制表

    之前看到网上很多说用 SELECT INTO 表2 FROM 表1 WHERE 1 61 2 可以将表1结构复制到表2 用SELECT INTO 表2 FROM 表1 可以将表1 内容全部复制到表2 但是每次都会报错 xff1a 说表2 没
  • python的tuple()元组数据类型的使用方法以及案例

    一 元组的概念介绍 1 元组是列表的二次加工 列表可以被修改 列表的类型 list li 61 1 2 3 4 5 6 2 元组的元素不可被修改 xff0c 不能被增加或者删除 xff0c xff08 只是针对元组的一级元素是不可以修改的
  • 从源码解析ERROR 1129 (HY000):Host is blocked because of many connection errors

    原创水平有限 有错请指出 源码版本5 7 14 今天群里一个朋友出现如下错误 xff1a ERROR 1129 HY000 Host 39 10 0 0 8 39 is blocked because of many connection
  • 3.python 发送邮件之smtplib模块

    SMTP xff08 Simple Mail Transfer Protocol xff09 是简单邮件传输协议 xff0c 它是一组用于由源地址到目的地址的邮件传输规则 python中对SMTP进行了简单的封装 xff0c 可以发送纯文本