Git Product home page Git Product logo

email-header-analyzer's People

Contributors

joelkle avatar judokus avatar lnxg33k avatar staypirate avatar xiol avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

email-header-analyzer's Issues

docker build failed

Could not open requirements file: [Errno 2] No such file or directory: '/mha/requirements.txt'
The command '/bin/sh -c pip install --no-cache-dir -r /mha/requirements.txt' returned a non-zero code: 1

Oulook and Gmail header return error :(

When using a Header from Thunderbird, from my postfix server works fine, but if I try to use a header from Outlook.com or Gmail.com it returns this error:

Traceback (most recent call last):
File "/usr/lib/python3.7/site-packages/flask/app.py", line 2309, in call
return self.wsgi_app(environ, start_response)
File "/usr/lib/python3.7/site-packages/flask/app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "/usr/lib/python3.7/site-packages/flask/app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/usr/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/usr/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/usr/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functionsrule.endpoint
File "/home/petry/projetos/MHA/server.py", line 105, in index
org_time = dateParser(line[1])
IndexError: list index out of range

Do you have any idea how we could fix this?

[Feature Request] Make server.py work out box with mod_wsgi for apache.

Thanks for this project. Works well. Below are instructions HOWTO for centos 7 and httpd (apache)

I had to add "application = app" to the bottom of server.py for this to work.
Additionally, modified index.html to use relative links for anchor tags, instead of "/". Same for for finding "filename=", to make css and javascript to work.

$ yum install python3-mod_wsgi.x86_64

[mha]# pwd
/var/www/python/mha

[mha]# tail server.py
application = app

[mha]# cat /etc/httpd/conf.d/header-analyzer.conf```

WSGIScriptAlias /mha /var/www/python/mha/server.py

WSGIDaemonProcess FlaskApp python-path=/var/www/python/mha/:/usr/local/lib/python3.6/site-packages/
WSGIProcessGroup FlaskApp

<Directory /var/www/python/mha/>
       Order allow,deny
       Allow from all
</Directory>

Alias /media/ /var/www/python/mha/media/
Alias /static/ /var/www/python/mha/static/

<Directory /var/www/python/mha/static>
       Order allow,deny
       Allow from all
</Directory>

<Directory /var/www/python/mha/media>
       Order allow,deny
       Allow from all
</Directory>

Time related parsing issues

Errors in parsing time related entries in a header causing an exception.

Failing header entry:

Received: by mail.server.com with SMTP id thing0430p1iad2-24881-5C0E517F-22
        2018-12-10 11:43:59.610180118 +0000 UTC m=+555016.724468750

The portion following the time entry m=+555016.724468750 causes the error in server.py, line 134
"delay = org_time.second - next_time.second"

If the line was truncated after the timezone denomination (UTC in this case) when passing data to "python-dateutil" dependancy, the error no longer occurs.

aiohttp does not build with python 3.12

Build error with FROM python:3-alpine

However, successful build with FROM python:3.9-alpine

see build error:

57.02 Building wheels for collected packages: IPy, aiohttp, maxminddb, frozenlist, multidict, yarl
57.02   Building wheel for IPy (setup.py): started
57.49   Building wheel for IPy (setup.py): finished with status 'done'
57.49   Created wheel for IPy: filename=IPy-1.1-py3-none-any.whl size=19438 sha256=7fe37c23432bb7502cd1b012f2c612e535dc791a3f6780234616b70030b2fbad
57.49   Stored in directory: /tmp/pip-ephem-wheel-cache-aoavfkhg/wheels/d3/66/dc/bf9e1a4b521b61e56e42c0e782bd09356edc50a605857f6e84
57.50   Building wheel for aiohttp (pyproject.toml): started
58.19   Building wheel for aiohttp (pyproject.toml): finished with status 'error'
58.21   error: subprocess-exited-with-error
58.21   
58.21   × Building wheel for aiohttp (pyproject.toml) did not run successfully.
58.21   │ exit code: 1
58.21   ╰─> [160 lines of output]
58.21       *********************
58.21       * Accelerated build *
58.21       *********************
58.21       running bdist_wheel
58.21       running build
58.21       running build_py
58.21       creating build
58.21       creating build/lib.linux-x86_64-cpython-312
58.21       creating build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_response.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/resolver.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_ws.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/client_proto.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/typedefs.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_app.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/streams.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/log.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/http_websocket.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/connector.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/payload.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_log.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_exceptions.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/pytest_plugin.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/tracing.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/helpers.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/http_exceptions.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_server.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_urldispatcher.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/client.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/abc.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/formdata.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/client_exceptions.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/tcp_helpers.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/client_ws.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_middlewares.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/client_reqrep.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_routedef.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/multipart.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_runner.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/base_protocol.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/http.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/http_parser.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/cookiejar.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_request.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/__init__.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/hdrs.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/test_utils.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/worker.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_fileresponse.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/payload_streamer.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/http_writer.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/locks.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/web_protocol.py -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       running egg_info
58.21       writing aiohttp.egg-info/PKG-INFO
58.21       writing dependency_links to aiohttp.egg-info/dependency_links.txt
58.21       writing requirements to aiohttp.egg-info/requires.txt
58.21       writing top-level names to aiohttp.egg-info/top_level.txt
58.21       reading manifest file 'aiohttp.egg-info/SOURCES.txt'
58.21       reading manifest template 'MANIFEST.in'
58.21       warning: no files found matching 'aiohttp' anywhere in distribution
58.21       warning: no previously-included files matching '*.pyc' found anywhere in distribution
58.21       warning: no previously-included files matching '*.pyd' found anywhere in distribution
58.21       warning: no previously-included files matching '*.so' found anywhere in distribution
58.21       warning: no previously-included files matching '*.lib' found anywhere in distribution
58.21       warning: no previously-included files matching '*.dll' found anywhere in distribution
58.21       warning: no previously-included files matching '*.a' found anywhere in distribution
58.21       warning: no previously-included files matching '*.obj' found anywhere in distribution
58.21       warning: no previously-included files found matching 'aiohttp/*.html'
58.21       no previously-included directories found matching 'docs/_build'
58.21       adding license file 'LICENSE.txt'
58.21       writing manifest file 'aiohttp.egg-info/SOURCES.txt'
58.21       copying aiohttp/_cparser.pxd -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/_find_header.pxd -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/_headers.pxi -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/_helpers.pyi -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/_helpers.pyx -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/_http_parser.pyx -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/_http_writer.pyx -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/_websocket.pyx -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       copying aiohttp/py.typed -> build/lib.linux-x86_64-cpython-312/aiohttp
58.21       creating build/lib.linux-x86_64-cpython-312/aiohttp/.hash
58.21       copying aiohttp/.hash/_cparser.pxd.hash -> build/lib.linux-x86_64-cpython-312/aiohttp/.hash
58.21       copying aiohttp/.hash/_find_header.pxd.hash -> build/lib.linux-x86_64-cpython-312/aiohttp/.hash
58.21       copying aiohttp/.hash/_helpers.pyi.hash -> build/lib.linux-x86_64-cpython-312/aiohttp/.hash
58.21       copying aiohttp/.hash/_helpers.pyx.hash -> build/lib.linux-x86_64-cpython-312/aiohttp/.hash
58.21       copying aiohttp/.hash/_http_parser.pyx.hash -> build/lib.linux-x86_64-cpython-312/aiohttp/.hash
58.21       copying aiohttp/.hash/_http_writer.pyx.hash -> build/lib.linux-x86_64-cpython-312/aiohttp/.hash
58.21       copying aiohttp/.hash/_websocket.pyx.hash -> build/lib.linux-x86_64-cpython-312/aiohttp/.hash
58.21       copying aiohttp/.hash/hdrs.py.hash -> build/lib.linux-x86_64-cpython-312/aiohttp/.hash
58.21       running build_ext
58.21       building 'aiohttp._websocket' extension
58.21       creating build/temp.linux-x86_64-cpython-312
58.21       creating build/temp.linux-x86_64-cpython-312/aiohttp
58.21       gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -I/usr/local/include/python3.12 -c aiohttp/_websocket.c -o build/temp.linux-x86_64-cpython-312/aiohttp/_websocket.o
58.21       aiohttp/_websocket.c: In function '__pyx_pf_7aiohttp_10_websocket__websocket_mask_cython':
58.21       aiohttp/_websocket.c:1475:3: warning: 'Py_OptimizeFlag' is deprecated [-Wdeprecated-declarations]
58.21        1475 |   if (unlikely(!Py_OptimizeFlag)) {
58.21             |   ^~
58.21       In file included from /usr/local/include/python3.12/Python.h:48,
58.21                        from aiohttp/_websocket.c:6:
58.21       /usr/local/include/python3.12/cpython/pydebug.h:13:37: note: declared here
58.21          13 | Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_OptimizeFlag;
58.21             |                                     ^~~~~~~~~~~~~~~
58.21       aiohttp/_websocket.c: In function '__Pyx_get_tp_dict_version':
58.21       aiohttp/_websocket.c:2680:5: warning: 'ma_version_tag' is deprecated [-Wdeprecated-declarations]
58.21        2680 |     return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0;
58.21             |     ^~~~~~
58.21       In file included from /usr/local/include/python3.12/dictobject.h:90,
58.21                        from /usr/local/include/python3.12/Python.h:61:
58.21       /usr/local/include/python3.12/cpython/dictobject.h:22:34: note: declared here
58.21          22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
58.21             |                                  ^~~~~~~~~~~~~~
58.21       aiohttp/_websocket.c: In function '__Pyx_get_object_dict_version':
58.21       aiohttp/_websocket.c:2692:5: warning: 'ma_version_tag' is deprecated [-Wdeprecated-declarations]
58.21        2692 |     return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0;
58.21             |     ^~~~~~
58.21       /usr/local/include/python3.12/cpython/dictobject.h:22:34: note: declared here
58.21          22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
58.21             |                                  ^~~~~~~~~~~~~~
58.21       aiohttp/_websocket.c: In function '__Pyx_object_dict_version_matches':
58.21       aiohttp/_websocket.c:2696:5: warning: 'ma_version_tag' is deprecated [-Wdeprecated-declarations]
58.21        2696 |     if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict)))
58.21             |     ^~
58.21       /usr/local/include/python3.12/cpython/dictobject.h:22:34: note: declared here
58.21          22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
58.21             |                                  ^~~~~~~~~~~~~~
58.21       aiohttp/_websocket.c: In function '__Pyx_CLineForTraceback':
58.21       aiohttp/_websocket.c:2741:9: warning: 'ma_version_tag' is deprecated [-Wdeprecated-declarations]
58.21        2741 |         __PYX_PY_DICT_LOOKUP_IF_MODIFIED(
58.21             |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
58.21       /usr/local/include/python3.12/cpython/dictobject.h:22:34: note: declared here
58.21          22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
58.21             |                                  ^~~~~~~~~~~~~~
58.21       aiohttp/_websocket.c:2741:9: warning: 'ma_version_tag' is deprecated [-Wdeprecated-declarations]
58.21        2741 |         __PYX_PY_DICT_LOOKUP_IF_MODIFIED(
58.21             |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
58.21       /usr/local/include/python3.12/cpython/dictobject.h:22:34: note: declared here
58.21          22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
58.21             |                                  ^~~~~~~~~~~~~~
58.21       aiohttp/_websocket.c: In function '__Pyx_PyInt_As_long':
58.21       aiohttp/_websocket.c:3042:53: error: 'PyLongObject' {aka 'struct _longobject'} has no member named 'ob_digit'
58.21        3042 |             const digit* digits = ((PyLongObject*)x)->ob_digit;
58.21             |                                                     ^~
58.21       aiohttp/_websocket.c:3097:53: error: 'PyLongObject' {aka 'struct _longobject'} has no member named 'ob_digit'
58.21        3097 |             const digit* digits = ((PyLongObject*)x)->ob_digit;
58.21             |                                                     ^~
58.21       aiohttp/_websocket.c: In function '__Pyx_PyInt_As_int':
58.21       aiohttp/_websocket.c:3238:53: error: 'PyLongObject' {aka 'struct _longobject'} has no member named 'ob_digit'
58.21        3238 |             const digit* digits = ((PyLongObject*)x)->ob_digit;
58.21             |                                                     ^~
58.21       aiohttp/_websocket.c:3293:53: error: 'PyLongObject' {aka 'struct _longobject'} has no member named 'ob_digit'
58.21        3293 |             const digit* digits = ((PyLongObject*)x)->ob_digit;
58.21             |                                                     ^~
58.21       aiohttp/_websocket.c: In function '__Pyx_PyIndex_AsSsize_t':
58.21       aiohttp/_websocket.c:3744:45: error: 'PyLongObject' {aka 'struct _longobject'} has no member named 'ob_digit'
58.21        3744 |     const digit* digits = ((PyLongObject*)b)->ob_digit;
58.21             |                                             ^~
58.21       error: command '/usr/bin/gcc' failed with exit code 1
58.21       [end of output]
58.21   
58.21   note: This error originates from a subprocess, and is likely not a problem with pip.
58.21   ERROR: Failed building wheel for aiohttp
58.21   Building wheel for maxminddb (pyproject.toml): started
58.79   Building wheel for maxminddb (pyproject.toml): finished with status 'done'
58.79   Created wheel for maxminddb: filename=maxminddb-2.4.0-py2.py3-none-any.whl size=16401 sha256=7dfb6488a473f0ae1ef0d60f2730801ce29f19d1f8e252442cd2c0dfe71fd810
58.79   Stored in directory: /tmp/pip-ephem-wheel-cache-aoavfkhg/wheels/37/5a/39/34619b85ae625025c06a03136df11a0e5b3d7bc63cc50d9023
58.80   Building wheel for frozenlist (pyproject.toml): started
65.66   Building wheel for frozenlist (pyproject.toml): finished with status 'done'
65.66   Created wheel for frozenlist: filename=frozenlist-1.4.0-cp312-cp312-linux_x86_64.whl size=260932 sha256=7c6c5005e70b2c5815bd113e0c1a8d72aa70271b01f8913245e5ee2b221819fb
65.66   Stored in directory: /tmp/pip-ephem-wheel-cache-aoavfkhg/wheels/f1/9c/94/9386cb0ea511a93226456388d41d35f1c24ba15a62ffd7b1ef
65.67   Building wheel for multidict (pyproject.toml): started
68.23   Building wheel for multidict (pyproject.toml): finished with status 'done'
68.24   Created wheel for multidict: filename=multidict-6.0.4-cp312-cp312-linux_x86_64.whl size=115558 sha256=d07de968430ed2ec14f854f68b69f26410f5e02191fbe4e99a0ae7ccf5805270
68.24   Stored in directory: /tmp/pip-ephem-wheel-cache-aoavfkhg/wheels/f6/d8/ff/3c14a64b8f2ab1aa94ba2888f5a988be6ab446ec5c8d1a82da
68.24   Building wheel for yarl (pyproject.toml): started
75.92   Building wheel for yarl (pyproject.toml): finished with status 'done'
75.92   Created wheel for yarl: filename=yarl-1.9.2-cp312-cp312-linux_x86_64.whl size=285603 sha256=0062ee0f595ab08d92adc3ec12e0731c68f789422a4618a1bf707f6f896ec1d4
75.92   Stored in directory: /tmp/pip-ephem-wheel-cache-aoavfkhg/wheels/84/e3/6a/7d0fa1abee8e4aa39922b5bd54689b4b5e4269b2821f482a32
75.94 Successfully built IPy maxminddb frozenlist multidict yarl
75.94 Failed to build aiohttp
75.94 ERROR: Could not build wheels for aiohttp, which is required to install pyproject.toml-based projects
76.47 
76.47 [notice] A new release of pip is available: 23.2.1 -> 23.3.1
76.47 [notice] To update, run: pip install --upgrade pip
------
Dockerfile:6
--------------------
   5 |     COPY requirements.txt ./
   6 | >>> RUN apk add --no-cache gcc musl-dev && \
   7 | >>>     pip install --no-cache-dir -r requirements.txt
   8 |     
--------------------
ERROR: failed to solve: process "/bin/sh -c apk add --no-cache gcc musl-dev &&     pip install --no-cache-dir -r requirements.txt" did not complete successfully: exit code: 1

TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'list'

[2021-03-21 18:52:51,305] ERROR in app: Exception on / [POST]
Traceback (most recent call last):
File "/home/smartd/virt/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/home/smartd/virt/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/smartd/virt/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/smartd/virt/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/home/smartd/virt/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/home/smartd/virt/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functionsrule.endpoint
File "server.py", line 145, in index
delay = (org_time - next_time).seconds
TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'list'
127.0.0.1 - - [21/Mar/2021 18:52:51] "POST / HTTP/1.1" 500 -

Seems to have a code issue.

Traceback Error

Hi , I get this error when i tried to analyze the raw header:

Here is the email Header:
https://easyupload.io/djeksg

[2023-08-23 16:34:55,424] ERROR in app: Exception on / [POST]
Traceback (most recent call last):
File "/home/maxx/Pentesting/email-header-analyzer/mha/server.py", line 65, in dateParser
r = dateutil.parser.parse(line, fuzzy=True)
File "/usr/lib/python3/dist-packages/dateutil/parser/_parser.py", line 1374, in parse
return DEFAULTPARSER.parse(timestr, **kwargs)
File "/usr/lib/python3/dist-packages/dateutil/parser/_parser.py", line 649, in parse
raise ParserError("Unknown string format: %s", timestr)
dateutil.parser._parser.ParserError: Unknown string format: from User (85-250-54-29.bb.netvision.net.il[85.250.54.29])

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/usr/lib/python3/dist-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/lib/python3/dist-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/lib/python3/dist-packages/flask/_compat.py", line 39, in reraise
raise value
File "/usr/lib/python3/dist-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/lib/python3/dist-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functionsrule.endpoint
File "/home/maxx/Pentesting/email-header-analyzer/mha/server.py", line 119, in index
next_time = dateParser(next_line[-1])
File "/home/maxx/Pentesting/email-header-analyzer/mha/server.py", line 72, in dateParser
r = dateutil.parser.parse(r[0])
File "/usr/lib/python3/dist-packages/dateutil/parser/_parser.py", line 1374, in parse
return DEFAULTPARSER.parse(timestr, **kwargs)
File "/usr/lib/python3/dist-packages/dateutil/parser/_parser.py", line 649, in parse
raise ParserError("Unknown string format: %s", timestr)
dateutil.parser._parser.ParserError: Unknown string format: from User
127.0.0.1 - - [23/Aug/2023 16:34:55] "POST / HTTP/1.1" 500 -

Docker: ImportError: cannot import name 'Iterable' from 'collections'

Hi!

The docker image exits instantly. Logs show this error message when trying to run the mha:latest image on docker version 20.10.10, build b485636

docker logs 94edf9098de3
Traceback (most recent call last):
File "/usr/src/mha/server.py", line 12, in
import pygal
File "/usr/local/lib/python3.10/site-packages/pygal/init.py", line 33, in
from pygal.graph.bar import Bar
File "/usr/local/lib/python3.10/site-packages/pygal/graph/bar.py", line 27, in
from pygal.graph.graph import Graph
File "/usr/local/lib/python3.10/site-packages/pygal/graph/graph.py", line 26, in
from pygal._compat import is_list_like, is_str, to_str
File "/usr/local/lib/python3.10/site-packages/pygal/_compat.py", line 23, in
from collections import Iterable
ImportError: cannot import name 'Iterable' from 'collections' (/usr/local/lib/python3.10/collections/init.py)

Errors out depending on the source of the headers...

We receive the following error depending on the source of the headers.

"Internal Server Error
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application."

---sample headers---
X-auditid:
a2962c47-fbdff7000001abb1-0a-5c5ca11b80de
Received:
from COPDCEXC36.sampledomain.com (copdcmhoutvip.sampledomain.com [96.114.156.147]) (using TLS with cipher AES256-SHA256 (256/256 bits)) (Client did not present a certificate) by copdcmhout01.sampledomain.com (SMTP Gateway) with SMTP id 63.58.43953.B11AC5C5; Thu, 7 Feb 2019 14:20:27 -0700 (MST)
Received:
from COPDCEX49.sampledomain.com (147.191.125.148) by COPDCEXC36.sampledomain.com (147.191.125.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1466.3; Thu, 7 Feb 2019 16:20:25 -0500
Received:
from feye-as-01p.sys.sampledomain.net (96.114.156.9) by COPDCEX49.sampledomain.com (147.191.125.148) with Microsoft SMTP Server (TLS) id 15.0.1395.4 via Frontend Transport; Thu, 7 Feb 2019 14:20:25 -0700
Received:
from localhost.localdomain (localhost [127.0.0.1]) by feye-as-01p.sys.sampledomain.net (Postfix) with SMTP id 43wWS86WCNz4PWS8 for [email protected]; Thu, 7 Feb 2019 16:20:24 -0500 (EST)
Received:
from agari-as-02p.sys.sampledomain.net (ssl01-d-ssl02-d-snatip-254.richmond.va.ndcasbn.sampledomain.net [96.115.73.254]) by feye-as-01p.sys.sampledomain.net (Postfix) with ESMTPS id 43wWS80sd8z4PWDt for [email protected]; Thu, 7 Feb 2019 16:20:24 -0500 (EST)
Received:
from fe72fab91eba (localhost [127.0.0.1]) by agari-as-02p.sys.sampledomain.net (Postfix) with ESMTP id 43wWS80qfvz4PXx1 for [email protected]; Thu, 7 Feb 2019 21:20:24 +0000 (UTC)
Received:
from copdcmhin01.sampledomain.com (ssl01-d-ssl02-d-snatip-254.richmond.va.ndcasbn.sampledomain.net [96.115.73.254]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by agari-as-02p.sys.sampledomain.net (Postfix) with ESMTPS id 43wWS66ctTz4PXwn for [email protected]; Thu, 7 Feb 2019 21:20:22 +0000 (UTC)
X-auditid:
a2962c44-a1bff7000000144d-61-5c5ca1176d6d
Received:
from ert.monitis.com (ert.monitis.com [104.200.159.178]) by copdcmhin01.sampledomain.com (SMTP Gateway) with SMTP id 33.C7.05197.711AC5C5; Thu, 7 Feb 2019 14:20:23 -0700 (MST)
Content-type:
text/plain; charset="us-ascii"
Mime-version:
1.0
Content-transfer-encoding:
7bit
X-fireeye:
Clean
Message-id:
154957442264.2124.9970859388360246654.1549574422.65@ert.monitis.com
X-params:
MTM4ODUwMzR8MTU0OTU3NDQyMi42MXwxNTQ5NTc0NDIyLjY1fDE2Mi4xNTAuNDQuNjg=
Authentication-results:
comcast.com; spf=neutral smtp.mailfrom=[email protected] smtp.helo=ert.monitis.com; dkim=none
X-brightmail-tracker:
H4sIAAAAAAAAA+NgFrrMKsWRmVeSWpSXmKPExsWSUDRnsq70wpgYg1PvpSxebXrH7MDoseHd FvYAxqgGRpuSjKLUxBKX1LTUvOJUOy4FDGCTlJqWX5TqmliUUxmUmpOaiF0ZSGVKak5mWWqR PlZj9LGak7CPKePa1kMsBe4VBzaINzBadjFyckgImEjM+7SNuYuRi0NIYBeTxO6XR6CcJiaJ /l2LmSCcq4wSM05NYgVpERI4xyjRftQEItHNJHH3dBcjhHOcUeLgyansEM4fJomOie/ZYbY8 /3sUqmo/o8S3q30sIAlmAR2JBbs/sYHYvAKCEidnPoGKy0tsfzuHGcQWEdCUuHD4NjPEIAGJ 6/OWgA1lA+r9Oms6C0RvoMT+zevA7mMRUJHoWrWHEaLeT2Lbpn4wW1ggWeLMq7VgNqNApcSL TctYQQ6SEFjJIdE68R7UpYISDzavgFrmIPFv/WOoQRISL+6sgQaAgsSic3fYIOLiEoeP7GCd wCg9C8k/s5D8MwvJPwsYmVcx8hqaGekZmhromZjomRtuYgSmnEXTdNx3MH44H3uIUYCDUYmH V3x6TIwQa2JZcWXuIUYJDmYlEd4Vc4FCvCmJlVWpRfnxRaU5qcWHGH2A3p3ILCWanA9Mh3kl 8YamJuYGZhbmhqbmJkY4hJXEeT9ERscICaQnlqRmp6YWpBbBjGPi4JRqYFwmlxOyd9GVPUvv 6gtM5CwX2XpRLkNp+2JlmWojf6MijcYTCSfkYq8XrN1xNXTn4StOWXUaATyVL3bzt8RVn7rW czchMj8jk7txbp/Zr8gpApNEWy5uqtbs15cP+yo8o5DbfHU+x+uibbOCHRku+x72FNzYWu+z tuBQ0ulTj0V3pKQ/2pXTrsRSnJFoqMVcVJwIAGHjCx5mAwAA
X-brightmail-tracker:
H4sIAAAAAAAAA+NgFprLJsWRWlGSWpSXmKPExsWScWL+Jl3xhTExBi+6JS0un3zE4sDocb2z hTmAMaqB0SYlNSezLLVI384mqbIgsbhYNzlNoSA/JzO5UjczxVbJ0MTSxMzE1MjMxNLcUgmo ilT1JRlFqYklLqlpqXnFqXZcCmggYS5LxpJpS1kKPCsObBBvYLTsYuTkkBAwkXj+9ygjiC0k sJdRYmkbN4jNLKAjsWD3JzYQm1dAUOLkzCcsEHF5ie1v5zCD2CICmhIXDt8Gs9mA6r/Oms4C UR8osX/zOlYQm0VAVWJCbwsbxC4/iW2b+sF2CQtESFzc8pcdxGYUqJR4sWkZ6wRGnllIVs9C snoWktULGJlXMfIamhnpGZoa6JmY6JlZbGIEhv6iaTouOxg/XIk9xCjAwajEw5sxPSZGiDWx rLgy9xCjBAezkgjvirlAId6UxMqq1KL8+KLSnNTiQ4zJQFdOZJYSTc7PK0nNK4k3NDUysjQ1 NDIyMzA2QBI2sTQzMrOwtDQ2NLZEUW1pbGJiYGFpZG6qJM6rFxUdIySQnliSmp2aWpBaBLOF iYMdRHCeYpzOKCXO+34+0CUCxQWJuRmlQIOgyqTEeG80AyX4kSSSSnOypWR49bdHxgiJIonn pZYX56SWAJlSCryH5wJtlUSSLS4tLshMzswvLY4vLcoB6j88PRpVf3FpUm5mcXFmfh4s7V5i 9OFg4mAR4imuLI5PzMnJL4/PLAC6Bc5LzU3MzBFiycvPS4WQUsK8jAwMDEI8QI/mZpZAPAEz TqqBMWTHVjZJwzfBEvOa5I3dI47v+DG7KWrHDcFChqUCM7Y+eSfL9CQk0Dt/7QFhQ5OjNz64 Hf70onCy0bvzxbfDO2+sKBDfH+e1eckENTZx8fV71ynILUt0jleru3vGvvbIJXahjtMvc7Jn tG4oTE48M5FN+lRcR/5XBpnaS61WDVpBFoWZF7zXKLEUZyQaajEXFScCANNPFsmwAwAA
X-auditstamp:
Yes
X-agari-msginfo:
2dcc0248-2b1e-11e9-aa60-0242ac140003;1549574422
X-agari-trust-score:
7.7
Return-path:
[email protected]
X-cfilter-loop:
Forward
X-bmiincident:
10000015,1547068715742,0
X-bmimatch:
10000015,1547068715742,header,To,[email protected]
X-bmi-source:
internal
To:
Recipient [email protected]
From:
Email Round-Trip [email protected]
Date:
Thursday, Feb 07, 2019 04:20:22 PM EST
Subject:
[EXTERNAL] ERT test~MTM4ODUwMzR8MTU0OTU3NDQyMi42MXwxNTQ5NTc0NDIyLjY1fDE2Mi4xNTAuNDQuNjg=

Issue with time servers being out of alignment

There's a minor bug in the math if the timestamps for the received headers are out of order (likely the mailservers have different times set)

image

It shows a 23 hour delay when it was a negative instead

Re:Aktivně mobil Sit

MirrorFly/MirrorFly-Android-Sample-V2#33
Mám na tel.cisle_TTY#774194639.vodafone.cz
Pro mou pritelky jako dárek k Narozeninám
Registrací:Rč/010819/0101
Pro systém Android přenositelné tel.cislo mám v jednom a když ho dám do druhého Mobilu tak jenom aktivně přes Mobil operátora jako u Windows

Error when hit python server.py -d

E:\email-header-analyzer-master\email-header-analyzer-master\MHA>python server.py -d
Traceback (most recent call last):
File "server.py", line 5, in
from email.Parser import HeaderParser
ModuleNotFoundError: No module named 'email.Parser'

header analysis is not working for some of the mail files

below is the raw mails :

From: "[email protected]" [email protected]
To: Santrupt Misra [email protected]
Subject: =?utf-8?B?S2lzc2luZyBDdXBpZDsgQXpyYWVsIHRvIExhcyBWZWdhczogdcedbGzJkMmf?=
=?utf-8?B?IHPJkMmlIMmv4bSJyo7JkGxsyZDJpXNvybnHncqO?=
Thread-Topic: =?utf-8?B?S2lzc2luZyBDdXBpZDsgQXpyYWVsIHRvIExhcyBWZWdhczogdcedbGzJkMmf?=
=?utf-8?B?IHPJkMmlIMmv4bSJyo7JkGxsyZDJpXNvybnHncqO?=
Thread-Index: AQHWP15+DIlPv6+j5kq6bQwzzhJ7ww==
Date: Wed, 10 Jun 2020 18:09:45 +0000
Message-ID: b5a994850262425830274e0746f47046@naclufjpwscaaldoktzlknl6wtjrwpwaoxcmulzteygvmadhymkfscad.onion.pet
List-Help: http://naclufjpwscaaldoktzlknl6wtjrwpwaoxcmulzteygvmadhymkfscad.onion.pet/lists/?p=preferences&uid=58448d652bf5b210bd75295f697e1e0a
List-Subscribe: http://naclufjpwscaaldoktzlknl6wtjrwpwaoxcmulzteygvmadhymkfscad.onion.pet/lists/?p=subscribe
List-Unsubscribe: http://naclufjpwscaaldoktzlknl6wtjrwpwaoxcmulzteygvmadhymkfscad.onion.pet/lists/?p=unsubscribe&uid=58448d652bf5b210bd75295f697e1e0a&jo=1
Content-Language: en-US
X-MS-Exchange-Organization-AuthMechanism: 10
X-MS-Exchange-Organization-AuthSource: BMCSLBKC-HUB05.abgplanet.abg.com
X-MS-Has-Attach: yes
X-Auto-Response-Suppress: All
X-MS-Exchange-Organization-Network-Message-Id: 3eec681a-43e8-4986-8db3-08d80d759f71
X-MS-TNEF-Correlator:
X-MS-Exchange-Organization-RecordReviewCfmType: 0
received-spf: None (protection.outlook.com:
naclufjpwscaaldoktzlknl6wtjrwpwaoxcmulzteygvmadhymkfscad.onion.pet does not
designate permitted sender hosts)
x-ms-publictraffictype: Email
x-ms-exchange-organization-originalclientipaddress: 10.1.0.115
x-ms-exchange-organization-originalserveripaddress: 10.152.200.130
x-mailer: PHPMailer 5.2.14 (https://github.com/PHPMailer/PHPMailer)
x-ms-exchange-organization-submissionquotaskipped: False
x-ms-traffictypediagnostic: MA1PR0101MB1733:
x-ms-exchange-crosstenant-originalarrivaltime: 10 Jun 2020 19:36:50.9219 (UTC)
x-ms-exchange-crosstenant-fromentityheader: HybridOnPrem
x-ms-exchange-crosstenant-id: f87a5f5e-f97e-4aec-bab8-6e4187ef4f1c
x-ms-exchange-crosstenant-network-message-id: 3eec681a-43e8-4986-8db3-08d80d759f71
x-ms-exchange-transport-crosstenantheadersstamped: MA1PR0101MB1733
x-ms-exchange-transport-endtoendlatency: 00:00:02.4864655
X-Microsoft-Antispam-Mailbox-Delivery: ucf:0;jmr:0;auth:0;dest:I;ENG:(750128)(520011016)(706158)(944506458)(944626604);
X-Microsoft-Antispam-Message-Info: yF51AYPK+mFS+SbvCVGGjpAtb1/CtPHqbJ0sA5ajIVMRFdUCLBQIA9xto9tsySu0qceb7z0uCCQUKyRRqR84tVz/jSzcfEPneWjqBidFh1oyzdDDCv1Qpr21bkpK+lcWR13gz6vP3wLhcA5lTh302A91bWxtqMeIZvwm/orUavL+4+IIhZOUgO/7TEq0HI6adCRUPtwDEH/lEF+W0p7YlVVLDClw6cmJY2p9y825aVhvFqdi0AUnaa3dF6k4XaqMFXFvhTMi0gmpTBOs674S6GO6vDucWTdhkBjJGSxWZSoEGkZL13041CRgpNWQ5P1SeB1lu3d8in5mY2hAZZ9tCkDjsb/+HkAczvV99Xx1A/Vu6taXynfXsNuS1n51aKY0
Content-Type: multipart/related;
boundary="004_b5a994850262425830274e0746f47046naclufjpwscaaldoktzlknl";
type="multipart/alternative"
MIME-Version: 1.0

--004_b5a994850262425830274e0746f47046naclufjpwscaaldoktzlknl
X-Microsoft-Antispam-Mailbox-Delivery: ucf:0;jmr:0;auth:0;dest:I;ENG:(750128)(520011016)(706158)(944506458)(944626604);
X-Microsoft-Antispam-Message-Info: yF51AYPK+mFS+SbvCVGGjpAtb1/CtPHqbJ0sA5ajIVMRFdUCLBQIA9xto9tsySu0qceb7z0uCCQUKyRRqR84tVz/jSzcfEPneWjqBidFh1oyzdDDCv1Qpr21bkpK+lcWR13gz6vP3wLhcA5lTh302A91bWxtqMeIZvwm/orUavL+4+IIhZOUgO/7TEq0HI6adCRUPtwDEH/lEF+W0p7YlVVLDClw6cmJY2p9y825aVhvFqdi0AUnaa3dF6k4XaqMFXFvhTMi0gmpTBOs674S6GO6vDucWTdhkBjJGSxWZSoEGkZL13041CRgpNWQ5P1SeB1lu3d8in5mY2hAZZ9tCkDjsb/+HkAczvV99Xx1A/Vu6taXynfXsNuS1n51aKY0
Content-Type: multipart/alternative;
boundary="000_b5a994850262425830274e0746f47046naclufjpwscaaldoktzlknl"

--000_b5a994850262425830274e0746f47046naclufjpwscaaldoktzlknl
X-Microsoft-Antispam-Mailbox-Delivery: ucf:0;jmr:0;auth:0;dest:I;ENG:(750128)(520011016)(706158)(944506458)(944626604);
X-Microsoft-Antispam-Message-Info: yF51AYPK+mFS+SbvCVGGjpAtb1/CtPHqbJ0sA5ajIVMRFdUCLBQIA9xto9tsySu0qceb7z0uCCQUKyRRqR84tVz/jSzcfEPneWjqBidFh1oyzdDDCv1Qpr21bkpK+lcWR13gz6vP3wLhcA5lTh302A91bWxtqMeIZvwm/orUavL+4+IIhZOUgO/7TEq0HI6adCRUPtwDEH/lEF+W0p7YlVVLDClw6cmJY2p9y825aVhvFqdi0AUnaa3dF6k4XaqMFXFvhTMi0gmpTBOs674S6GO6vDucWTdhkBjJGSxWZSoEGkZL13041CRgpNWQ5P1SeB1lu3d8in5mY2hAZZ9tCkDjsb/+HkAczvV99Xx1A/Vu6taXynfXsNuS1n51aKY0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

Q0FVVElPTjogVGhpcyBlbWFpbCBvcmlnaW5hdGVkIGZyb20gb3V0c2lkZSBvZiB0aGUgb3JnYW5p
emF0aW9uIERvIG5vdCBjbGljayBsaW5rcyBvciBvcGVuIGF0dGFjaG1lbnRzIHVubGVzcyB5b3Ug
cmVjb2duaXplIHRoZSBzZW5kZXIgYW5kIGtub3cgdGhlIGNvbnRlbnQgaXMgc2FmZQ0KDQpJIGhh
dmVuJ3QgaGVhcmQgZnJvbSB5b3UgaW4gYXdoaWxlLS1JIG1lYW47IG5vdGljZWQgdGhlIHNhbWUg
a2luZCBvZiBkaXNjdXNzaW9uLiAgIFRoZXJlIGFyZSBiaWcgbmV3IHRoaW5ncyBoYXBwZW5pbmct
LXdlJ3JlICJtb3Zpbmcgb24iIC4uLiBhbmQgd2lubmluZyBvciBsb3NpbmcuICBUb2RheSBpdCBk
b2Vzbid0IGxvb2sgbGlrZSAid2lubmluZyIgdG8gbWUtLUkgdGhpbmsgd2UndmUgbG9zdCBldmVy
eXRoaW5nIHdlIGhvbGQgZGVhci4gIElmIG5vdC0tSSB0aGluayB0aGF0J3MgbmVhci4gIFR1cm4g
YXJvdW5kLCB0aGlzIGlzIC4uLiAidGhlIGhha2xhLjxodHRwOi8vbmFjbHVmanB3c2NhYWxkb2t0
emxrbmw2d3Rqcndwd2FveGNtdWx6dGV5Z3ZtYWRoeW1rZnNjYWQub25pb24ucGV0L2xpc3RzL2x0
LnBocD9pZD1mVWdHQVE1VVZrOVFVMUlkVUYwRlVsY0I+Ig0KDQpCcmllZmx5LCBmb3IgdGhpcyAi
ZmxhZyB0aGluZyIgYmVsb3ctLUknbSBmb3IgdGhlIGZpcnN0IHRpbWUgbm90aWNpbmcgdGhlIHBy
ZXNjaWVuY2UgaW4gdGhlIFNPTDsgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiAxMyBjb2xvbmllcyBh
bmQgdGhlIEV1cm9wZWFuIFVuaW9uLS1JJ20gZm9yIHRoZSBmaXJzdCB0aW1lIG5vdGljaW5nIGl0
J3MgcHJvYmFibHkgc29tZXRoaW5nIHRvIGRvIHdpdGggSGllcnlzb2x5bWEtLWFuZCB0aGlzIG15
dGggb2YgImJsdWUgbGFnb29ucyIgYW5kIC4uLiBzb29uLg0KDQogIF9fX19fDQoNCg0KPGh0dHA6
Ly9uYWNsdWZqcHdzY2FhbGRva3R6bGtubDZ3dGpyd3B3YW94Y211bHp0ZXlndm1hZGh5bWtmc2Nh
ZC5vbmlvbi5wZXQvbGlzdHMvbHQucGhwP2lkPWZVZ0dBUTVVVjA5UVUxSWRVRjBGVWxjQj4NCjxo
dHRwOi8vbmFjbHVmanB3c2NhYWxkb2t0emxrbmw2d3Rqcndwd2FveGNtdWx6dGV5Z3ZtYWRoeW1r
ZnNjYWQub25pb24ucGV0L2xpc3RzL2x0LnBocD9pZD1mVWdHQVE1VVVFOVFVMUlkVUYwRlVsY0I+
DQppdCdzIHBhYy1tYW4uIGhvLg0KIDxodHRwOi8vYXJjaGl2ZS5pcy9ET0NsUi85OWJkYmE5MTI3
NjQ0MjM3ZDMzZDM1ZjAwYzFkZGQwMTIxZGQ5MGU3LnBuZz4NCmFuZCBpdCBoYXMsIGl0IGhhcyBi
ZWNvbWUgbmVjZXNzYXJ5IHRvIGh1bWFuaXplICJ0aGlzIHBsYWNlIGZpbGxlZCB3aXRoIGluaHVt
YW5pdHkuIg0Kam9pbiBvciAuLi4gImlzIHRoZXJlIGFueSBvdGhlciBraW5kPyINCjxodHRwOi8v
bmFjbHVmanB3c2NhYWxkb2t0emxrbmw2d3Rqcndwd2FveGNtdWx6dGV5Z3ZtYWRoeW1rZnNjYWQu
b25pb24ucGV0L2xpc3RzL2x0LnBocD9pZD1mVWdHQVE1VVVVOVFVMUlkVUYwRlVsY0I+DQpncmF2
ZSBkYW5nZXIuDQo8aHR0cDovL25hY2x1Zmpwd3NjYWFsZG9rdHpsa25sNnd0anJ3cHdhb3hjbXVs
enRleWd2bWFkaHlta2ZzY2FkLm9uaW9uLnBldC9saXN0cy9sdC5waHA/aWQ9ZlVnR0FRNVVVazlR
VTFJZFVGMEZVbGNCPg0KaW4gb3JkZXIgdG8gImZvcm0gYSByZXB1YmxpYzxodHRwOi8vbmFjbHVm
anB3c2NhYWxkb2t0emxrbmw2d3Rqcndwd2FveGNtdWx6dGV5Z3ZtYWRoeW1rZnNjYWQub25pb24u
cGV0L2xpc3RzL2x0LnBocD9pZD1mVWdHQVE1VVVrOVFVMUlkVUYwRlVsY0I+Ig0KPGh0dHA6Ly9u
YWNsdWZqcHdzY2FhbGRva3R6bGtubDZ3dGpyd3B3YW94Y211bHp0ZXlndm1hZGh5bWtmc2NhZC5v
bmlvbi5wZXQvbGlzdHMvbHQucGhwP2lkPWZVZ0dBUTVVVTA5UVUxSWRVRjBGVWxjQj4NCm9yIHNl
ZSB0aGUgZmluYWxlPGh0dHA6Ly9uYWNsdWZqcHdzY2FhbGRva3R6bGtubDZ3dGpyd3B3YW94Y211
bHp0ZXlndm1hZGh5bWtmc2NhZC5vbmlvbi5wZXQvbGlzdHMvbHQucGhwP2lkPWZVZ0dBUTVVVTA5
UVUxSWRVRjBGVWxjQj4gb2YgdGhlIGV2aWwgdHJlZS4NCjxodHRwOi8vbmFjbHVmanB3c2NhYWxk
b2t0emxrbmw2d3Rqcndwd2FveGNtdWx6dGV5Z3ZtYWRoeW1rZnNjYWQub25pb24ucGV0L2xpc3Rz
L2x0LnBocD9pZD1mVWdHQVE1VVhFOVFVMUlkVUYwRlVsY0I+DQphbGJhdHJvc3NreWZhbGwuDQoN
CnN1YnNjcmlwdGlvbiBvcHRpb25zPGh0dHA6Ly9uYWNsdWZqcHdzY2FhbGRva3R6bGtubDZ3dGpy
d3B3YW94Y211bHp0ZXlndm1hZGh5bWtmc2NhZC5vbmlvbi5wZXQvbGlzdHMvbHQucGhwP2lkPWZV
Z0dBUTVVWFU5UVUxSWRVRjBGVWxjQj4gY29udGFjdCBhZGFtPGh0dHA6Ly9uYWNsdWZqcHdzY2Fh
bGRva3R6bGtubDZ3dGpyd3B3YW94Y211bHp0ZXlndm1hZGh5bWtmc2NhZC5vbmlvbi5wZXQvbGlz
dHMvbHQucGhwP2lkPWZVZ0ZBZ1pVVVU5UVUxSWRVRjBGVWxjQj4NCg0KPGh0dHA6Ly9uYWNsdWZq
cHdzY2FhbGRva3R6bGtubDZ3dGpyd3B3YW94Y211bHp0ZXlndm1hZGh5bWtmc2NhZC5vbmlvbi5w
ZXQvbGlzdHMvbHQucGhwP2lkPWZVZ0hCMHBYVWdBZlYxaFhWbFlIPg0KDQogPGh0dHA6Ly9uYWNs
dWZqcHdzY2FhbGRva3R6bGtubDZ3dGpyd3B3YW94Y211bHp0ZXlndm1hZGh5bWtmc2NhZC5vbmlv
bi5wZXQvbGlzdHMvdXQucGhwP3U9NTg0NDhkNjUyYmY1YjIxMGJkNzUyOTVmNjk3ZTFlMGEmbT0z
NjM+DQo=

--000_b5a994850262425830274e0746f47046naclufjpwscaaldoktzlknl
X-Microsoft-Antispam-Mailbox-Delivery: ucf:0;jmr:0;auth:0;dest:I;ENG:(750128)(520011016)(706158)(944506458)(944626604);
X-Microsoft-Antispam-Message-Info: yF51AYPK+mFS+SbvCVGGjpAtb1/CtPHqbJ0sA5ajIVMRFdUCLBQIA9xto9tsySu0qceb7z0uCCQUKyRRqR84tVz/jSzcfEPneWjqBidFh1oyzdDDCv1Qpr21bkpK+lcWR13gz6vP3wLhcA5lTh302A91bWxtqMeIZvwm/orUavL+4+IIhZOUgO/7TEq0HI6adCRUPtwDEH/lEF+W0p7YlVVLDClw6cmJY2p9y825aVhvFqdi0AUnaa3dF6k4XaqMFXFvhTMi0gmpTBOs674S6GO6vDucWTdhkBjJGSxWZSoEGkZL13041CRgpNWQ5P1SeB1lu3d8in5mY2hAZZ9tCkDjsb/+HkAczvV99Xx1A/Vu6taXynfXsNuS1n51aKY0
Content-Type: text/html; charset="utf-8"
Content-ID: [email protected]
Content-Transfer-Encoding: base64

PGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0i
dGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjx0aXRsZT48L3RpdGxlPg0KPC9oZWFkPg0KPGJv
ZHk+DQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNGRkVCOUM7IHdpZHRoOjEwMCU7IGJv
cmRlci1zdHlsZTogc29saWQ7IGJvcmRlci1jb2xvcjojOUM2NTAwOyBib3JkZXItd2lkdGg6MXB0
OyBwYWRkaW5nOjJwdDsgZm9udC1zaXplOjlwdDsgbGluZS1oZWlnaHQ6MTJwdDsgZm9udC1mYW1p
bHk6J0NhbGlicmknOyBjb2xvcjpCbGFjazsgdGV4dC1hbGlnbjogbGVmdDsiPg0KPHNwYW4gc3R5
bGU9ImNvbG9yOiM5QzY1MDA7IGZvbnQtd2VpZ2h0OmJvbGQ7Ij5DQVVUSU9OOjwvc3Bhbj4gVGhp
cyBlbWFpbCBvcmlnaW5hdGVkIGZyb20gb3V0c2lkZSBvZiB0aGUgb3JnYW5pemF0aW9uIERvIG5v
dCBjbGljayBsaW5rcyBvciBvcGVuIGF0dGFjaG1lbnRzIHVubGVzcyB5b3UgcmVjb2duaXplIHRo
ZSBzZW5kZXIgYW5kIGtub3cgdGhlIGNvbnRlbnQgaXMgc2FmZTwvZGl2Pg0KPGJyPg0KPGRpdj4N
CjxjZW50ZXIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyB0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+SSBo
YXZlbid0IGhlYXJkIGZyb20geW91IGluIGF3aGlsZS0tSSBtZWFuOyBub3RpY2VkIHRoZSBzYW1l
IGtpbmQgb2YgZGlzY3Vzc2lvbi4mbmJzcDsgJm5ic3A7VGhlcmUgYXJlIGJpZyBuZXcgdGhpbmdz
IGhhcHBlbmluZy0td2UncmUgJnF1b3Q7bW92aW5nIG9uJnF1b3Q7IC4uLiBhbmQgd2lubmluZyBv
ciBsb3NpbmcuJm5ic3A7IFRvZGF5IGl0IGRvZXNuJ3QgbG9vayBsaWtlICZxdW90O3dpbm5pbmcm
cXVvdDsgdG8NCiBtZS0tSSB0aGluayB3ZSd2ZSBsb3N0IGV2ZXJ5dGhpbmcgd2UgaG9sZCBkZWFy
LiZuYnNwOyBJZiBub3QtLUkgdGhpbmsgdGhhdCdzIG5lYXIuJm5ic3A7IFR1cm4gYXJvdW5kLCB0
aGlzIGlzIC4uLiAmcXVvdDs8YSBocmVmPSJodHRwOi8vbmFjbHVmanB3c2NhYWxkb2t0emxrbmw2
d3Rqcndwd2FveGNtdWx6dGV5Z3ZtYWRoeW1rZnNjYWQub25pb24ucGV0L2xpc3RzL2x0LnBocD9p
ZD1mVWdHQVE1VVZrOVFVMUlkVUYwRlVsY0IiPnRoZQ0KPGVtPjxzdHJvbmc+aGFrbGEuPC9zdHJv
bmc+PC9lbT48L2E+JnF1b3Q7PC9jZW50ZXI+DQo8Y2VudGVyIHN0eWxlPSJkaXNwbGF5OiBibG9j
azsgdGV4dC1hbGlnbjoganVzdGlmeTsiPiZuYnNwOzwvY2VudGVyPg0KPGNlbnRlciBzdHlsZT0i
ZGlzcGxheTogYmxvY2s7IHRleHQtYWxpZ246IGp1c3RpZnk7Ij5CcmllZmx5LCBmb3IgdGhpcyAm
cXVvdDtmbGFnIHRoaW5nJnF1b3Q7IGJlbG93LS1JJ20gZm9yIHRoZSBmaXJzdCB0aW1lIG5vdGlj
aW5nIHRoZSBwcmVzY2llbmNlIGluIHRoZSBTT0w7IHRoZSBjb25uZWN0aW9uIGJldHdlZW4gMTMg
Y29sb25pZXMgYW5kIHRoZSBFdXJvcGVhbiBVbmlvbi0tSSdtIGZvciB0aGUgZmlyc3QgdGltZSBu
b3RpY2luZyBpdCdzIHByb2JhYmx5IHNvbWV0aGluZw0KIHRvIGRvIHdpdGggSGllcnlzb2x5bWEt
LWFuZCB0aGlzIG15dGggb2YgJnF1b3Q7Ymx1ZSBsYWdvb25zJnF1b3Q7IGFuZCAuLi4mbmJzcDs8
c3Ryb25nPjxlbT5zb29uLjwvZW0+PC9zdHJvbmc+PC9jZW50ZXI+DQo8Y2VudGVyIHN0eWxlPSJk
aXNwbGF5OiBibG9jazsgdGV4dC1hbGlnbjoganVzdGlmeTsiPiZuYnNwOzwvY2VudGVyPg0KPGNl
bnRlciBzdHlsZT0iZGlzcGxheTogYmxvY2s7IHRleHQtYWxpZ246IGp1c3RpZnk7Ij4NCjxocj4N
CjwvY2VudGVyPg0KPGNlbnRlciBzdHlsZT0iZGlzcGxheTogYmxvY2s7IHRleHQtYWxpZ246IGp1
c3RpZnk7Ij4mbmJzcDs8L2NlbnRlcj4NCjxjZW50ZXIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7dGV4
dC1hbGlnbjotd2Via2l0LWNlbnRlcjsiPjxhIGhyZWY9Imh0dHA6Ly9uYWNsdWZqcHdzY2FhbGRv
a3R6bGtubDZ3dGpyd3B3YW94Y211bHp0ZXlndm1hZGh5bWtmc2NhZC5vbmlvbi5wZXQvbGlzdHMv
bHQucGhwP2lkPWZVZ0dBUTVVVjA5UVUxSWRVRjBGVWxjQiIgc3R5bGU9ImNvbG9yOnJnYigxMiwg
MTQ3LCAyMjgpO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLCAwLCAwLCAwKTtjdXJzb3I6cG9pbnRl
cjt0ZXh0LWRlY29yYXRpb24tY29sb3I6cmdiKDEyLCAxNDcsIDIyOCk7dGV4dC1kZWNvcmF0aW9u
LWxpbmU6dW5kZXJsaW5lO3RleHQtZGVjb3JhdGlvbi1zdHlsZTpzb2xpZDsiIHRhcmdldD0iX2Js
YW5rIj48aW1nIHNyYz0iaHR0cDovL2FyY2hpdmUuaXMvRE9DbFIvNmNjNzIxODMzNjNkOWMxZTAy
NzUxN2EyMDVmMzBlMTE4NDAzOWZmMi5wbmciIHN0eWxlPSJtaW4taGVpZ2h0OjU1NHB4O21pbi13
aWR0aDo0NDNweDtib3JkZXItYm90dG9tLXN0eWxlOm5vbmU7Ym9yZGVyLWxlZnQtc3R5bGU6bm9u
ZTtib3JkZXItcmlnaHQtc3R5bGU6bm9uZTtib3JkZXItdG9wLXN0eWxlOm5vbmU7bWF4LXdpZHRo
OjEwMCU7Ij48L2E+PC9jZW50ZXI+DQo8bGluayByZWw9InN0eWxlc2hlZXQiPg0KPGRpdiBzdHls
ZT0iZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjE4MHB4O21hcmdpbi1sZWZ0OmF1dG87bWFy
Z2luLXJpZ2h0OmF1dG87bWF4LXdpZHRoOjc1MHB4O3BhZGRpbmctbGVmdDozMHB4O3BhZGRpbmct
cmlnaHQ6MzBweDsiPg0KPGNlbnRlciBzdHlsZT0iZGlzcGxheTpibG9jazt0ZXh0LWFsaWduOi13
ZWJraXQtY2VudGVyOyI+DQo8ZGl2IHN0eWxlPSJkaXNwbGF5OmJsb2NrO21hcmdpbi1ibG9jay1l
bmQ6MTkuMnB4O21hcmdpbi1ibG9jay1zdGFydDoxOS4ycHg7bWFyZ2luLWJvdHRvbToxOS4ycHg7
bWFyZ2luLWlubGluZS1lbmQ6MHB4O21hcmdpbi1pbmxpbmUtc3RhcnQ6MHB4O21hcmdpbi1sZWZ0
OjBweDttYXJnaW4tcmlnaHQ6MHB4O21hcmdpbi10b3A6MTkuMnB4OyI+DQo8YSBocmVmPSJodHRw
Oi8vbmFjbHVmanB3c2NhYWxkb2t0emxrbmw2d3Rqcndwd2FveGNtdWx6dGV5Z3ZtYWRoeW1rZnNj
YWQub25pb24ucGV0L2xpc3RzL2x0LnBocD9pZD1mVWdHQVE1VVVFOVFVMUlkVUYwRlVsY0IiIHN0
eWxlPSJjb2xvcjpyZ2IoMTIsIDE0NywgMjI4KTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwgMCwg
MCwgMCk7Y3Vyc29yOnBvaW50ZXI7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOnJnYigxMiwgMTQ3LCAy
MjgpO3RleHQtZGVjb3JhdGlvbi1saW5lOnVuZGVybGluZTt0ZXh0LWRlY29yYXRpb24tc3R5bGU6
c29saWQ7IiB0YXJnZXQ9Il9ibGFuayI+PGltZyBzcmM9Imh0dHA6Ly9hcmNoaXZlLmlzL0RPQ2xS
L2E3MzYzNjBiY2M3OTQyOTJiZjJiNTVlZTE4YWQxZDJkMDlkYTQzOWIucG5nIiBzdHlsZT0ibWlu
LWhlaWdodDo1MThweDttaW4td2lkdGg6NDgxcHg7Ym9yZGVyLWJvdHRvbS1zdHlsZTpub25lO2Jv
cmRlci1sZWZ0LXN0eWxlOm5vbmU7Ym9yZGVyLXJpZ2h0LXN0eWxlOm5vbmU7Ym9yZGVyLXRvcC1z
dHlsZTpub25lO21heC13aWR0aDoxMDAlOyI+PC9hPjwvZGl2Pg0KPGRpdiBzdHlsZT0iZGlzcGxh
eTpibG9jazttYXJnaW4tYmxvY2stZW5kOjE5LjJweDttYXJnaW4tYmxvY2stc3RhcnQ6MTkuMnB4
O21hcmdpbi1ib3R0b206MTkuMnB4O21hcmdpbi1pbmxpbmUtZW5kOjBweDttYXJnaW4taW5saW5l
LXN0YXJ0OjBweDttYXJnaW4tbGVmdDowcHg7bWFyZ2luLXJpZ2h0OjBweDttYXJnaW4tdG9wOjE5
LjJweDsiPg0KPHN0cm9uZyBzdHlsZT0iZm9udC13ZWlnaHQ6NzAwOyI+PGVtIHN0eWxlPSJmb250
LXN0eWxlOml0YWxpYzsiPml0J3MgcGFjLW1hbi4gaG8uPC9lbT48L3N0cm9uZz48L2Rpdj4NCjxk
aXYgc3R5bGU9ImRpc3BsYXk6YmxvY2s7bWFyZ2luLWJsb2NrLWVuZDoxOS4ycHg7bWFyZ2luLWJs
b2NrLXN0YXJ0OjE5LjJweDttYXJnaW4tYm90dG9tOjE5LjJweDttYXJnaW4taW5saW5lLWVuZDow
cHg7bWFyZ2luLWlubGluZS1zdGFydDowcHg7bWFyZ2luLWxlZnQ6MHB4O21hcmdpbi1yaWdodDow
cHg7bWFyZ2luLXRvcDoxOS4ycHg7Ij4NCjxpbWcgc3JjPSJodHRwOi8vYXJjaGl2ZS5pcy9ET0Ns
Ui85OWJkYmE5MTI3NjQ0MjM3ZDMzZDM1ZjAwYzFkZGQwMTIxZGQ5MGU3LnBuZyIgc3R5bGU9Im1p
bi1oZWlnaHQ6MjkycHg7bWluLXdpZHRoOjUwMHB4O2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVh
dDtjb2xvcjpyZ2IoNjYsIDY2LCA2Nik7Zm9udC1mYW1pbHk6Um9ib3RvLCBzYW5zLXNlcmlmO2Zv
bnQtc2l6ZToxNnB4O2JhY2tncm91bmQtY29sb3I6cmdiKDI1MCwgMjUwLCAyNTApO2JvcmRlci1i
b3R0b20tc3R5bGU6bm9uZTtib3JkZXItbGVmdC1zdHlsZTpub25lO2JvcmRlci1yaWdodC1zdHls
ZTpub25lO2JvcmRlci10b3Atc3R5bGU6bm9uZTtib3gtc2l6aW5nOmNvbnRlbnQtYm94O21hcmdp
bi1ib3R0b206MHB4O21hcmdpbi1sZWZ0OjBweDttYXJnaW4tcmlnaHQ6MHB4O21hcmdpbi10b3A6
MHB4O21heC13aWR0aDoxMDAlO3BhZGRpbmctYm90dG9tOjBweDtwYWRkaW5nLWxlZnQ6MHB4O3Bh
ZGRpbmctcmlnaHQ6MHB4O3BhZGRpbmctdG9wOjBweDt0ZXh0LWFsaWduOi13ZWJraXQtY2VudGVy
O3dpZHRoOjUwMHB4OyIgd2lkdGg9IjUwMCI+PC9kaXY+DQo8ZGl2IHN0eWxlPSJkaXNwbGF5OmJs
b2NrO21hcmdpbi1ibG9jay1lbmQ6MTkuMnB4O21hcmdpbi1ibG9jay1zdGFydDoxOS4ycHg7bWFy
Z2luLWJvdHRvbToxOS4ycHg7bWFyZ2luLWlubGluZS1lbmQ6MHB4O21hcmdpbi1pbmxpbmUtc3Rh
cnQ6MHB4O21hcmdpbi1sZWZ0OjBweDttYXJnaW4tcmlnaHQ6MHB4O21hcmdpbi10b3A6MTkuMnB4
OyI+DQphbmQgPGVtIHN0eWxlPSJmb250LXN0eWxlOml0YWxpYzsiPml0IGhhczwvZW0+LCBpdCBo
YXMgYmVjb21lIG5lY2Vzc2FyeSB0byA8c3Ryb25nIHN0eWxlPSJmb250LXdlaWdodDo3MDA7Ij4N
Cmh1bWFuaXplPC9zdHJvbmc+ICZxdW90O3RoaXMgcGxhY2UgZmlsbGVkIHdpdGggaW5odW1hbml0
eS4mcXVvdDs8L2Rpdj4NCjxkaXYgc3R5bGU9ImRpc3BsYXk6YmxvY2s7bWFyZ2luLWJsb2NrLWVu
ZDoxOS4ycHg7bWFyZ2luLWJsb2NrLXN0YXJ0OjE5LjJweDttYXJnaW4tYm90dG9tOjE5LjJweDtt
YXJnaW4taW5saW5lLWVuZDowcHg7bWFyZ2luLWlubGluZS1zdGFydDowcHg7bWFyZ2luLWxlZnQ6
MHB4O21hcmdpbi1yaWdodDowcHg7bWFyZ2luLXRvcDoxOS4ycHg7Ij4NCmpvaW4gb3IgLi4uICZx
dW90OzxlbSBzdHlsZT0iZm9udC1zdHlsZTppdGFsaWM7Ij5pcyB0aGVyZSBhbnkgb3RoZXIga2lu
ZD88L2VtPiZxdW90OzwvZGl2Pg0KPGRpdiBzdHlsZT0iZGlzcGxheTpibG9jazttYXJnaW4tYmxv
Y2stZW5kOjE5LjJweDttYXJnaW4tYmxvY2stc3RhcnQ6MTkuMnB4O21hcmdpbi1ib3R0b206MTku
MnB4O21hcmdpbi1pbmxpbmUtZW5kOjBweDttYXJnaW4taW5saW5lLXN0YXJ0OjBweDttYXJnaW4t
bGVmdDowcHg7bWFyZ2luLXJpZ2h0OjBweDttYXJnaW4tdG9wOjE5LjJweDsiPg0KPGEgaHJlZj0i
aHR0cDovL25hY2x1Zmpwd3NjYWFsZG9rdHpsa25sNnd0anJ3cHdhb3hjbXVsenRleWd2bWFkaHlt
a2ZzY2FkLm9uaW9uLnBldC9saXN0cy9sdC5waHA/aWQ9ZlVnR0FRNVVVVTlRVTFJZFVGMEZVbGNC
IiBzdHlsZT0iY29sb3I6cmdiKDEyLCAxNDcsIDIyOCk7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAs
IDAsIDAsIDApO2N1cnNvcjpwb2ludGVyO3RleHQtZGVjb3JhdGlvbi1jb2xvcjpyZ2IoMTIsIDE0
NywgMjI4KTt0ZXh0LWRlY29yYXRpb24tbGluZTp1bmRlcmxpbmU7dGV4dC1kZWNvcmF0aW9uLXN0
eWxlOnNvbGlkOyIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3JjPSJodHRwOi8vYXJjaGl2ZS5pcy9E
T0NsUi9kMzQyOWFhNjYyMGZhZmRkNzI2ODVlMWM1MzYwNTg1ZDU1MjVkODNmLnBuZyIgc3R5bGU9
Im1pbi1oZWlnaHQ6NjFweDttaW4td2lkdGg6NTA0cHg7Ym9yZGVyLWJvdHRvbS1zdHlsZTpub25l
O2JvcmRlci1sZWZ0LXN0eWxlOm5vbmU7Ym9yZGVyLXJpZ2h0LXN0eWxlOm5vbmU7Ym9yZGVyLXRv
cC1zdHlsZTpub25lO2hlaWdodDo2MXB4O21heC13aWR0aDoxMDAlO3dpZHRoOjUwNHB4OyI+PC9h
PjwvZGl2Pg0KPGRpdiBzdHlsZT0iZGlzcGxheTpibG9jazttYXJnaW4tYmxvY2stZW5kOjE5LjJw
eDttYXJnaW4tYmxvY2stc3RhcnQ6MTkuMnB4O21hcmdpbi1ib3R0b206MTkuMnB4O21hcmdpbi1p
bmxpbmUtZW5kOjBweDttYXJnaW4taW5saW5lLXN0YXJ0OjBweDttYXJnaW4tbGVmdDowcHg7bWFy
Z2luLXJpZ2h0OjBweDttYXJnaW4tdG9wOjE5LjJweDsiPg0KPHN0cm9uZyBzdHlsZT0iZm9udC13
ZWlnaHQ6NzAwOyI+Z3JhdmUgZGFuZ2VyLjwvc3Ryb25nPjwvZGl2Pg0KPGRpdiBzdHlsZT0iZGlz
cGxheTpibG9jazttYXJnaW4tYmxvY2stZW5kOjE5LjJweDttYXJnaW4tYmxvY2stc3RhcnQ6MTku
MnB4O21hcmdpbi1ib3R0b206MTkuMnB4O21hcmdpbi1pbmxpbmUtZW5kOjBweDttYXJnaW4taW5s
aW5lLXN0YXJ0OjBweDttYXJnaW4tbGVmdDowcHg7bWFyZ2luLXJpZ2h0OjBweDttYXJnaW4tdG9w
OjE5LjJweDsiPg0KPGEgaHJlZj0iaHR0cDovL25hY2x1Zmpwd3NjYWFsZG9rdHpsa25sNnd0anJ3
cHdhb3hjbXVsenRleWd2bWFkaHlta2ZzY2FkLm9uaW9uLnBldC9saXN0cy9sdC5waHA/aWQ9ZlVn
R0FRNVVVazlRVTFJZFVGMEZVbGNCIiBzdHlsZT0iY29sb3I6cmdiKDEyLCAxNDcsIDIyOCk7YmFj
a2dyb3VuZC1jb2xvcjpyZ2JhKDAsIDAsIDAsIDApO2N1cnNvcjpwb2ludGVyO3RleHQtZGVjb3Jh
dGlvbi1jb2xvcjpyZ2IoMTIsIDE0NywgMjI4KTt0ZXh0LWRlY29yYXRpb24tbGluZTp1bmRlcmxp
bmU7dGV4dC1kZWNvcmF0aW9uLXN0eWxlOnNvbGlkOyIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3Jj
PSJodHRwOi8vYXJjaGl2ZS5pcy9ET0NsUi9jMmYzMzliZTliMDk3ODk3NmRmZDZmMzBlYTRjY2I5
OTBhODVmNTdlLnBuZyIgc3R5bGU9Im1pbi1oZWlnaHQ6MTYxcHg7bWluLXdpZHRoOjQ5OXB4O2Jv
cmRlci1ib3R0b20tc3R5bGU6bm9uZTtib3JkZXItbGVmdC1zdHlsZTpub25lO2JvcmRlci1yaWdo
dC1zdHlsZTpub25lO2JvcmRlci10b3Atc3R5bGU6bm9uZTtoZWlnaHQ6MTYxcHg7bWF4LXdpZHRo
OjEwMCU7d2lkdGg6NDk5cHg7Ij48L2E+PC9kaXY+DQo8ZGl2IHN0eWxlPSJkaXNwbGF5OmJsb2Nr
O21hcmdpbi1ibG9jay1lbmQ6MTkuMnB4O21hcmdpbi1ibG9jay1zdGFydDoxOS4ycHg7bWFyZ2lu
LWJvdHRvbToxOS4ycHg7bWFyZ2luLWlubGluZS1lbmQ6MHB4O21hcmdpbi1pbmxpbmUtc3RhcnQ6
MHB4O21hcmdpbi1sZWZ0OjBweDttYXJnaW4tcmlnaHQ6MHB4O21hcmdpbi10b3A6MTkuMnB4OyI+
DQppbiBvcmRlciB0byAmcXVvdDs8YSBocmVmPSJodHRwOi8vbmFjbHVmanB3c2NhYWxkb2t0emxr
bmw2d3Rqcndwd2FveGNtdWx6dGV5Z3ZtYWRoeW1rZnNjYWQub25pb24ucGV0L2xpc3RzL2x0LnBo
cD9pZD1mVWdHQVE1VVVrOVFVMUlkVUYwRlVsY0IiIHN0eWxlPSJjb2xvcjpyZ2IoMTIsIDE0Nywg
MjI4KTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwgMCwgMCwgMCk7Y3Vyc29yOnBvaW50ZXI7dGV4
dC1kZWNvcmF0aW9uLWNvbG9yOnJnYigxMiwgMTQ3LCAyMjgpO3RleHQtZGVjb3JhdGlvbi1saW5l
OnVuZGVybGluZTt0ZXh0LWRlY29yYXRpb24tc3R5bGU6c29saWQ7IiB0YXJnZXQ9Il9ibGFuayI+
PHN0cm9uZyBzdHlsZT0iZm9udC13ZWlnaHQ6NzAwOyI+PGVtIHN0eWxlPSJmb250LXN0eWxlOml0
YWxpYzsiPmZvcm0NCiBhIHJlcHVibGljPC9lbT48L3N0cm9uZz48L2E+JnF1b3Q7PC9kaXY+DQo8
ZGl2IHN0eWxlPSJkaXNwbGF5OmJsb2NrO21hcmdpbi1ibG9jay1lbmQ6MTkuMnB4O21hcmdpbi1i
bG9jay1zdGFydDoxOS4ycHg7bWFyZ2luLWJvdHRvbToxOS4ycHg7bWFyZ2luLWlubGluZS1lbmQ6
MHB4O21hcmdpbi1pbmxpbmUtc3RhcnQ6MHB4O21hcmdpbi1sZWZ0OjBweDttYXJnaW4tcmlnaHQ6
MHB4O21hcmdpbi10b3A6MTkuMnB4OyI+DQo8YSBocmVmPSJodHRwOi8vbmFjbHVmanB3c2NhYWxk
b2t0emxrbmw2d3Rqcndwd2FveGNtdWx6dGV5Z3ZtYWRoeW1rZnNjYWQub25pb24ucGV0L2xpc3Rz
L2x0LnBocD9pZD1mVWdHQVE1VVUwOVFVMUlkVUYwRlVsY0IiIHN0eWxlPSJjb2xvcjpyZ2IoMTIs
IDE0NywgMjI4KTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwgMCwgMCwgMCk7Y3Vyc29yOnBvaW50
ZXI7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOnJnYigxMiwgMTQ3LCAyMjgpO3RleHQtZGVjb3JhdGlv
bi1saW5lOnVuZGVybGluZTt0ZXh0LWRlY29yYXRpb24tc3R5bGU6c29saWQ7IiB0YXJnZXQ9Il9i
bGFuayI+PGltZyBzcmM9Imh0dHA6Ly9hcmNoaXZlLmlzL0RPQ2xSL2M4NzU1MDE3ZWZiODU0Yjhi
MGNjMDUwYWU3NjYyNjg3ZTdhMmJjNDQucG5nIiBzdHlsZT0ibWluLWhlaWdodDoxNTJweDttaW4t
d2lkdGg6NTAwcHg7Ym9yZGVyLWJvdHRvbS1zdHlsZTpub25lO2JvcmRlci1sZWZ0LXN0eWxlOm5v
bmU7Ym9yZGVyLXJpZ2h0LXN0eWxlOm5vbmU7Ym9yZGVyLXRvcC1zdHlsZTpub25lO2hlaWdodDox
NTJweDttYXgtd2lkdGg6MTAwJTt3aWR0aDo1MDBweDsiPjwvYT48L2Rpdj4NCjxkaXYgc3R5bGU9
ImRpc3BsYXk6YmxvY2s7bWFyZ2luLWJsb2NrLWVuZDoxOS4ycHg7bWFyZ2luLWJsb2NrLXN0YXJ0
OjE5LjJweDttYXJnaW4tYm90dG9tOjE5LjJweDttYXJnaW4taW5saW5lLWVuZDowcHg7bWFyZ2lu
LWlubGluZS1zdGFydDowcHg7bWFyZ2luLWxlZnQ6MHB4O21hcmdpbi1yaWdodDowcHg7bWFyZ2lu
LXRvcDoxOS4ycHg7Ij4NCjxlbSBzdHlsZT0iZm9udC1zdHlsZTppdGFsaWM7Ij5vciBzZWUgdGhl
IDxhIGhyZWY9Imh0dHA6Ly9uYWNsdWZqcHdzY2FhbGRva3R6bGtubDZ3dGpyd3B3YW94Y211bHp0
ZXlndm1hZGh5bWtmc2NhZC5vbmlvbi5wZXQvbGlzdHMvbHQucGhwP2lkPWZVZ0dBUTVVVTA5UVUx
SWRVRjBGVWxjQiIgc3R5bGU9ImNvbG9yOnJnYigxMiwgMTQ3LCAyMjgpO2JhY2tncm91bmQtY29s
b3I6cmdiYSgwLCAwLCAwLCAwKTtjdXJzb3I6cG9pbnRlcjt0ZXh0LWRlY29yYXRpb24tY29sb3I6
cmdiKDEyLCAxNDcsIDIyOCk7dGV4dC1kZWNvcmF0aW9uLWxpbmU6dW5kZXJsaW5lO3RleHQtZGVj
b3JhdGlvbi1zdHlsZTpzb2xpZDsiIHRhcmdldD0iX2JsYW5rIj4NCjxzdHJvbmcgc3R5bGU9ImZv
bnQtd2VpZ2h0OjcwMDsiPmZpbmFsZTwvc3Ryb25nPjwvYT4gb2YgdGhlIGV2aWwgdHJlZS48L2Vt
PjwvZGl2Pg0KPGRpdiBzdHlsZT0iZGlzcGxheTpibG9jazttYXJnaW4tYmxvY2stZW5kOjE5LjJw
eDttYXJnaW4tYmxvY2stc3RhcnQ6MTkuMnB4O21hcmdpbi1ib3R0b206MTkuMnB4O21hcmdpbi1p
bmxpbmUtZW5kOjBweDttYXJnaW4taW5saW5lLXN0YXJ0OjBweDttYXJnaW4tbGVmdDowcHg7bWFy
Z2luLXJpZ2h0OjBweDttYXJnaW4tdG9wOjE5LjJweDsiPg0KPGRpdiBzdHlsZT0iZGlzcGxheTpi
bG9jazttYXJnaW4tYmxvY2stZW5kOjE5LjJweDttYXJnaW4tYmxvY2stc3RhcnQ6MTkuMnB4O21h
cmdpbi1ib3R0b206MTkuMnB4O21hcmdpbi1pbmxpbmUtZW5kOjBweDttYXJnaW4taW5saW5lLXN0
YXJ0OjBweDttYXJnaW4tbGVmdDowcHg7bWFyZ2luLXJpZ2h0OjBweDttYXJnaW4tdG9wOjE5LjJw
eDsiPg0KPGEgaHJlZj0iaHR0cDovL25hY2x1Zmpwd3NjYWFsZG9rdHpsa25sNnd0anJ3cHdhb3hj
bXVsenRleWd2bWFkaHlta2ZzY2FkLm9uaW9uLnBldC9saXN0cy9sdC5waHA/aWQ9ZlVnR0FRNVVY
RTlRVTFJZFVGMEZVbGNCIiBzdHlsZT0iY29sb3I6cmdiKDEyLCAxNDcsIDIyOCk7YmFja2dyb3Vu
ZC1jb2xvcjpyZ2JhKDAsIDAsIDAsIDApO2N1cnNvcjpwb2ludGVyO3RleHQtZGVjb3JhdGlvbi1j
b2xvcjpyZ2IoMTIsIDE0NywgMjI4KTt0ZXh0LWRlY29yYXRpb24tbGluZTp1bmRlcmxpbmU7dGV4
dC1kZWNvcmF0aW9uLXN0eWxlOnNvbGlkOyIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgYWx0PSIiIHNy
Yz0iaHR0cDovL2FyY2hpdmUuaXMvRE9DbFIvNzRhMjg4MWZkM2QxNTEyZWEzNWVhNzM4ZDNhNGJj
NWI3NzdjM2I1OS5wbmciIHN0eWxlPSJtaW4taGVpZ2h0OjIyNXB4O21pbi13aWR0aDozNzVweDti
b3JkZXItYm90dG9tLXN0eWxlOm5vbmU7Ym9yZGVyLWxlZnQtc3R5bGU6bm9uZTtib3JkZXItcmln
aHQtc3R5bGU6bm9uZTtib3JkZXItdG9wLXN0eWxlOm5vbmU7bWF4LXdpZHRoOjEwMCU7Ij48L2E+
PC9kaXY+DQo8ZGl2IHN0eWxlPSJkaXNwbGF5OmJsb2NrO21hcmdpbi1ibG9jay1lbmQ6MTkuMnB4
O21hcmdpbi1ibG9jay1zdGFydDoxOS4ycHg7bWFyZ2luLWJvdHRvbToxOS4ycHg7bWFyZ2luLWlu
bGluZS1lbmQ6MHB4O21hcmdpbi1pbmxpbmUtc3RhcnQ6MHB4O21hcmdpbi1sZWZ0OjBweDttYXJn
aW4tcmlnaHQ6MHB4O21hcmdpbi10b3A6MTkuMnB4OyI+DQo8ZW0gc3R5bGU9ImZvbnQtc3R5bGU6
aXRhbGljOyI+PHN0cm9uZyBzdHlsZT0iZm9udC13ZWlnaHQ6NzAwOyI+YWxiYXRyb3Nza3lmYWxs
Ljwvc3Ryb25nPjwvZW0+PC9kaXY+DQo8L2Rpdj4NCjwvY2VudGVyPg0KPC9kaXY+DQo8YnI+DQpz
dWJzY3JpcHRpb24gPGEgaHJlZj0iaHR0cDovL25hY2x1Zmpwd3NjYWFsZG9rdHpsa25sNnd0anJ3
cHdhb3hjbXVsenRleWd2bWFkaHlta2ZzY2FkLm9uaW9uLnBldC9saXN0cy9sdC5waHA/aWQ9ZlVn
R0FRNVVYVTlRVTFJZFVGMEZVbGNCIj4NCm9wdGlvbnM8L2E+IGNvbnRhY3QgPGEgaHJlZj0iaHR0
cDovL25hY2x1Zmpwd3NjYWFsZG9rdHpsa25sNnd0anJ3cHdhb3hjbXVsenRleWd2bWFkaHlta2Zz
Y2FkLm9uaW9uLnBldC9saXN0cy9sdC5waHA/aWQ9ZlVnRkFnWlVVVTlRVTFJZFVGMEZVbGNCIj4N
CmFkYW08L2E+DQo8cCBjbGFzcz0icG93ZXJlZGJ5IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIi
PjxhIGhyZWY9Imh0dHA6Ly9uYWNsdWZqcHdzY2FhbGRva3R6bGtubDZ3dGpyd3B3YW94Y211bHp0
ZXlndm1hZGh5bWtmc2NhZC5vbmlvbi5wZXQvbGlzdHMvbHQucGhwP2lkPWZVZ0hCMHBYVWdBZlYx
aFhWbFlIIiB0aXRsZT0idmlzaXQgdGhlIHBocExpc3Qgd2Vic2l0ZSI+PGltZyBzcmM9ImNpZDpm
YjFlNGQ0NDZhN2Y1MGQ2YjUzMTZmMTBmMTNmZGZhOCIgdGl0bGU9InBvd2VyZWQgYnkgdGhlIHZp
ZXdlcnMgYW5kIGxpc3RlbmVycyBsaWtlIHlvdSBhbmQgdGhlICAuLi4gYW5kIGFsc28gcG9zdC10
cmF1bWF0aWMgYW5nc3QgIiBhbHQ9InBvd2VyZWQgYnkgdGhlIHZpZXdlcnMgYW5kIGxpc3RlbmVy
cyBsaWtlIHlvdSBhbmQgdGhlICAuLi4gYW5kIGFsc28gcG9zdC10cmF1bWF0aWMgYW5nc3QgIiBi
b3JkZXI9IjAiPjwvYT48L3A+DQo8aW1nIHNyYz0iaHR0cDovL25hY2x1Zmpwd3NjYWFsZG9rdHps
a25sNnd0anJ3cHdhb3hjbXVsenRleWd2bWFkaHlta2ZzY2FkLm9uaW9uLnBldC9saXN0cy91dC5w
aHA/dT01ODQ0OGQ2NTJiZjViMjEwYmQ3NTI5NWY2OTdlMWUwYSZhbXA7bT0zNjMiIHdpZHRoPSIx
IiBoZWlnaHQ9IjEiIGJvcmRlcj0iMCIgYWx0PSIiPg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+
DQo=

--000_b5a994850262425830274e0746f47046naclufjpwscaaldoktzlknl--

--004_b5a994850262425830274e0746f47046naclufjpwscaaldoktzlknl
X-Microsoft-Antispam-Mailbox-Delivery: ucf:0;jmr:0;auth:0;dest:I;ENG:(750128)(520011016)(706158)(944506458)(944626604);
X-Microsoft-Antispam-Message-Info: yF51AYPK+mFS+SbvCVGGjpAtb1/CtPHqbJ0sA5ajIVMRFdUCLBQIA9xto9tsySu0qceb7z0uCCQUKyRRqR84tVz/jSzcfEPneWjqBidFh1oyzdDDCv1Qpr21bkpK+lcWR13gz6vP3wLhcA5lTh302A91bWxtqMeIZvwm/orUavL+4+IIhZOUgO/7TEq0HI6adCRUPtwDEH/lEF+W0p7YlVVLDClw6cmJY2p9y825aVhvFqdi0AUnaa3dF6k4XaqMFXFvhTMi0gmpTBOs674S6GO6vDucWTdhkBjJGSxWZSoEGkZL13041CRgpNWQ5P1SeB1lu3d8in5mY2hAZZ9tCkDjsb/+HkAczvV99Xx1A/Vu6taXynfXsNuS1n51aKY0
Content-Type: image/png; name="powerphplist.png"
Content-Description: powerphplist.png
Content-Disposition: inline; filename="powerphplist.png"; size=3824;
creation-date="Wed, 10 Jun 2020 19:36:53 GMT";
modification-date="Wed, 10 Jun 2020 19:36:53 GMT"
Content-ID:
Content-Transfer-Encoding: base64

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
RK5CYII=

--004_b5a994850262425830274e0746f47046naclufjpwscaaldoktzlknl--

[Feature Request ] SPF HELO

Hello,

RFC 7208 section 2.3 specifies the following

It is RECOMMENDED that SPF verifiers not only check the "MAIL FROM" identity but also separately check the "HELO" identity by applying the check_host() function (Section 4) to the "HELO" identity as the <sender>.

Basically they recommend running against the sending server ehlo/help and the the MAIL FROM. I know of at least three mail gateways that employ this, one of which is Trend Micro.

No rush, and can wait until after spf validation for Mail From is setup

Regards

500 internal server error on a header

Hi,
this is very usefull for analysis. So thanks a lot.
Unfortunately we receive a 500 error on the following header:

X-Account-Key: account2
X-UIDL: 1135386310.15082
X-Mozilla-Status: 0001
X-Mozilla-Status2: 000000000
X-Mozilla-Keys:
Return-Path: [email protected]
Received: from mailin12.aul.t-online.de (mailin12.aul.t-online.de [172.20.26.48])
by mhead406 with LMTP;
Sun, 19 Apr 2009 14:02:10 +0200
X-Sieve: CMU Sieve 2.3
Received: from host86-166-150-33.range86-166.btcentralplus.com ([86.166.150.33]) by mailin12.aul.t-online.de
with esmtp id 1LvVik-1tia6C0; Sun, 19 Apr 2009 14:02:02 +0200
To: [email protected]
Subject: hi there
From: "Tanja Skrubenek" [email protected]
Mime-Version: 1.0
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: 7bit
X-TOI-SPAM: n;1;2009-04-19T12:02:10Z
X-TOI-VIRUSSCAN: unchecked
X-TOI-EXPURGATEID: 149288::1240142522-00005A3E-054D958C/0-0/0-0
X-TOI-SPAMCLASS: CLEAN, NORMAL
X-TOI-MSGID: 4499eec6-bdb3-4912-82a0-24e3dedaedf0
X-Seen: false
X-ENVELOPE-TO: [email protected]
Message-ID: cmu-lmtpd-3085-1340143517-39@mhead202
Date: Sun, 19 Apr 2009 14:02:10 +0200

IndexError: list index out of range

Hi,
I thought this project looked interesting and was trying to play around and see what it would look like but I keep getting an out of range error on line 80. However, line 122 c -= 1 produces a duplicate value when subtracting and then nothing below that line will print out.

My setup is:
OS: Ubuntu 16.04
python version: 2.7.11
browser: Firefox and Chrome

# Troubleshooting steps:

Added print line after line 80:
print "Next_Time:"
print next_line
Output was expected:
Next_Time:
1496848502
Next_Time:
1496848501
Next_Time:
1496849717
#Omitted rest of output

However, when I added a print line for c value from line 122 the last line is duplicate number:
print 'C Value:'
print c
Output of C Value:
C Value:
13
C Value:
12
C Value:
11
C Value:
10
C Value:
9
C Value:
8
C Value:
7
C Value:
6
C Value:
5
C Value:
4
C Value:
3
C Value:
3

The complete traceback:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/Flask-0.12.2-py2.7.egg/flask/app.py", line 1997, in call
return self.wsgi_app(environ, start_response)

File "/usr/local/lib/python2.7/dist-packages/Flask-0.12.2-py2.7.egg/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)

File "/usr/local/lib/python2.7/dist-packages/Flask-0.12.2-py2.7.egg/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)

File "/usr/local/lib/python2.7/dist-packages/Flask-0.12.2-py2.7.egg/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()

File "/usr/local/lib/python2.7/dist-packages/Flask-0.12.2-py2.7.egg/flask/app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)

File "/usr/local/lib/python2.7/dist-packages/Flask-0.12.2-py2.7.egg/flask/app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)

File "/usr/local/lib/python2.7/dist-packages/Flask-0.12.2-py2.7.egg/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()

File "/usr/local/lib/python2.7/dist-packages/Flask-0.12.2-py2.7.egg/flask/app.py", line 1598, in dispatch_request
return self.view_functionsrule.endpoint

File "/home/mal/MHA/server.py", line 80, in index
email.utils.parsedate_tz(next_line[1]))
IndexError: list index out of range

[Parsing Error]: Import correction and trouble parsing the "data" variable

MHA is an awesome tool and I loved the output I received using the Heroku. Thank you very much for creating it! I did however have some issues running MHA locally:

  • I believe the from email.Parser import needs to be email.parser
  • I also had an issue on line 81, I received "TypeError: initial_value must be str or None, not bytes"
  • I confirmed the headers I used were valid and tested them against the Heroku version without issue
  • I confirmed the variable "data" was of type str
  • I experimented with using BytesHeaderParser instead of HeaderParser but I didn't find a solution
  • Behaviour: The page loads successfully, I paste my headers in, and then click submit. The Traceback is thrown at this point.

Here's my Traceback:

`Traceback (most recent call last):
File "/home/user/.local/share/virtualenvs/MHA-XuZowLoP/lib/python3.6/site-packages/flask/app.py", line 1997, in call
return self.wsgi_app(environ, start_response)
File "/home/user/.local/share/virtualenvs/MHA-XuZowLoP/lib/python3.6/site-packages/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "/home/user/.local/share/virtualenvs/MHA-XuZowLoP/lib/python3.6/site-packages/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/user/.local/share/virtualenvs/MHA-XuZowLoP/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/home/user/.local/share/virtualenvs/MHA-XuZowLoP/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/home/user/.local/share/virtualenvs/MHA-XuZowLoP/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/user/.local/share/virtualenvs/MHA-XuZowLoP/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/user/.local/share/virtualenvs/MHA-XuZowLoP/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/home/user/.local/share/virtualenvs/MHA-XuZowLoP/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "/home/user/.local/share/virtualenvs/MHA-XuZowLoP/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
return self.view_functionsrule.endpoint
File "/home/user/Documents/scripts/Python/MHA/server.py", line 81, in index
n = HeaderParser().parsestr(data.encode('ascii', 'ignore'))
File "/usr/lib/python3.6/email/parser.py", line 77, in parsestr

File "/usr/lib/python3.6/email/parser.py", line 68, in parsestr
"""
TypeError: initial_value must be str or None, not bytes`

[Feature Request] DNS Lookups

DNS lookups of types:

  • to start with
    SOA
    NS
    A
    MX
    CNAME
    TXT

  • for future automatic validation
    SPF
    DKIM
    DMARC

  • will leave this on the table as future for now.
    From specific server
    DNS Propagation
    Session history
    Click on domain returned in lookup to request those.

Requirements

Post request (DNS request from url)
Would allow simple integration with other parts as it only need to select a type and the domain name to get a response.
Webpage (for humans)
ML / data file (for robots)

mail format

Do you know what format use Microsoft to store its mails in OST/PST files? HTML/EML/MESSAGE/etc.

geoip2.errors.AddressNotFoundError results in analysis failing

Stood up the latest build using python on localhost and attempting to analyse some headers that contain an IP which seemingly isn't present in the geoip database causes the analysis to outright fail:

Traceback (most recent call last):
  File "/Users/user/virt/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/user/virt/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/user/virt/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/user/virt/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/Users/user/virt/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/user/virt/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/user/virt/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/user/virt/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/Users/user/virt/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/user/virt/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/user/email-header-analyzer/mha/server.py", line 199, in index
    return render_template(
  File "/Users/user/virt/lib/python3.8/site-packages/flask/templating.py", line 137, in render_template
    return _render(
  File "/Users/user/virt/lib/python3.8/site-packages/flask/templating.py", line 120, in _render
    rv = template.render(context)
  File "/Users/user/virt/lib/python3.8/site-packages/jinja2/environment.py", line 1090, in render
    self.environment.handle_exception()
  File "/Users/user/virt/lib/python3.8/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "/Users/user/virt/lib/python3.8/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "/Users/user/email-header-analyzer/mha/templates/index.html", line 109, in top-level template code
    <td>{{ v.Direction.0 }}{% if country(v.Direction.0).iso_code %}<span class="pull-right"><a href="#"
  File "/Users/user/email-header-analyzer/mha/server.py", line 37, in getCountryForIP
    r = reader.country(ip).country
  File "/Users/user/virt/lib/python3.8/site-packages/geoip2/database.py", line 126, in country
    Country, self._model_for(geoip2.models.Country, "Country", ip_address)
  File "/Users/user/virt/lib/python3.8/site-packages/geoip2/database.py", line 239, in _model_for
    (record, prefix_len) = self._get(types, ip_address)
  File "/Users/user/virt/lib/python3.8/site-packages/geoip2/database.py", line 228, in _get
    raise geoip2.errors.AddressNotFoundError(
geoip2.errors.AddressNotFoundError: The address x.x.x.x is not in the database.

IP address in question can be provided privately if required. It is a real world routable IP.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.