首页 > 技术文章 > Robot Framework通过Python SMTP进行email收发测试。

bonjov1 2015-08-22 15:30 原文

工作中需要对发送的邮件进行过滤,方法基本属于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_attachmentsend_mail_no_attachment两个函数中的from_password参数其实没有用,可以删掉。然后如果你想用base64加密,可以取消注销掉Encoders.encode_base64(part)这一行。

其实功能已经实现了,要是想让它在RobotFramework中work就是轻而易举的事儿了。

推荐阅读