学习笔记之邮件发送篇

用脚本语言发送邮件是系统管理员必备技能

对系统定期检查或者当服务器受到攻击时生成文档和报表。

发布这些文档最快速有效的方法就是发送邮件。

python中email模块使得处理邮件变得比较简单

发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍:

本段摘录于    http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html

1、smtplib模块

smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

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

host:smtp服务器主机名            例:stmp.qq.com   或  stmp.163.com

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

   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"指令。(很多程序中都用到了smtp.close(),具体与quit的区别google了一下,也没找到答案。

2、email模块

emial模块用来处理邮件消息,包括MIME和其他基于RFC 2822 的消息文档。使用这些模块来定义邮件的内容,是非常简单的。其包括的类有(更加详细的介绍可见:http://docs.python.org/library/email.mime.html):

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实例,使用方法如下:

[python] view plain copy

  1. msg=mail.Message.Message()    #一个实例
  2. msg[‘to‘]=‘[email protected]‘      #发送到哪里
  3. msg[‘from‘]=‘[email protected]‘       #自己的邮件地址
  4. msg[‘date‘]=‘2012-3-16‘           #时间日期
  5. msg[‘subject‘]=‘hello world‘    #邮件主题

class email.mime.text.MIMEText(_text[, _subtype[, _charset]]):MIME文本对象,其中_text是邮件内容,_subtype邮件类型,可以是text/plain(普通文本邮件),html/plain(html邮件),  _charset编码,可以是gb2312等等。

二、几种邮件的具体实现代码

1、普通文本邮件

普通文本邮件发送的实现,关键是要将MIMEText中_subtype设置为plain。首先导入smtplib和mimetext。创建smtplib.smtp实例,connect邮件smtp服务器,login后发送,具体代码如下:(python3下实现)

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

HOST=‘smtp.qq.com‘                                     #定义邮箱类型
SUBJECT = ‘入侵报警‘                 #定义邮件标题
TO = ‘[email protected]‘               #定义接受邮箱
FROM =‘[email protected]‘               #定义发送邮箱

msg = MIMEText("hello","plain","utf-8")        #邮件内容
msg[‘Subject‘] = SUBJECT                #邮件标题
msg[‘From‘]=FROM                                       #发送邮件
msg[‘To‘]=TO                                           #接受邮箱

try:
    s=smtplib.SMTP_SSL(HOST,465)           #以SSL协议连接到qq邮箱
    s.login("[email protected]","dzvgafguqkqfffhg") #登录qq邮箱   参数1:发送邮箱   参数2:邮箱密码
    s.sendmail(FROM,TO,msg.as_string())       #发送邮件 
    s.quit()                                       #退出登录
    print(‘邮件发送陈功‘)
except Exception as e:
    print(‘失败‘,e)

2、html邮件的发送

与text邮件不同之处就是将将MIMEText中_subtype设置为html。具体代码如下:(python2.6下实现)

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

HOST=‘smtp.qq.com‘                     #定义发送邮箱类型
SUBJECT = ‘入侵报警‘                   #定义邮件标题
TO = ‘[email protected]‘                   #定义接受邮件
FROM =‘[email protected]‘                    #定义发送邮件

msg = MIMEText("""
<html>
    <head>
        <tiltle>最简单的网页</tiltle>
    <head>
<body>
<body bgcolor="#000000">
<center>
    <h2>
        <font  style="color:#DC143C">邮件测试</font> 
    </h2>
    <p>
        <font  style="color:#DC143C">如果你发现这个网页证明我正在测试</font>
    </P>
    <img src="http://a.cphotos.bdimg.com/timg?image&quality=100&size=b4000_4000&sec=1503817907&di=fd44277924745914f28fe32e7c21d48c&src=http://img.zcool.cn/community/016d1f555c85a80000009c5049f63e.jpg">
    <h2>
        <font  style="color:#DC143C">如有打扰!敬请原谅</font>
    </h2>
</center>
</body>
</html>
""","html","utf-8")                   #参数1:内容  参数二:类型  参数三:编码
msg[‘Subject‘] = SUBJECT               #邮件标题             
msg[‘From‘]=FROM                    #发送邮箱
msg[‘To‘]=TO                      #接受邮箱

try:
    s=smtplib.SMTP_SSL(HOST,465)              #同上一个的代码 
    s.login("[email protected]","dzvgafguqkqfffhg")    #同上一个的代码 
    s.sendmail(FROM,TO,msg.as_string())
    s.quit()
    print(‘邮件发送陈功‘)
except Exception as e:
    print(‘失败‘,e)

3、发送带附件的邮件

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

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

# 邮件发送
HOST = ‘smtp.qq.com‘
SUBJECT = ‘图表‘
TO = ‘[email protected]‘
FROM = ‘[email protected]‘

def adding(src,imgid):
        fp = open(src,‘rb‘)
        msgImage = MIMEImage(fp.read())
        fp.close()
        msgImage.add_header(‘Content-ID‘,imgid)
        return msgImage

msg=MIMEMultipart(‘related‘)

msgtext = MIMEText("""
<html>
<head>
 <title>as</title>
</head>
<body>
 <font color = blue>相见时>难别亦难</font>
 <br/>
 <img src=‘cid:ok‘><br/>
 </body>
</html>","html","utf8")               #参数1:内容  参数二:类型  参数三:编码

msg.attach(msgtext)                   #给msgtext中添加附件
msg.attach(adding("1.png","ok"))      #给html中添加本地图片
files = MIMEApplication(open(‘100.xlsx‘,‘rb‘).read())  #添加附件100.xlsx
files.add_header(‘Content-Disposition‘, ‘attachment‘, filename="100.xlsx")  #设置附件的头
msg.attach(files)                                 #加入附加files(files就是100xlsx)

msg[‘Subject‘] = SUBJECT
msg[‘FROM‘] = FROM
msg[‘TO‘] = TO

try:
        s = smtplib.SMTP_SSL(HOST,465)
        s.login(‘[email protected]‘,‘lvbjkgwkzgquffhe‘)
        s.sendmail(FROM,TO,msg.as_string())
        s.quit()
        print(‘邮件发送成功‘)
except Exception as e:
        print(‘失败‘+str(e))

更多邮件发送类型请参照 http://www.jb51.net/article/49216.htm

小白笔记 如有错误 请提醒修改

时间: 2025-01-02 14:50:48

学习笔记之邮件发送篇的相关文章

python学习笔记SMTP邮件发送

Java%E5%AD%A6%E4%B9%A0%E5%BF%83%E5%BE%97%E4%B9%8B%20Linux%E4%B8%8B%E6%90%AD%E5%BB%BAJava%E7%8E%AF%E5%A2%83 ?????QlDA99zq?????????? http://auto.315che.com/lianhual3/qa23839716.htm?u2 http://auto.315che.com/biaozhi207/qa23860550.htm?b9 http://auto.315c

python学习笔记[3]-邮件的发送

本文摘抄自:http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html 一.相关模块介绍 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍:    1.smtplib模块 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])   SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接可以向smtp服务器发送指令,执行

马哥Linux学习笔记之五——邮件服务

1.SMTP只负责将邮件发送到服务器,其他的,像身份认证检测邮件,都不能完成.(25/tcp) ESMTP:Extended SMTP POP3:Post Office Protocol IMAP4:Internet Mail Access Protocol 2.Open Relay:开放式中继 就是人家的邮件从这个邮件服务器过,你都帮忙转发,这样就会成为产生垃圾邮件的根源.所以都要关闭Open Relay 3.SASL,Simple Authintication Secure Layer,简单

SaltStack 学习笔记 - 第十二篇: SaltStack Web 界面

SaltStack 有自身的用python开发的web界面halite,好处是基于python,可以跟salt的api无缝配合,确定就比较明显,需要个性化对web界面进行定制的会比较麻烦,如果喜欢体验该界面的可以参考下面的文章  http://rfyiamcool.blog.51cto.com/1030776/1275443/ 我是运用另一个python+php来进行web开发,具体需要的工具有在我的另一篇文章里面介绍过,这里再重新进行整个开发介绍 首先介绍php 跟python通信的工具 pp

现代C++学习笔记之二入门篇2,数据转换

static_cast:    这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换,但是,编译器在无法分辨此类转换在运行时是否是安全的. dynamic_cast: dynamic_cast在运行时检查基类指针和派生类指针之间的强制转换. dynamic_cast 是比 static_cast 更安全的强制类型转换,但运行时检查会带来一些开销. const_cast:    con

现代C++学习笔记之二入门篇1

现代 C++ 强调: 基于堆栈的范围,而非堆或静态全局范围. 自动类型推理,而非显式类型名称. 智能指针而不是原始指针. std::string 和 std::wstring 类型(请参见 <string>),而非原始 char[] 数组. 标准模板库 (STL) 容器(例如 vector.list 和 map),而非原始数组或自定义容器. 请参见 <vector>.<list> 和 <map>. STL 算法,而非手动编码的算法. 异常,可报告和处理错误条

JS学习笔记--仿手机发送内容交互

学习JS笔记----记录上课中学习的知识点,分享下老师教的内容: 1.html内容 <div id="box"> <div id="message"> <!--<p class="left"> <img src="img/136.jpg" /> <span>这是第一句话</span> </p> <p class="righ

《MyCat 学习笔记》第八篇.数据分片 之 求摸运算分片

1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值取摸应该是最简单的一种. 优点:数据离散概率较为平均,可以有效的提高应用的数据吞吐. 缺点:比较明显,后期数据运维与迁移比较困难.好在Mycat有对应的解决方案,具体后期验证或可直接参考Mycat权威指南相应章节. 2 环境说明 参考  <MyCat 学习笔记>第六篇.数据分片 之 按月数据分片  http://www.cnblogs.com/kaye0110/p/5160826.html 3 参数配置 3.1 server.xm

《Mycat学习笔记》 第三篇. MySql 主从同步异常后,主从切换

1)系统环境说明 MySql 5.5 主从节点 127.0.0.1:3306   主结点,为验证主从切换效果,手动停止服务 127.0.0.1: 3307    从结点 1 127.0.0.1:338     从结点 2 ,为验证主从切换效果,在主结点停止后,新增两个记录. MyCat 1.5 schema.xml 配置 具体配置说明,参考上篇: <Mycat学习笔记> 第二篇. MySql 读写分离与日志分析——主从多结点 <dataHost name="localhost1