您的位置:首页 > 大数据 > 人工智能

Robot Framework通过Python SMTP进行email收发测试。

2015-08-22 15:30 323 查看
工作中需要对发送的邮件进行过滤,方法基本属于ACL控制,即查看“源/目的”邮件地址,邮件标题,邮件正文,邮件附件等进行过滤。

所以需要先模拟一下用Python能否达到邮件Client,Server的功能,还有能否在server上显示发送的 “源/目的”邮件地址,邮件标题,邮件正文,邮件附件 这些信息。

如果能取到这些信息,然后就可以对这些字符串进行查找,然后判断过滤功能是否work的目的了。

现在咱们先看下邮件服务器:

mailserver.py:

import smtpd
import asyncore

class CustomSMTPServer(smtpd.SMTPServer):

def process_message(self, peer, mailfrom, rcpttos, data):
print 'Receiving message from:', peer
print 'Message addressed from:', mailfrom
print 'Message addressed to  :', rcpttos
print 'Message length        :', len(data)
print 'data                  :', data
return

server = CustomSMTPServer(('172.18.0.100', 9999), None)

asyncore.loop()


这个就是邮件服务器,保存完后,直接双击运行就好,它会一直运行的。

UPDATE:

  将此邮件服务器做成类似于linux服务:

  1.将此程序放到/home目录下:

[root@Server init]# vim /home/mailserver.py

import smtpd
import asyncore

class CustomSMTPServer(smtpd.SMTPServer):

def process_message(self, peer, mailfrom, rcpttos, data):
self.peer = peer
self.mailfrom = mailfrom
self.rcpttos = rcpttos
self.data = data
mail_log = open('/home/current_mail.log','wb+')
mail_log.write(str('Receiving message from:')+ str(self.peer)+'\n')
mail_log.write(str('Message addressed from:')+ str(self.mailfrom)+'\n')
mail_log.write(str('Message addressed to  :')+ str(self.rcpttos)+'\n')
mail_log.write(str('Message length        :')+ str(len(self.data))+'\n')
mail_log.write(str('data                  :')+ str(self.data)+'\n')
mail_log.close()
return

server = CustomSMTPServer(('172.16.0.3', 9999), None)

asyncore.loop()


这个程序会在当前目录下创建邮件log,用来判断客户端发送的请求是否正确。

  

  2.在/etc/init目录下(不是/etc/init.d)创建mailserver.conf这个文件,然后填写如下配置:

[root@Server init]# vim mailserver.conf
description "mailserver is in /home/mailserver.py"
author "xxx@xxx.com"

start on runlevel [2345]
stop on runlevel [!2345]

#env AN_ENVIRONMENTAL_VARIABLE=i-want-to-set

respawn

exec /home/mailserver.py


  3. 执行“
initctl reload-configuration"命令


  4. 然后可以通过以下命令启动或关闭邮件服务器:

 

start mailserver
stop mailserver
restart mailserver


邮件客户端:

Step1: 先在pyton目录下创建一个自定义的文件夹“SelfEmailLibrary”(您的Python安装到哪里就相应的放到哪里):

F:\Python27\Lib\site-packages\SelfEmailLibrary

Step2: 将下面的代码复制到“mailsend.py”和“__init__.py”中。

mailsend.py:

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email import Encoders
import os

class SendEmailUtility(object):

ROBOT_LIBRARY_SCOPE = 'Global'

def __init__(self):
print 'send email utility'

def send_mail_with_attachment(self, from_user, from_password, to, subject, text, attach, mailserver, serverport):
self.mailserver = str(mailserver)
self.serverport = int(serverport)
msg = MIMEMultipart()

msg['From'] = from_user
msg['To'] = to
msg['Subject'] = subject

msg.attach(MIMEText(text))

part = MIMEBase('application', 'octet-stream')
part.set_payload(open(attach, 'rb').read())
#Encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment; filename="%s"' % os.path.basename(attach))
msg.attach(part)

mailServer = smtplib.SMTP(self.mailserver, self.serverport)
mailServer.ehlo()
#mailServer.starttls()
mailServer.ehlo()
#mailServer.login(from_user, from_password)
mailServer.sendmail(from_user, to, msg.as_string())
# Should be mailServer.quit(), but that crashes...
mailServer.close()

def send_mail_no_attachment(self, from_user, from_password, to, subject, text,
mailserver, serverport):
self.mailserver = str(mailserver)
self.serverport = int(serverport)

msg = MIMEMultipart()

msg['From'] = from_user
msg['To'] = to
msg['Subject'] = subject
msg.attach(MIMEText(text))

mailServer = smtplib.SMTP(self.mailserver, self.serverport)
mailServer.ehlo()
#mailServer.starttls()
mailServer.ehlo()
#mailServer.login(from_user, from_password)
mailServer.sendmail(from_user, to, msg.as_string())
# Should be mailServer.quit(), but that crashes...
mailServer.close()


__init__.py:

from mailsend import SendEmailUtility
__version__ = '1.0'

class SelfEmailLibrary(SendEmailUtility):

ROBOT_LIBRARY_SCOPE = 'GLOBAL'


Step3:创建一个脚本测试一下这两个function是否工作:

mailclient.py:

from SelfEmailLibrary import *

a = SendEmailUtility()

a.send_mail_no_attachment(from_user="aaa@aaa.com", from_password='', to="bbb@bbb.com", subject="selftry",
text="asdlfkajsdlfd", mailserver="172.18.0.100", serverport="9999")

a.send_mail_with_attachment(from_user="ddd@ddd.com", from_password='', to="ccc@ccc.com",
subject="selftry",text="bbbbbbbbbb", attach='simple.txt',
mailserver="172.18.0.100", serverport="9999")


Step4: 测试这俩函数对不对:

1. 先双击开启mailserver.py。

2. 执行mailclient.py。

3. 查看mailserver的显示是否正确:



可以看到,邮件的各个属性还有附件内容(simple.txt的内容就是“testkeyword”)都可以查看到。这样我们就可以通过查看mailserver收到的DATA来判断过滤功能了。

Note:

send_mail_with_attachment和send_mail_no_attachment两个函数中的from_password参数其实没有用,可以删掉。然后如果你想用base64加密,可以取消注销掉Encoders.encode_base64(part)这一行。

其实功能已经实现了,要是想让它在RobotFramework中work就是轻而易举的事儿了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: