首先了解 *** TP(简单邮件传输协议),邮件传送 *** 程序使用 *** TP协议来发送电邮到接收者的邮件服务器。 *** TP协议只能用来发送邮件,不能用来接收邮件,而大多数的邮件发送服务器都是使用 *** TP协议。 *** TP协议的默认TCP端口号是25。
本文主要介绍利用' *** tplib','email'两个模块来实现邮件的发送,可以如下查看两个模块的函数和 *** :
*** tplib模块简介:
*** tplib. *** TP([host[, port[, local_hostname[, timeout]]]])
此为 *** TP类构造函数,表示与 *** TP服务器之间的连接,并根据这个连接向 *** tp服务器发送指令,执行相关操作(如:登陆、发送邮件),且每个参数都是可选的。
其中最重要的参数:
host: *** tp服务器主机名
port: *** tp服务的端口,默认是25;
如果在创建 *** TP对象的时候提供了这两个参数,在初始化的时候会自动调用connect *** 去连接服务器。
*** tplib. *** TP还提供了如下 *** :
*** TP.set_debuglevel(level):设置是否为调试模式
*** TP.connect([host[, port]]):连接到指定的 *** tp服务器。参数分别表示 *** pt主机和端口。
*** TP.docmd(cmd[, argstring]):向 *** tp服务器发送指令。
*** TP.helo([hostname]) :使用"helo"指令向服务器确认身份。
*** TP.login(user, password):登陆到 *** tp服务器。现在几乎所有 *** tp服务器,都必须在验证用户信息合法之后才允许发送邮件。(重要!)
*** TP.sendmail(from_addr,to_addrs,msg[,mail_options,rcpt_options]):发送邮件。这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是 *** tp协议中定义的格式。 *** TP.quit() :断开与 *** tp服务器的连接,相当于发送"quit"指令。(重要!)
常用的函数 *** :
email模块
1.class email.message.Message
__getitem__,__setitem__实现obj[key]形式的访问。
Msg.attach(playload): 向当前Msg添加playload。
Msg.set_playload(playload):
Msg.add_header(_name, _value, **_params): 添加邮件头字段。
2.class email.mime.base.MIMEBase(_maintype, _subtype, **_params)
所有MIME类的基类,是email.message.Message类的子类。
3.class email.mime.multipart.MIMEMultipart()
在3.0版本的email模块 (Python 2.3-Python 2.5) 中,这个类位于email.MIMEMultipart.MIMEMult ipart。这个类是MIMEBase的直接子类,用来生成包含多个部分的邮件体的MIME对象。
4.class email.mime.text.MIMEText(_text)
使用字符串_text来生成MIME对象的主体文本。
获得所需要使用的邮箱的host地址和port端口号,(本文使用的是163邮箱,对应的 *** tp服务器地址:mail.163.com,端口号25)
常用邮箱的 *** tp服务器地址和端口号如图:
编写程序如下:
#! /usr/bin/env python
import *** tpli
from email.mime.text import MIMEText
mailto_list=['xxxx@xxx.com'] #收件人(列表)
mail_host=" *** tp.163.com" #使用的邮箱的 *** tp服务器地址
mail_user="name" #用户名
mail_pass="pwd" #密码
mail_postfix="postfix" #邮箱的后缀
def send_mail(to_list,sub,content):
me="hello"+""+mail_user+"@"+mail_postfix+""
msg = MIMEText(content,_subtype='plain')
msg['Subject'] = sub
msg['From'] = me
msg['To'] = ";".join(to_list) #将收件人列表以‘;’分隔
try:
server = *** tplib. *** TP()
server.connect(mail_host) #连接服务器
server.login(mail_user,mail_pass) #登录操作
server.sendmail(me, to_list, msg.as_string())
server.close()
return True
except Exception, e:
print str(e)
return False
for i in range(5): #发送五封,不过会被拦截的。。。
if send_mail(mailto_list,"hello","haha!"): #邮件主题和邮件内容
print "done!"
else:
print "failed!"
最后,可以运行编写的py文件,可以得到如图所是的结果,代表邮件发送成功。
这样,就能成功实现用Python发送邮件啦!
1、准备两个邮箱帐号,一个是常用的(接收端),另一个可以注册网易163邮箱或者foxmail邮箱也可(发送端),本次我使用两个 *** 邮箱进行演示。
2、在邮箱的设置
3、账户中开启 *** TP功能,如下图:
4、点击生成授权码,按照弹出窗口的提示发送短信,发送后单击我已发送按钮。
5、将生成的授权码复制下来以备接下来使用。如下图:
6、我们来编辑代码:
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr,formataddr
import *** tplib
def _format_addr(s):
name,addr = parseaddr(s)
return formataddr((Header(name,'utf-8').encode(),addr))
#发件人地址
from_addr = '10******10@qq.com'
#密码刚才复制的邮箱的授权码
password = 'u*******************g'
#收件人地址
to_addr = '10********28@qq.com'
#邮箱服务器地址
*** tp_server = ' *** tp.qq.com'
#设置邮件信息
msg = MIMEText('Python爬虫运行异常,异常信息为遇到HTTP 403','plain','utf-8')
msg['From'] = _format_addr('Python爬虫一号%s'%from_addr)
msg['To'] = _format_addr('管理员%s'%to_addr)
msg['Subject'] = Header('一号爬虫运行异常.','utf-8').encode()
#发送邮件
server = *** tplib. *** TP_SSL( *** tp_server,465)
#打印出和 *** TP服务器交互的所有信息
server.set_debuglevel(1)
#登录 *** TP服务器
server.login(from_addr,password)
#sendmail():发送邮件,由于可以一次发给多个人,所以传入一个list邮件正文是一个str,as_string()把MIMEText对象变成str。
server.sendmail(from_addr,to_addr,msg.as_string())server.quit()print('邮件发送成功!')
7、登录接收端邮箱,查看是否发送成功,如下图:
8、如果能成功收到邮件的话就说明完成了。
将输入的邮箱保存到s,用@作分隔符调用split分割s再取下标为1的元素输出就行了。
比如:
s="asd.rt@12345.xxx"
l=s.split("@")
print(l[1])
python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法,这里写写自己的的心得,也请高手给些指点。
一、相关模块介绍
发送邮件主要用到了 *** tplib和email两个模块,这里首先就两个模块进行一下简单的介绍:
1、 *** tplib模块
*** tplib. *** TP([host[, port[, local_hostname[, timeout]]]])
*** TP类构造函数,表示与 *** TP服务器之间的连接,通过这个连接可以向 *** tp服务器发送指令,执行相关操作(如:登陆、发送邮件)。所有参数都是可选的。
host: *** tp服务器主机名
port: *** tp服务的端口,默认是25;如果在创建 *** TP对象的时候提供了这两个参数,在初始化的时候会自动调用connect *** 去连接服务器。
*** tplib模块还提供了 *** TP_SSL类和LMTP类,对它们的操作与 *** TP基本一致。
*** tplib. *** TP提供的 *** :
*** TP.set_debuglevel(level):设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息。
*** TP.connect([host[, port]]):连接到指定的 *** tp服务器。参数分别表示 *** pt主机和端口。注意: 也可以在host参数中指定端口号(如: *** pt.yeah.net:25),这样就没必要给出port参数。
*** TP.docmd(cmd[, argstring]):向 *** tp服务器发送指令。可选参数argstring表示指令的参数。
*** TP.helo([hostname]) :使用"helo"指令向服务器确认身份。相当于告诉 *** tp服务器“我是谁”。
*** TP.has_extn(name):判断指定名称在服务器邮件列表中是否存在。出于安全考虑, *** tp服务器往往屏蔽了该指令。
*** TP.verify(address) :判断指定邮件地址是否在服务器中存在。出于安全考虑, *** tp服务器往往屏蔽了该指令。
*** TP.login(user, password) :登陆到 *** tp服务器。现在几乎所有的 *** tp服务器,都必须在验证用户信息合法之后才允许发送邮件。
*** TP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]) :发送邮件。这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是 *** tp协议中定义的格式。
*** TP.quit() :断开与 *** tp服务器的连接,相当于发送"quit"指令。(很多程序中都用到了 *** tp.close(),具体与quit的区别google了一下,也没找到答案。)
2、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实例,使用 *** 如下:
msg=mail.Message.Message() #一个实例
msg['to']='XXX@XXX.com' #发送到哪里
msg['from']='YYY@YYYY.com' #自己的邮件地址
msg['date']='2012-3-16' #时间日期
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。首先导入 *** tplib和mimetext。创建 *** tplib. *** tp实例,connect邮件 *** tp服务器,login后发送,具体代码如下:(python2.6下实现)
# -*- coding: UTF-8 -*-
'''
发送txt文本邮件
小五义:
'''
import *** tplib
from email.mime.text import MIMEText
mailto_list=[YYY@YYY.com]
mail_host=" *** tp.XXX.com" #设置服务器
mail_user="XXXX" #用户名
mail_pass="XXXXXX" #口令
mail_postfix="XXX.com" #发件箱的后缀
def send_mail(to_list,sub,content):
me="hello"+""+mail_user+"@"+mail_postfix+""
msg = MIMEText(content,_subtype='plain',_charset='gb2312')
msg['Subject'] = sub
msg['From'] = me
msg['To'] = ";".join(to_list)
try:
server = *** tplib. *** TP()
server.connect(mail_host)
server.login(mail_user,mail_pass)
server.sendmail(me, to_list, msg.as_string())
server.close()
return True
except Exception, e:
print str(e)
return False
if __name__ == '__main__':
if send_mail(mailto_list,"hello","hello world!"):
print "发送成功"
else:
print "发送失败"
2、html邮件的发送
与text邮件不同之处就是将将MIMEText中_subtype设置为html。具体代码如下:(python2.6下实现)
# -*- coding: utf-8 -*-
'''
发送html文本邮件
'''
import *** tplib
from email.mime.text import MIMEText
mailto_list=["YYY@YYY.com"]
mail_host=" *** tp.XXX.com" #设置服务器
mail_user="XXX" #用户名
mail_pass="XXXX" #口令
mail_postfix="XXX.com" #发件箱的后缀
def send_mail(to_list,sub,content): #to_list:收件人;sub:主题;content:邮件内容
me="hello"+""+mail_user+"@"+mail_postfix+"" #这里的hello可以任意设置,收到信后,将按照设置显示
msg = MIMEText(content,_subtype='html',_charset='gb2312') #创建一个实例,这里设置为html格式邮件
msg['Subject'] = sub #设置主题
msg['From'] = me
msg['To'] = ";".join(to_list)
try:
s = *** tplib. *** TP()
s.connect(mail_host) #连接 *** tp服务器
s.login(mail_user,mail_pass) #登陆服务器
s.sendmail(me, to_list, msg.as_string()) #发送邮件
s.close()
return True
except Exception, e:
print str(e)
return False
if __name__ == '__main__':
if send_mail(mailto_list,"hello","a href=''小五义/a"):
print "发送成功"
else:
print "发送失败"
3、发送带附件的邮件
发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用 *** tplib. *** tp发送。
# -*- coding: cp936 -*-
'''
发送带附件邮件
'''
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import *** tplib
#创建一个带附件的实例
msg = MIMEMultipart()
#构造附件1
att1 = MIMEText(open('d:\\123.rar', 'rb').read(), 'base64', 'gb2312')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="123.doc"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字
msg.attach(att1)
#构造附件2
att2 = MIMEText(open('d:\\123.txt', 'rb').read(), 'base64', 'gb2312')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="123.txt"'
msg.attach(att2)
#加邮件头
msg['to'] = 'YYY@YYY.com'
msg['from'] = 'XXX@XXX.com'
msg['subject'] = 'hello world'
#发送邮件
try:
server = *** tplib. *** TP()
server.connect(' *** tp.XXX.com')
server.login('XXX','XXXXX')#XXX为用户名,XXXXX为密码
server.sendmail(msg['from'], msg['to'],msg.as_string())
server.quit()
print '发送成功'
except Exception, e:
print str(e)
4、利用MIMEimage发送图片
# -*- coding: cp936 -*-
import *** tplib
import mimetypes
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
def AutoSendMail():
msg = MIMEMultipart()
msg['From'] = "XXX@XXX.com"
msg['To'] = "YYY@YYY.com"
msg['Subject'] = "hello world"
txt = MIMEText("这是中文的邮件内容哦",'plain','gb2312')
msg.attach(txt)
file1 = "C:\\hello.jpg"
image = MIMEImage(open(file1,'rb').read())
image.add_header('Content-ID','image1')
msg.attach(image)
server = *** tplib. *** TP()
server.connect(' *** tp.XXX.com')
server.login('XXX','XXXXXX')
server.sendmail(msg['From'],msg['To'],msg.as_string())
server.quit()
if __name__ == "__main__":
AutoSendMail()
利用MIMEimage发送图片,原本是想图片能够在正文中显示,可是代码运行后发现,依然是以附件形式发送的,希望有高手能够指点一下,如何可以发送在正文中显示的图片的邮件,就是图片是附件中存在,但同时能显示在正文中,具体形式如下图。
通过命令行发送邮件,功能强大
python ./mail -s $server -f $from -t $to -u $user -p $pass -S "$subject" -m "${mail_msg}" -F $file
Python 发送邮件可以添加附件:
#!/usr/bin/python
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email import Utils, Encoders
import mimetypes, sys, *** tplib,socket,getopt
class SendMail:
def __init__(self, *** tp_server,from_addr,to_addr,user,passwd):
self.mailserver= *** tp_server
self.from_addr=from_addr
self.to_addr=to_addr
self.username=user
self.password=passwd
def attachment(self,filename):
fd=open(filename,'rb')
filename=filename.split('/')
mimetype,mimeencoding=mimetypes.guess_type(filename[-1])
if (mimeencoding is None) or (mimetype is None):
mimetype='application/octet-stream'
maintype,subtype=mimetype.split('/')
if maintype=='text':
retval=MIMEText(fd.read(), _subtype=subtype, _charset='utf-8')
else:
retval=MIMEBase(maintype,subtype)
retval.set_payload(fd.read())
Encoders.encode_base64(retval)
retval.add_header('Content-Disposition','attachment',filename=filename[-1])
fd.close()
return retval
def msginfo(self,msg,subject,filename):
# message = """Hello, ALL
#This is test message.
#--Anonymous"""
message=msg
msg=MIMEMultipart()
msg['To'] = self.to_addr
msg['From'] = 'sa '+self.from_addr+''
msg['Date'] = Utils.formatdate(localtime=1)
msg['Message-ID'] = Utils.make_msgid()
if subject:
msg['Subject'] = subject
if message:
body=MIMEText(message,_subtype='plain')
msg.attach(body)
#for filename in sys.argv[1:]:
if filename:
msg.attach(self.attachment(filename))
return msg.as_string()
def send(self,msg=None,subject=None,filename=None):
try:
s= *** tplib. *** TP(self.mailserver)
try:
s.login(self.username,self.password)
except *** tplib. *** TPException,e:
print "Authentication failed:",e
sys.exit(1)
s.sendmail(self.from_addr,self.to_addr.split(','),self.msginfo(msg,subject,filename))
except (socket.gaierror,socket.error,socket.herror, *** tplib. *** TPException),e:
print "*** Your message may not have been sent!"
print e
sys.exit(2)
else:
print "Message successfully sent to %d recipient(s)" %len(self.to_addr)
if __name__=='__main__':
def usage():
print """Useage:%s [-h] -s *** TP Server -f FROM_ADDRESS -t TO_ADDRESS -u USER_NAME -p PASSWORD [-S MAIL_SUBJECT -m MAIL_MESSAGE -F ATTACHMENT]
Mandatory arguments to long options are mandatory for short options too.
-f, --from= Sets the name of the "from" person (i.e., the envelope sender of the mail).
-t, --to= Addressee's address. -t "test@test.com,test1@test.com".
-u, --user= Login *** TP server username.
-p, --pass= Login *** TP server password.
-S, --subject= Mail subject.
-m, --msg= Mail message.-m "msg, ......."
-F, --file= Attachment file name.
-h, --help Help documen.
""" %sys.argv[0]
sys.exit(3)
try:
options,args=getopt.getopt(sys.argv[1:],"hs:f:t:u:p:S:m:F:","--help --server= --from= --to= --user= --pass= --subject= --msg= --file=",)
except getopt.GetoptError:
usage()
sys.exit(3)
server=None
from_addr=None
to_addr=None
username=None
password=None
subject=None
filename=None
msg=None
for name,value in options:
if name in ("-h","--help"):
usage()
if name in ("-s","--server"):
server=value
if name in ("-f","--from"):
from_addr=value
if name in ("-t","--to"):
to_addr=value
if name in ("-u","--user"):
username=value
if name in ("-p","--pass"):
password=value
if name in ("-S","--subject"):
subject=value
if name in ("-m","--msg"):
msg=value
if name in ("-F","--file"):
filename=value
if server and from_addr and to_addr and username and password:
test=SendMail(server,from_addr,to_addr,username,password)
test.send(msg,subject,filename)
else:
usage()
你好。获得电子邮箱的用户名。首先你要下载一个电子邮箱。你可以下载邮箱大师。邮箱大师下载后可以使用拼音字母注册。也可以使用拼音加 *** 数字注册。注册完成后,邮箱就可以接收和发送电子邮件了。也可以使用邮箱的账号注册应用软件了。注册的号码就是你的邮箱账号。也是你的邮箱地址。
手机邮箱在哪里找 电子邮箱在手机的查找方法如下:查看默认邮箱:大多数手机厂商在手机出厂时都会默认设置自己的常用邮箱,如果你的手机没有更改过默认邮箱,那么你的默认邮箱就是你的手机号码@qq.com或者是...
linux下的postfix邮件服务器怎么创建账号? 1、我也建了一个postfix,用自己新建的linux两个用户可以相互发给对方,只要你收信人那里填入你的用户名@$myhostname就可以。2、...
凯迪拉克xt5油箱盖开关在哪里 凯迪拉克XT5 ( 查成交价 | 车型详解 )油箱盖开关在车辆右后方,要打开燃油加注口,按下油箱盖中间的位置并松开就可以了,车门上锁时,燃油加注口门也上锁,按下遥控钥匙...
济宁普法考试补注册去哪里 济宁市司法局普法考试,这是一个专门为济宁市国家工作人员打造的一个学法用法服务平台,大家可以直接通过这个平它在线注册登录进行考试,同时平台各种实用的法律学习课程,对通过考试都是...
iphone和mac邮箱同步 您好,方法由于MAC上可以供选择的电子邮箱实在是太少,公司用的邮箱又是IMAP的,MAC自带的邮箱不知道什么原因根本连接不了!试过了Gmail实在是难用,什么功能都没有,...
那些所谓的黑客是不是骗人的 那种利用诈骗邮件、诈骗短信,然后在邮件、短信中放上病毒附件、病毒链接来实现入侵的,从某种意义上来说也可以算是骗子;但是也有完全凭技术的,那就不能说是骗子了。个人宣传会的都不...