为了可以实现邮件发送功能。首先。我们须要了解一下邮件的发送过程是什么样子的,此处不再具体说明,请大家自行搜索或查看

p=438">http://www.sogouqa.com/?p=438

在了解了邮件的发送过程后,为了实现邮件的全自己主动匿名发送,我们须要通过windows的命令行,解析邮件的匿名server。然后使用匿名server,发送邮件到对应的邮箱

代码例如以下:

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

有了邮箱server的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

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

  1. python+robot framework实现测报告定制化和邮件发送

    前面已经介绍了python+robot framework自动化框架和基本原理的实现,详情请看 python+robot framework接口自动化测试 本章主要讲解报告已经产生那如何以自动化的方式 ...

  2. 用python做自己主动化測试--对server端的自己主动化測试(3)-很多其它http client实例

    上一篇中仅仅是实现了一个非常easy的http client功能,request还提供了keep alive, SSL, 多文件上传,cookie 管理功能,http requests头管理等丰富的功 ...

  3. 用python做自己主动化測试--绘制系统性能趋势图和科学计算

    在性能測试中.我们常常须要画出CPU memory 或者IO的趋势图. 预计大学里.大多数人都学习过matlib, 领略了matlib绘图的强大. python提供了强大的绘图模块matplotlib ...

  4. Windows命令实现匿名邮件发送

    在日常工具开发中,常常会有发送邮件的需求.在一些高级语言中,如Python.C#中,都有专门的邮件发送模块,如Python 中的 smtplib 模块.那么.一封邮件究竟是怎样发送到一个特定的邮箱呢? ...

  5. Robot Framework自己主动化測试框架之我见

    一些自己主动化測试现状: 盲目的去做自己主动化,终于以失败告终. 觉得是能提高效率的事情.却推广不下去: 事实上上述问题产生的原因是: 自己主动化測试案例稳定性不高,可维护性比較差: 自己主动化測试工 ...

  6. 【Linux】结合Python 简易实现监控公司网站,邮件发送异常

    背景 由于一些原因,博主负责测试的网站的服务器切换到了香港,切换后出现了多次访问超时的情况 于是主动请缨写一个自动监测的脚本,本来准备完全使用shell来写,后来发现shell发送邮件只能在测试机之间 ...

  7. python SMTP邮件发送(转载)

    Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...

  8. Python 邮件发送

    python发送各类邮件的主要方法   python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法,这里写写自己的的心得,也请高手给些指点.     一.相关模块介绍 ...

  9. Python Selenium unittest+HTMLTestRunner实现 自动化测试及发送测试报告邮件

    1.UI测试框架搭建-目录结构 2. 文件介绍 2.1.baseinfo->__init__.py 配置文件定义基础参数 #-*-coding:utf-8-*- #测试用例配置参数 base_u ...

随机推荐

  1. 10条建议让你创建更好的jQuery插件(转载)

    为了避免重复造轮子,自己手动开发jquery 插件,让小组其他成员可以直接使用.学习开发中,看到Phillip Senn 写的 关于jquery 插件开发注意10点,转载之! ------------ ...

  2. OAF_OAF控件系列8 - SubTab的实现(案例)

    2014-06-02 Created By BaoXinjian

  3. Trie树 - 字典树

    1.1.什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是最大限 ...

  4. 固定尺寸内存块的缓冲队列类及C++实现源代码

    -------------------------------------------------------------------------------- 标题: 固定尺寸内存块的缓冲队列类及实 ...

  5. Cocos2d-x游戏移植到WP8之路 -- c++和c#交互

    Cocos2d-x是眼下最流行的手机游戏引擎之中的一个,开源.轻量.多平台等的诸多特性使得它被非常多国内外手游开发人员所喜爱. 利用Cocos2d-x来开发Windows Phone 8的游戏相同也是 ...

  6. 使用和学习 ES2015

    调试网站 http://babeljs.io/repl/ 扩展阅读: # export.exports.modules.exports 和 require .import 的一些常用方法和套路 htt ...

  7. .NET设计模式(4):建造者模式(Builder Pattern)(转载)

    概述 在 软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧 烈的变化,但是将它们组合在一起的算法确相对稳 ...

  8. spring 读取配置文件

    spring读取dubbo xml文件,在本项目内可以调用正常,一旦把改项目打成jar包,供其他项目调用,就会提示找不到配置文件 ClassPathXmlApplicationContext cont ...

  9. 在 ASP.NET Web API 中,使用 命名空间(namespace) 来作为路由的参数

    这个问题来源于我想在 Web API 中使用相同的控制器名称(Controller)在不同的命名空间下,但是 Web API 的默认 路由(Route) 机制是会忽略命名空间的不同的,如果这样做,会看 ...

  10. 一些通用性的haproxy调优tips

    一.硬件和系统 haproxy是单线程,非阻塞,事件驱动,所以会最大化利用单个CPU内核,选择haproxy的硬件时要关注如下:   1.选择CPU的时候,选择高主频,大缓存的型号,比内核数更重要 2 ...