From ed30cbe9e4885e3cd9d555f4ccdff855ddabb976 Mon Sep 17 00:00:00 2001 From: dongxiaoyan Date: Fri, 3 Apr 2020 13:53:54 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=B5=8B=E8=AF=95=E4=B8=AD?= =?UTF-8?q?=E6=9C=AC=E6=9C=BAIP=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tsg_adc/api_proxy/DenyHttpTests.robot | 9 +- 02-Keyword/tsg_common/StmpHandle.robot | 2 +- 04-CustomLibrary/Smtp4Library/__init__.py | 417 ------------------ .../__pycache__/__init__.cpython-36.pyc | Bin 11414 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 11425 -> 0 bytes .../__pycache__/version.cpython-37.pyc | Bin 207 -> 0 bytes 04-CustomLibrary/Smtp4Library/version.py | 11 - 7 files changed, 7 insertions(+), 432 deletions(-) delete mode 100644 04-CustomLibrary/Smtp4Library/__init__.py delete mode 100644 04-CustomLibrary/Smtp4Library/__pycache__/__init__.cpython-36.pyc delete mode 100644 04-CustomLibrary/Smtp4Library/__pycache__/__init__.cpython-37.pyc delete mode 100644 04-CustomLibrary/Smtp4Library/__pycache__/version.cpython-37.pyc delete mode 100644 04-CustomLibrary/Smtp4Library/version.py diff --git a/01-TestCase/tsg_adc/api_proxy/DenyHttpTests.robot b/01-TestCase/tsg_adc/api_proxy/DenyHttpTests.robot index 368feae..831a388 100644 --- a/01-TestCase/tsg_adc/api_proxy/DenyHttpTests.robot +++ b/01-TestCase/tsg_adc/api_proxy/DenyHttpTests.robot @@ -41,7 +41,7 @@ ProxyPolicy-deny-http-00002 #删除对象 ${objectids} set Variable ${object_FQDN_Id},${object_url_Id},${object_UA_Id},${object_CT_Id} #创建管控策略 - ${addPolicyStr} run keyword if '${addTestClentIPFlag}'=='1' set variable { \ \ \ \ "opAction":"add", \ \ \ \ "returnData":1, \ \ \ \ "policyList":[ \ \ \ \ \ \ \ \ { \ \ \ \ \ \ \ \ \ \ \ \ "policyId":"", \ \ \ \ \ \ \ \ \ \ \ \ "isValid":1, \ \ \ \ \ \ \ \ \ \ \ \ "policyName":"ProxyPolicy-deny-Http-00002", \ \ \ \ \ \ \ \ \ \ \ \ "policyType":"pxy_manipulation", \ \ \ \ \ \ \ \ \ \ \ \ "action":"deny", \ \ \ \ \ \ \ \ \ \ \ \ "userTags":"", \ \ \ \ \ \ \ \ \ \ \ \ "doBlacklist":0, \ \ \ \ \ \ \ \ \ \ \ \ "doLog":1, \ \ \ \ \ \ \ \ \ \ \ \ "userRegion":{ "method": "block", "message": "test", "code": 404,\ \ \ \ \ \ \ \ \ \ \ \ \ "protocol":"HTTP" \ \ \ \ }, \ \ \ \ \ \ \ \ \ \ \ \ "referenceObject":[{"objectId":${testClentID},"protocolFields":["TSG_SECURITY_SOURCE_ADDR"]}, \ \ \ \ \ \ \ \ {"objectId":${object_url_Id},"protocolFields": ["TSG_FIELD_HTTP_URL"]},{"objectId":${object_FQDN_Id},"protocolFields":["TSG_FIELD_HTTP_HOST"]},{"objectId":${object_UA_Id},"protocolFields":["TSG_FIELD_HTTP_REQ_HDR"]},{"objectId":${object_CT_Id},"protocolFields": ["TSG_FIELD_HTTP_RES_HDR"]}], \ \ \ \ \ \ \ \ \ \ \ \ "scheduleId":[],"appObjectIdArray":[2] \ \ \ \ \ \ \ \ } \ \ \ \ ] } + ${addPolicyStr} run keyword if '${addTestClentIPFlag}'=='1' set variable { \ \ \ \ "opAction":"add", \ \ \ \ "returnData":1, \ \ \ \ "policyList":[ \ \ \ \ \ \ \ \ { \ \ \ \ \ \ \ \ \ \ \ \ "policyId":"", \ \ \ \ \ \ \ \ \ \ \ \ "isValid":1, \ \ \ \ \ \ \ \ \ \ \ \ "policyName":"ProxyPolicy-deny-Http-00002", \ \ \ \ \ \ \ \ \ \ \ \ "policyType":"pxy_manipulation", \ \ \ \ \ \ \ \ \ \ \ \ "action":"deny", \ \ \ \ \ \ \ \ \ \ \ \ "userTags":"", \ \ \ \ \ \ \ \ \ \ \ \ "doBlacklist":0, \ \ \ \ \ \ \ \ \ \ \ \ "doLog":1, \ \ \ \ \ \ \ \ \ \ \ \ "userRegion":{ "method": "block", "message": "test", "code": 404,\ \ \ \ \ \ \ \ \ \ \ \ \ "protocol":"HTTP" \ \ \ \ }, \ \ \ \ \ \ \ \ \ \ \ \ "referenceObject":[{"objectId":${testClentID},"protocolFields":["TSG_SECURITY_SOURCE_ADDR"]},{"objectId":${object_url_Id},"protocolFields": ["TSG_FIELD_HTTP_URL"]},{"objectId":${object_FQDN_Id},"protocolFields":["TSG_FIELD_HTTP_HOST"]},{"objectId":${object_UA_Id},"protocolFields":["TSG_FIELD_HTTP_REQ_HDR"]},{"objectId":${object_CT_Id},"protocolFields": ["TSG_FIELD_HTTP_RES_HDR"]}], \ \ \ \ \ \ \ \ \ \ \ \ "scheduleId":[],"appObjectIdArray":[2] \ \ \ \ \ \ \ \ } \ \ \ \ ] } ${rescode} ${policyId3} AddPolicy ${addPolicyStr} log ${policyId3} ${policyId2} set variable {"policyType":"pxy_manipulation","policyIds":[${policyId3}]} @@ -168,7 +168,8 @@ ProxyPolicy-deny-http-00009 #删除对象 ${objectids} set Variable ${object_FQDN_Id},${object_url_Id},${object_body_Id} #创建管控策略 - ${addPolicyStr} run keyword if '${addTestClentIPFlag}'=='1' set variable { \ \ \ \ "opAction":"add", \ \ \ \ "returnData":1, \ \ \ \ "policyList":[ \ \ \ \ \ \ \ \ { \ \ \ \ \ \ \ \ \ \ \ \ "policyId":"", \ \ \ \ \ \ \ \ \ \ \ \ "isValid":1, \ \ \ \ \ \ \ \ \ \ \ \ "policyName":"ProxyPolicy-deny-Https-00009", \ \ \ \ \ \ \ \ \ \ \ \ "policyType":"pxy_manipulation", \ \ \ \ \ \ \ \ \ \ \ \ "action":"deny", \ \ \ \ \ \ \ \ \ \ \ \ "userTags":"", \ \ \ \ \ \ \ \ \ \ \ \ "doBlacklist":0, \ \ \ \ \ \ \ \ \ \ \ \ "doLog":1, \ \ \ \ \ \ \ \ \ \ \ \ "userRegion":{ "method": "block", "html_profile": 11, "code": 404,\ \ \ \ \ \ \ \ \ \ \ \ \ "protocol":"HTTP" \ \ \ \ }, \ \ \ \ \ \ \ \ \ \ \ \ "referenceObject":[ \ \ \ \ \ \ \ \ {"objectId":${object_url_Id},"protocolFields": ["TSG_FIELD_HTTP_URL"]},{"objectId":${object_body_Id},"protocolFields":["TSG_FIELD_HTTP_REQ_CONTENT"]}], \ \ \ \ \ \ \ \ \ \ \ \ "scheduleId":[],"appObjectIdArray":[2] \ \ \ \ \ \ \ \ } \ \ \ \ ] } + ${addPolicyStr} set variable { \ \ \ \ "opAction":"add", \ \ \ \ "returnData":1, \ \ \ \ "policyList":[ \ \ \ \ \ \ \ \ { \ \ \ \ \ \ \ \ \ \ \ \ "policyId":"", \ \ \ \ \ \ \ \ \ \ \ \ "isValid":1, \ \ \ \ \ \ \ \ \ \ \ \ "policyName":"ProxyPolicy-deny-Https-00009", \ \ \ \ \ \ \ \ \ \ \ \ "policyType":"pxy_manipulation", \ \ \ \ \ \ \ \ \ \ \ \ "action":"deny", \ \ \ \ \ \ \ \ \ \ \ \ "userTags":"", \ \ \ \ \ \ \ \ \ \ \ \ "doBlacklist":0, \ \ \ \ \ \ \ \ \ \ \ \ "doLog":1, \ \ \ \ \ \ \ \ \ \ \ \ "userRegion":{ "method": "block", "html_profile": 11, "code": 404,\ \ \ \ \ \ \ \ \ \ \ \ \ "protocol":"HTTP" \ \ \ \ }, \ \ \ \ \ \ \ \ \ \ \ \ "referenceObject":[ \ \ \ \ \ \ \ \ {"objectId":${object_url_Id},"protocolFields": ["TSG_FIELD_HTTP_URL"]},{"objectId":${object_body_Id},"protocolFields":["TSG_FIELD_HTTP_REQ_CONTENT"]}], \ \ \ \ \ \ \ \ \ \ \ \ "scheduleId":[],"appObjectIdArray":[2] \ \ \ \ \ \ \ \ } \ \ \ \ ] } + ${addPolicyStr} run keyword if '${addTestClentIPFlag}'=='1' set variable { \ \ \ \ "opAction":"add", \ \ \ \ "returnData":1, \ \ \ \ "policyList":[ \ \ \ \ \ \ \ \ { \ \ \ \ \ \ \ \ \ \ \ \ "policyId":"", \ \ \ \ \ \ \ \ \ \ \ \ "isValid":1, \ \ \ \ \ \ \ \ \ \ \ \ "policyName":"ProxyPolicy-deny-Https-00009", \ \ \ \ \ \ \ \ \ \ \ \ "policyType":"pxy_manipulation", \ \ \ \ \ \ \ \ \ \ \ \ "action":"deny", \ \ \ \ \ \ \ \ \ \ \ \ "userTags":"", \ \ \ \ \ \ \ \ \ \ \ \ "doBlacklist":0, \ \ \ \ \ \ \ \ \ \ \ \ "doLog":1, \ \ \ \ \ \ \ \ \ \ \ \ "userRegion":{ "method": "block", "html_profile": 11, "code": 404,\ \ \ \ \ \ \ \ \ \ \ \ \ "protocol":"HTTP" \ \ \ \ }, \ \ \ \ \ \ \ \ \ \ \ \ "referenceObject":[{"objectId":${testClentID},"protocolFields":["TSG_SECURITY_SOURCE_ADDR"]},{"objectId":${object_url_Id},"protocolFields": ["TSG_FIELD_HTTP_URL"]},{"objectId":${object_body_Id},"protocolFields":["TSG_FIELD_HTTP_REQ_CONTENT"]}], \ \ \ \ \ \ \ \ \ \ \ \ "scheduleId":[],"appObjectIdArray":[2] \ \ \ \ \ \ \ \ } \ \ \ \ ] } ${rescode} ${policyId3} AddPolicy ${addPolicyStr} log ${policyId3} ${policyId2} set variable {"policyType":"pxy_manipulation","policyIds":[${policyId3}]} @@ -210,7 +211,9 @@ ProxyPolicy-deny-http-00013 #删除对象 ${objectids} set Variable ${object_FQDN_Id},${object_url_Id},${object_body_Id} #创建管控策略 - ${addPolicyStr} run keyword if '${addTestClentIPFlag}'=='1' set variable { \ \ \ \ "opAction":"add", \ \ \ \ "returnData":1, \ \ \ \ "policyList":[ \ \ \ \ \ \ \ \ { \ \ \ \ \ \ \ \ \ \ \ \ "policyId":"", \ \ \ \ \ \ \ \ \ \ \ \ "isValid":1, \ \ \ \ \ \ \ \ \ \ \ \ "policyName":"ProxyPolicy-deny-Https-00009", \ \ \ \ \ \ \ \ \ \ \ \ "policyType":"pxy_manipulation", \ \ \ \ \ \ \ \ \ \ \ \ "action":"deny", \ \ \ \ \ \ \ \ \ \ \ \ "userTags":"", \ \ \ \ \ \ \ \ \ \ \ \ "doBlacklist":0, \ \ \ \ \ \ \ \ \ \ \ \ "doLog":1, \ \ \ \ \ \ \ \ \ \ \ \ "userRegion":{ "method": "block", "message": "404", "code": 404,\ \ \ \ \ \ \ \ \ \ \ \ \ "protocol":"HTTP" \ \ \ \ }, \ \ \ \ \ \ \ \ \ \ \ \ "referenceObject":[ \ \ \ \ \ \ \ \ {"objectId":${object_url_Id},"protocolFields": ["TSG_FIELD_HTTP_URL"]},{"objectId":${object_body_Id},"protocolFields":["TSG_FIELD_HTTP_REQ_CONTENT"]}], \ \ \ \ \ \ \ \ \ \ \ \ "scheduleId":[],"appObjectIdArray":[2] \ \ \ \ \ \ \ \ } \ \ \ \ ] } + ${addPolicyStr}set variable { \ \ \ \ "opAction":"add", \ \ \ \ "returnData":1, \ \ \ \ "policyList":[ \ \ \ \ \ \ \ \ { \ \ \ \ \ \ \ \ \ \ \ \ "policyId":"", \ \ \ \ \ \ \ \ \ \ \ \ "isValid":1, \ \ \ \ \ \ \ \ \ \ \ \ "policyName":"ProxyPolicy-deny-Https-00009", \ \ \ \ \ \ \ \ \ \ \ \ "policyType":"pxy_manipulation", \ \ \ \ \ \ \ \ \ \ \ \ "action":"deny", \ \ \ \ \ \ \ \ \ \ \ \ "userTags":"", \ \ \ \ \ \ \ \ \ \ \ \ "doBlacklist":0, \ \ \ \ \ \ \ \ \ \ \ \ "doLog":1, \ \ \ \ \ \ \ \ \ \ \ \ "userRegion":{ "method": "block", "message": "404", "code": 404,\ \ \ \ \ \ \ \ \ \ \ \ \ "protocol":"HTTP" \ \ \ \ }, \ \ \ \ \ \ \ \ \ \ \ \ "referenceObject":[ \ \ \ \ \ \ \ \ {"objectId":${object_url_Id},"protocolFields": ["TSG_FIELD_HTTP_URL"]},{"objectId":${object_body_Id},"protocolFields":["TSG_FIELD_HTTP_REQ_CONTENT"]}], \ \ \ \ \ \ \ \ \ \ \ \ "scheduleId":[],"appObjectIdArray":[2] \ \ \ \ \ \ \ \ } \ \ \ \ ] } + + ${addPolicyStr} run keyword if '${addTestClentIPFlag}'=='1' set variable { \ \ \ \ "opAction":"add", \ \ \ \ "returnData":1, \ \ \ \ "policyList":[ \ \ \ \ \ \ \ \ { \ \ \ \ \ \ \ \ \ \ \ \ "policyId":"", \ \ \ \ \ \ \ \ \ \ \ \ "isValid":1, \ \ \ \ \ \ \ \ \ \ \ \ "policyName":"ProxyPolicy-deny-Https-00009", \ \ \ \ \ \ \ \ \ \ \ \ "policyType":"pxy_manipulation", \ \ \ \ \ \ \ \ \ \ \ \ "action":"deny", \ \ \ \ \ \ \ \ \ \ \ \ "userTags":"", \ \ \ \ \ \ \ \ \ \ \ \ "doBlacklist":0, \ \ \ \ \ \ \ \ \ \ \ \ "doLog":1, \ \ \ \ \ \ \ \ \ \ \ \ "userRegion":{ "method": "block", "message": "404", "code": 404,\ \ \ \ \ \ \ \ \ \ \ \ \ "protocol":"HTTP" \ \ \ \ }, \ \ \ \ \ \ \ \ \ \ \ \ "referenceObject":[ {"objectId":${testClentID},"protocolFields":["TSG_SECURITY_SOURCE_ADDR"]},{"objectId":${object_url_Id},"protocolFields": ["TSG_FIELD_HTTP_URL"]},{"objectId":${object_body_Id},"protocolFields":["TSG_FIELD_HTTP_REQ_CONTENT"]}], \ \ \ \ \ \ \ \ \ \ \ \ "scheduleId":[],"appObjectIdArray":[2] \ \ \ \ \ \ \ \ } \ \ \ \ ] } ${rescode} ${policyId3} AddPolicy ${addPolicyStr} log ${policyId3} ${policyId2} set variable {"policyType":"pxy_manipulation","policyIds":[${policyId3}]} diff --git a/02-Keyword/tsg_common/StmpHandle.robot b/02-Keyword/tsg_common/StmpHandle.robot index fa85bfd..161b240 100644 --- a/02-Keyword/tsg_common/StmpHandle.robot +++ b/02-Keyword/tsg_common/StmpHandle.robot @@ -1,5 +1,5 @@ *** Settings *** -Library Smtp4Library +Library Smtp3Library *** Keywords *** EmailLogin diff --git a/04-CustomLibrary/Smtp4Library/__init__.py b/04-CustomLibrary/Smtp4Library/__init__.py deleted file mode 100644 index dff36a4..0000000 --- a/04-CustomLibrary/Smtp4Library/__init__.py +++ /dev/null @@ -1,417 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# This file is part of robotframework-Smtp3Library. -# https://github.io/lucamaro/robotframework-Smtp3Library - -# Licensed under the Apache License 2.0 license: -# http://www.opensource.org/licenses/Apache-2.0 -# Copyright (c) 2016, Luca Maragnani - -""" -Library implementation -""" -import ast -import smtplib -import email -import random -import string -import mimetypes -import quopri -from email.message import Message -from email.mime.audio import MIMEAudio -from email.mime.base import MIMEBase -from email.mime.image import MIMEImage -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -from email import encoders -import os.path -import socket -from robot.api.deco import keyword -from robot.api import logger - -from Smtp3Library.version import __version__ # NOQA - -COMMASPACE = ', ' - -class Smtp3Library(object): - """ - SMTP Client class - """ - - def __init__(self): - """ - Constructor - """ - self.message = self._MailMessage() - self.host = None - self.port = None - self.user = None - self.password = None - self.smtp = None - - def _prepare_connection(self, host, port, user=None, password=None): - """ - Private method to collect connection informations - """ - self.host = host - self.port = int(port) - self.user = user - self.password = password - self.client_hostname = socket.gethostname() - - - def prepare_ssl_connection(self, host, port=465, user=None, password=None): - """ - Collect connection informations for SSL channel - """ - self._prepare_connection(host, port, user, password) - self.smtp = smtplib.SMTP_SSL() - - def prepare_connection(self, host, port=25, user=None, password=None): - """ - Collect connection informations for unencrypted channel - """ - self._prepare_connection(host, port, user, password) - self.smtp = smtplib.SMTP() - - def add_to_recipient(self, recipient): - """ - Add a recipient to "To:" list - """ - self.message.mail_to.append(recipient) - - def add_cc_recipient(self, recipient): - """ - Add a recipient to "Cc:" list - """ - self.message.mail_cc.append(recipient) - - def add_bcc_recipient(self, recipient): - """ - Add a recipient to "Bcc:" list - """ - self.message.mail_bcc.append(recipient) - - def set_subject(self, subj): - """ - Set email subject - """ - self.message.subject = subj - - def set_from(self, from_recipient): - """ - Set from address of message and envelope - """ - self.message.mail_from = from_recipient - - def set_body(self, body): - """ - Set email body - """ - self.message.body = body - - def set_random_body(self, size): - """ - Set a random body of length - """ - body = '' - for i in range(0, size): - body += ''.join(random.choice(string.uppercase + string.digits)) - if i % 80 == 0: - body += "\n" - self.message.body = body - - def add_attachment(self, attach): - """ - Add attachment to a list of filenames - """ - self.message.attachments.append(attach) - - def add_header(self, name, value): - """ - Add a custom header to headers list - """ - self.message.headers[name] = value - - def connect(self): - ''' - Open connection to server - Returns tuple (smtp status code, message) - ''' - return self.smtp.connect(self.host, self.port) - - def present_client_as(self, client_hostname): - ''' - Set helo/ehlo client identity - ''' - self.client_hostname = client_hostname - - def helo(self): - ''' - Send HELO command - Returns tuple (smtp status code, message) - ''' - result = self.smtp.helo(self.client_hostname) - logger.info(result) - return result - - def ehlo(self): - ''' - Send EHLO command - Returns tuple (smtp status code, message) - ''' - result = self.smtp.ehlo(self.client_hostname) - logger.info(result) - return result - - def get_esmtp_features(self): - ''' - Returns hashmap with ESMTP feature received with EHLO - ''' - logger.info(self.smtp.esmtp_features) - return self.smtp.esmtp_features - - def logins(self): - try: - ''' - Login user - Returns tuple (smtp status code, message) - ''' - logger.info("Login with user " + self.user + " and password " + self.password) - '''try: - subuser=bytes.decode(self.user) - subpassword=bytes.decode(self.password) - result = self.smtp.login(subuser.encode('ascii'), subpassword.encode('ascii')) - logger.info(result) - return result - except: - logger.info("本身就是str类型不需要bytes to str!") - subuser=str(self.user).encode('ascii') - subpassword=str(self.password).encode('ascii') - result = self.smtp.login(subuser, subpassword) - logger.info(result) - return result''' - result = self.smtp.login(self.user, self.password) - logger.info(result) - return "success" - except: - return "fail" - - - def starttls(self, keyfile=None, certfile=None): - ''' - sends STARTTLS - optional: keyfile certfile - Returns tuple (smtp status code, message) - ''' - logger.info("STARTTLS") - if keyfile is None and certfile is None: - result = self.smtp.starttls() - else: - result = self.smtp.starttls(keyfile, certfile) - logger.info(result) - return result - - def data(self): - ''' - Data command send email body with "MAIL FROM:", "RCPT TO:" and "DATA" commands - Returns tuple (smtp status code, message) - ''' - result = self.smtp.mail(self.message.mail_from) - result += self.smtp.rcpt(self.message.get_message_recipients()) - - result += self.smtp.data(self.message.get_message_as_string()) - logger.info(result) - return result - - def sendmail(self): - ''' - Send email with "MAIL FROM:", "RCPT TO:" and "DATA" commands - Returns tuple (smtp status code, message) - ''' - result = self.smtp.sendmail(self.message.mail_from, self.message.get_message_recipients(), self.message.get_message_as_string()) - logger.info(result) - return result - - def quit(self): - ''' - Send QUIT command - Returns tuple (smtp status code, message) - ''' - result = self.smtp.quit() - logger.info(result) - return result - - def close_connection(self): - ''' - Close connection to server - ''' - return self.smtp.close() - - def send_message(self): - """ - Send the message, from connection establishment to quit and close connection. - All the connection and email parameters must be already set before invocation. - Returns sendmail response (code, message) - """ - - # Send the message - try: - self.connect() - - if self.user is not None: - self.ehlo() - self.logins() - - send_result = self.sendmail() - - self.quit() - self.close_connection() - # return send_result - return "success" - except: - return "fail" - - @keyword('Send Message With All Parameters') - def send_message_full(self, host, user, password, subj, - from_recipient, to_recipient, cc_recipient=None, bcc_recipient=None, - body=None, attach=None): - """ - Send a message specifing all parameters on the same linecc - cc, bcc and attach parameters may be strings or array of strings - host, user, password, subj, fromadd, toadd - are mandatory parameters - to use the optional paramaters pleas specify the name fo the parameter in the call - user and password even if mandatory could be set to None so no authentication will be made - Example: - sendMail("smtp.mail.com", None, None, "The subject", "me@mail.com", "friend@mai.com", body="Hello World body") - - sendMail("smtp.mail.com", "scott", "tiger", "The subject", "me@mail.com", "friend@mai.com", body="Hello World body", attach=attaches - where could be: - attaches = ["c:\\desktop\\file1.zip", "c:\\desktop\\file2.zip"] or - attaches = "c:\\desktop\\file1.zip" - Returns sendmail response (code, message) - """ - - self.host = host - self.user = user - self.password = password - - self.set_subject(subj) - self.set_from(from_recipient) - self.message.mail_to = to_recipient - if cc_recipient != None: - self.message.mail_cc = cc_recipient - if bcc_recipient != None: - self.message.mail_bcc = bcc_recipient - #Fill the message - if body != None: - self.set_body(body) - # Part two is attachment - if attach != None: - attachlist = ast.literal_eval(attach) - self.message.attachments = attachlist - #logger.info("self.message.attachments:"+str(type(self.message.attachments))) - #logger.info("attachtype:"+str(type(attachlist))) - #logger.info("attachlist:"+str(attachlist)) - - return self.send_message() - - - class _MailMessage: - """ - Simplified email message - This class represent email headers and payload content, not envelope data - """ - - def __init__(self): - """ - init object variables - """ - self.mail_from = None - self.mail_to = [] - self.mail_cc = [] - self.mail_bcc = [] - self.subject = '' - self.body = '' - self.attachments = [] - self.headers = {} - - def get_message_recipients(self): - ''' - Get all message recipients (to, cc, bcc) - ''' - recipients = [] - tolist = ast.literal_eval(self.mail_to) - cclist = ast.literal_eval(self.mail_cc) - bcclist = ast.literal_eval(self.mail_bcc) - recipients.extend(tolist) - recipients.extend(cclist) - recipients.extend(bcclist) - #logger.info("recipientslist:"+str(recipients)) - return recipients - - def get_message_as_string(self): - ''' - Get message as string to be sent with smtplib.sendmail api - ''' - if len(self.attachments) > 0: - #logger.info("attachments:"+str(self.attachments)) - #logger.info("attachmentstype:"+str(type(self.attachments))) - #logger.info("attachmentsnum:"+str(len(self.attachments))) - - envelope = MIMEMultipart() - envelope.attach(MIMEText(self.body)) - else: - envelope = MIMEText(self.body) - - recipients = self.get_message_recipients() - - - tolist = ast.literal_eval(self.mail_to) - cclist = ast.literal_eval(self.mail_cc) - envelope['From'] = self.mail_from - envelope['To'] = COMMASPACE.join(tolist) - envelope['Cc'] = COMMASPACE.join(cclist) - envelope['Subject'] = self.subject - #logger.info("envelope111:"+str(self.attachments)) - for attachment in list(self.attachments): - ctype, encoding = mimetypes.guess_type(attachment) - #logger.info("attachment:"+attachment+" ctype:"+str(ctype)+" encoding:"+str(encoding)) - if ctype is None or encoding is not None: - # No guess could be made, or the file is encoded (compressed), so - # use a generic bag-of-bits type. - ctype = 'application/octet-stream' - maintype, subtype = ctype.split('/', 1) - #logger.info("maintype:"+str(maintype)+" subtype:"+str(subtype)) - - msg = None - if maintype == 'text': - attach_file = open(attachment,'rb') - # TODO: we should handle calculating the charset - msg = MIMEText(attach_file.read(), _subtype=subtype, _charset='utf-8') - attach_file.close() - elif maintype == 'image': - attach_file = open(attachment, 'rb') - msg = MIMEImage(attach_file.read(), _subtype=subtype) - attach_file.close() - elif maintype == 'audio': - attach_file = open(attachment, 'rb') - msg = MIMEAudio(attach_file.read(), _subtype=subtype) - attach_file.close() - else: - attach_file = open(attachment, 'rb') - msg = MIMEBase(maintype, subtype) - msg.set_payload(attach_file.read()) - attach_file.close() - # Encode the payload using Base64 - encoders.encode_base64(msg) - - # Set the filename parameter - msg.add_header('Content-Disposition', 'attachment', - filename=os.path.basename(attachment)) - envelope.attach(msg) - - - #logger.info("envelope.as_string:"+envelope.as_string()) - return envelope.as_string() diff --git a/04-CustomLibrary/Smtp4Library/__pycache__/__init__.cpython-36.pyc b/04-CustomLibrary/Smtp4Library/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index 15fa648e65991a6913e37d85ec4d66b7a1d62dde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11414 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 b(fyd%6p^P++ot%Z%{Bhh6WnPHP1pVh%pdOM diff --git a/04-CustomLibrary/Smtp4Library/__pycache__/__init__.cpython-37.pyc b/04-CustomLibrary/Smtp4Library/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 29c241ca23096db085ed71aab6cd098c227caf21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11425 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 KaHrKZUHc#Pp!+ib diff --git a/04-CustomLibrary/Smtp4Library/__pycache__/version.cpython-37.pyc b/04-CustomLibrary/Smtp4Library/__pycache__/version.cpython-37.pyc deleted file mode 100644 index d83a4bb4afea179cd29ae352feed4e5d46c56031..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmZ?b<>g`kg4PMyaWRYx439w^7y$Aa9Dul(14yJWL@}f=1~X_fRk0fA8R{APX)@m8 zj*l-(Eh^5;&x?;=$xy@uR0k%$CIDH^RxzQ)K-rk58~UI3tcr0gC~!$ENsRHyPfpB< z2`I`>FG|cUjtQtN$;i)xQpV;nIhjc@#hE3kx&?{J*@@|?#WBITB?ZPlnMp;7MU^p7 Z`}7JbZ*kb<=BJeAq}p) - -__version__ = '0.1.3' # NOQA