Python写自动化之邮件发送(匿名)

为了能够实现邮件发送功能,首先,我们需要了解一下邮件的发送过程是什么样子的,此处不再详细说明,请大家自行搜索或查看http://www.sogouqa.com/?p=438

在了解了邮件的发送过程后,为了实现邮件的全自动匿名发送,我们需要通过windows的命令行,解析邮件的匿名服务器,然后使用匿名服务器,发送邮件到相应的邮箱

代码如下:

def _get_mail_exchanger(domain_name,name_server=""):
    #print domain_name
    temp_file=os.getenv("temp")+"\\temp.lsh"
    os.system("nslookup -qt=mx "+domain_name+" "+name_server+" >"+temp_file+" 2>&1")
    f=open(temp_file)
    c=f.read()
    f.close()
    os.remove(temp_file)
    #print c
    internet_addresses_map=_get_internet_address(c)
    mail_exchangers=re.findall(r"mail\s+exchanger\s*=\s*(\S+)",c)
    #mail_exchangers=[internet_addresses_map.get(i,i) for i in mail_exchangers]
    mail_exchangerIPs=[]
    for i in mail_exchangers:
        try:
            mail_exchangerIPs.append(internet_addresses_map[i])
        except:
            ip=_getIP(i)
            if ip:
                mail_exchangerIPs.append(ip)

    if mail_exchangerIPs or name_server:
        print "mail_exchangers",mail_exchangerIPs
        return mail_exchangerIPs
    else:
        print "mail_exchangers from 预配置",g_mail_exchanger.get(domain_name,[])
        return g_mail_exchanger.get(domain_name,[])

其中有个函数用于获取匿名邮箱服务器地址,使用正则分析返回值,代码如下:

def _get_internet_address(content):
    internet_addresses=re.findall(r"(\S+)\s+internet\s+address\s*=\s*(\S+)",content)
    internet_addresses_map={}
    for internet_address in internet_addresses:
        internet_addresses_map[internet_address[0]]=internet_address[1]
    return internet_addresses_map

然后,有了地址后,我们需要通过解析出地址的IP,同样,使用windows命令获取结果并正则分析获取IP,代码如下:

def _getIP(domain_name,name_server=""):
    temp_file=os.getenv("temp")+"\\temp.lsh"
    os.system("nslookup -qt=a "+domain_name+" "+name_server+" >"+temp_file+" 2>&1")
    f=open(temp_file)
    c=f.read()
    f.close()
    os.remove(temp_file)
    ips=re.findall(domain_name+r"\s*Address\s*:\s*(\S+)",c,re.I)

    if ips:
        return ips[0][0]
    elif name_server=="":
        return _getIP(domain_name,"8.8.8.8")
    else:
        return None

有了邮箱服务器的IP,剩下的事情就是使用IP去发送邮件了,代码比较简单

def _send_to_mail_exchanger(mail_exchanger,mail_from,rcpt_to,From="",To="",Subject="",Date=None,Body="",attachments=None,encoding="gbk"):
    import smtplib,email
    from email.MIMEMultipart import MIMEMultipart
    from email.MIMEText import MIMEText
    from email.MIMEImage import MIMEImage

    # 构造MIMEMultipart对象做为根容器
    main_msg=email.MIMEMultipart.MIMEMultipart()
    # 设置根容器属性
    main_msg['From'] = From
    main_msg['To'] = To
    main_msg['Subject'] = Subject
    if Date:
	main_msg['Date'] = Date
    else:
	main_msg['Date'] = email.Utils.formatdate()

    # 构造MIMEText对象做为邮件显示内容并附加到根容器
    text_msg = email.MIMEText.MIMEText(Body,'html', encoding)
    main_msg.attach(text_msg)

    # 构造MIMEBase对象做为文件附件内容并附加到根容器
    if attachments:
	for attachment in attachments:
	    if not os.path.isfile(attachment):
		continue
	    if IsImage(attachment):
		try:
		    fp = open(attachment, "rb")
		    file_msg = MIMEImage(fp.read())
		    fp.close()
		    file_msg.add_header("Content-ID", os.path.basename(attachment).replace(".jpg", "").replace(".png", ""))
		    main_msg.attach(file_msg)
		except:
		    pass
	    else:
		file_msg=email.MIMEBase.MIMEBase("application","octet-stream")
		f=open(attachment,'rb')
		file_msg.set_payload(f.read())
		f.close()
		email.Encoders.encode_base64(file_msg)
		file_msg.add_header('Content-Disposition','attachment',filename=os.path.basename(attachment))
		main_msg.attach(file_msg)

    # 用smtp发送邮件
    data=main_msg.as_string()
    for i in range(2):
	try:
	    Log(mail_exchanger)
	    server=smtplib.SMTP(mail_exchanger)
	    Log(mail_from)
	    Log(rcpt_to)
	    ret=server.sendmail(mail_from,rcpt_to,data)
	    break
	except:
	    import traceback
	    Log(traceback.format_exc())

	    ret=False
	    try:
		server.quit()
	    except:
		pass
    try:
	server.quit()
    except:
	pass

    if ret==False or ret:
	#print "发往如下的邮件失败:",rcpt_to
	return False
    return True

ok,这样把整个流程整理清楚后,就可以自动发送邮件了

转载请注明出处:http://blog.csdn.net/sogouauto

时间: 2024-08-10 11:43:37

Python写自动化之邮件发送(匿名)的相关文章

Python写自动化之写一个Windows 服务

Python 写windows 服务,需要使用 pywin32包. 直接上代码: #encoding=utf8 ''' Created on 2014-7-1 @author: wangmengnan ''' import os import sys import win32serviceutil import win32service import win32event class PythonService(win32serviceutil.ServiceFramework): #服务名 _

Python写自动化之logging日志写入

日志写入是我们日常工作中常用到的功能,我们可以直接使用写文件的方式来以自己的方式写日志,另外,当我们在一个比较大的项目中,涉及到日志写入时,一般会使用logging模块来进行日志的写入,第一步,先写一个单例,创建一个logger对象: def _instance(): global logger if logger is None: logging.config.fileConfig(os.path.join(util.get_current(), "logger.conf")) lo

Python写自动化之构造Multipartform-data发请求

在HTTP协议的规范中会将http请求分为三个部分:状态行,请求头,请求体.在发送HTTP请求时,需要在请求头中注明发送的方法,这些方法包括:OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT.其中GET和POST是最为普遍被使用的.有关POST和GET的区别,知识库中已经有同学进行了表述,这里主要介绍一下multipart/form-data请求具体是怎么一回事. 在普通的HTML Form Post请求中,它会在头信息里使用Content-Lengt

Python写自动化之启动进程并获取进程输出

当我们需要执行外部命令或自己写一个自动化执行器时,需要使用到启动进程并获取输出的操作 首先,我们启动进程采用Python的subprocess模块,为了保证标准输出和标准错误输出能够正常运行,启动两个线程来检测输出结果部分 class Daemon(threading.Thread): def __init__(self, workDir, logFunction=None, *args): threading.Thread.__init__(self) self.process = None

Python写自动化之ini文件的读写

在我们写一些测试工具时,经常会需要使用到配置文件,此时一般选用ini文件是比较合适的 标准并且可以通过参数命名知道参数的含义,那么使用Python如何进行ini文件的读写呢? 首先看下,读取ini文件,我们直接使用Python自带的模块ConfigParser来进行配置文件的读写 看下代码吧 def ReadConfig(configPath): configDict = {} cf = ConfigParser.ConfigParser() cf.read(configPath) sessio

Python写自动化之获取文件的MD5值

使用Python 获取文件的MD5 值是一件很简单的事情,Python 提供了md5 和 hashlib 两个模块,都可以获取到文件的md5值. 代码如下: #获取文件的MD5值,适用于小文件 def getFileMD5(self,filepath): if self.isFile(filepath): f = open(filepath,'rb') md5obj = hashlib.md5() md5obj.update(f.read()) hash = md5obj.hexdigest()

Python写自动化之SVN更新

在远程机器上执行脚本时,为了能够保证脚本的实时性,我们一般会将脚本存放到SVN上,远程机器通过SVN的操作去更新脚本: SVN更新脚本只需要2步就可以实现了,这个地方使用到pysvn库,看下实现 # 初始化client self.client = pysvn.Client() self.client.set_default_username(self.username) self.client.set_default_password(util.decrypt_des(self.password

Python写自动化之图标锁定到任务栏或删除图标

这个功能在windows上测试安装卸载时,有时会用到,网上查到的两种语言的版本如下: C#版: Shell shell = new Shell(); Folder folder = shell.NameSpace(Path.GetDirectoryName(appPath)); FolderItem app = folder.ParseName(Path.GetFileName(appPath)); string sVerb = isLock ? "锁定到任务栏(&K)" :

Python写自动化之http文件下载

在自动化脚本中,文件下载是比较常见的操作,一般情况下,我们会将文件放到某个http服务器上,这时,当脚本中需要这个文件时,就需要使用到http下载的功能了 最基本的下载功能实现 实现最基本的功能,传入文件下载路径和文件本地保存路径,下载到本地 def DownloadFile(url,savePath): """ | ##@函数目的: 下载文件 | ##@参数说明:url:文件的url路径 | ##@参数说明:savePath:文件保存到的位置 | ##@返回值: "