markdown-merge 0.1.4__py3-none-any.whl → 0.1.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of markdown-merge might be problematic. Click here for more details.
- markdown_merge/__init__.py +1 -1
- markdown_merge/core.py +27 -20
- {markdown_merge-0.1.4.dist-info → markdown_merge-0.1.6.dist-info}/METADATA +1 -1
- markdown_merge-0.1.6.dist-info/RECORD +9 -0
- markdown_merge-0.1.4.dist-info/RECORD +0 -9
- {markdown_merge-0.1.4.dist-info → markdown_merge-0.1.6.dist-info}/WHEEL +0 -0
- {markdown_merge-0.1.4.dist-info → markdown_merge-0.1.6.dist-info}/entry_points.txt +0 -0
- {markdown_merge-0.1.4.dist-info → markdown_merge-0.1.6.dist-info}/licenses/LICENSE +0 -0
- {markdown_merge-0.1.4.dist-info → markdown_merge-0.1.6.dist-info}/top_level.txt +0 -0
markdown_merge/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
__version__ = "0.1.
|
|
1
|
+
__version__ = "0.1.6"
|
|
2
2
|
from .core import *
|
markdown_merge/core.py
CHANGED
|
@@ -12,11 +12,13 @@ from fastcore.utils import *
|
|
|
12
12
|
from email.mime.multipart import MIMEMultipart
|
|
13
13
|
from email.mime.text import MIMEText
|
|
14
14
|
from email.mime.base import MIMEBase
|
|
15
|
+
from email.policy import EmailPolicy
|
|
15
16
|
from email import encoders
|
|
16
17
|
|
|
17
18
|
from contextlib import contextmanager
|
|
18
19
|
from markdown import markdown
|
|
19
20
|
from email.headerregistry import Address
|
|
21
|
+
from email.header import Header
|
|
20
22
|
from time import sleep
|
|
21
23
|
|
|
22
24
|
# %% ../nbs/00_core.ipynb
|
|
@@ -36,10 +38,11 @@ def attach_file(msg, f):
|
|
|
36
38
|
msg.attach(part)
|
|
37
39
|
|
|
38
40
|
# %% ../nbs/00_core.ipynb
|
|
39
|
-
def create_multipart_msg(subj, from_addr, to_addrs, md=None, html=None, attach=None):
|
|
41
|
+
def create_multipart_msg(subj, from_addr, to_addrs, md=None, html=None, attach=None, hdrs=None):
|
|
40
42
|
"Create a multipart email with markdown text and HTML"
|
|
41
|
-
msg = MIMEMultipart('alternative')
|
|
43
|
+
msg = MIMEMultipart('alternative', policy=EmailPolicy())
|
|
42
44
|
msg['Subject'],msg['From'] = subj,str(from_addr)
|
|
45
|
+
for k,v in (hdrs or {}).items(): msg[k]=v
|
|
43
46
|
msg['To'] = ', '.join([str(a) for a in listify(to_addrs)])
|
|
44
47
|
if md: msg.attach(MIMEText(md, 'plain'))
|
|
45
48
|
if html: msg.attach(MIMEText(html, 'html'))
|
|
@@ -47,39 +50,43 @@ def create_multipart_msg(subj, from_addr, to_addrs, md=None, html=None, attach=N
|
|
|
47
50
|
return msg
|
|
48
51
|
|
|
49
52
|
# %% ../nbs/00_core.ipynb
|
|
50
|
-
def md2email(subj, from_addr, to_addrs, md, attach=None):
|
|
53
|
+
def md2email(subj, from_addr, to_addrs, md, attach=None, hdrs=None):
|
|
51
54
|
"Create a multipart email from markdown"
|
|
52
55
|
html = markdown(md)
|
|
53
|
-
return create_multipart_msg(subj, from_addr, to_addrs, md=md, html=html, attach=attach)
|
|
56
|
+
return create_multipart_msg(subj, from_addr, to_addrs, md=md, html=html, attach=attach, hdrs=hdrs)
|
|
54
57
|
|
|
55
58
|
# %% ../nbs/00_core.ipynb
|
|
56
|
-
@contextmanager
|
|
57
59
|
def smtp_connection(host, port, user=None, password=None, use_ssl=True, use_tls=False):
|
|
58
|
-
"
|
|
60
|
+
"Create and return an SMTP connection"
|
|
59
61
|
conn = smtplib.SMTP_SSL(host, port) if use_ssl else smtplib.SMTP(host, port)
|
|
60
62
|
if use_tls and not use_ssl: conn.starttls()
|
|
61
63
|
if user and password: conn.login(user, password)
|
|
62
|
-
|
|
63
|
-
finally: conn.quit()
|
|
64
|
+
return conn
|
|
64
65
|
|
|
65
66
|
# %% ../nbs/00_core.ipynb
|
|
66
67
|
class MarkdownMerge:
|
|
67
68
|
"Send templated email merge messages formatted with Markdown"
|
|
68
|
-
def __init__(self, addrs, from_addr, subj, msg, smtp_cfg=None, inserts=None, test=False):
|
|
69
|
+
def __init__(self, addrs, from_addr, subj, msg, smtp_cfg=None, inserts=None, test=False, hdrs=None):
|
|
69
70
|
self.addrs,self.from_addr,self.subj,self.msg,self.i = addrs,from_addr,subj,msg,0
|
|
70
71
|
self.inserts = [{}]*len(addrs) if inserts is None else inserts
|
|
71
|
-
self.smtp_cfg,self.test = smtp_cfg,test
|
|
72
|
+
self.smtp_cfg,self.test,self.hdrs = smtp_cfg,test,hdrs
|
|
72
73
|
|
|
73
|
-
def send_msgs(self, pause=0.
|
|
74
|
+
def send_msgs(self, pause=0.2):
|
|
74
75
|
"Send all unsent messages to `addrs` with `pause` secs between each send"
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
76
|
+
conn = smtp_connection(**self.smtp_cfg)
|
|
77
|
+
while self.i < len(self.addrs):
|
|
78
|
+
addr,insert = self.addrs[self.i],self.inserts[self.i]
|
|
79
|
+
msg = self.msg.format(**insert)
|
|
80
|
+
eml = md2email(self.subj, self.from_addr, addr, md=msg, hdrs=self.hdrs)
|
|
81
|
+
if self.test: print(f"To: {addr}\n{'-'*40}\n{msg}\n{'='*40}\n")
|
|
82
|
+
else:
|
|
83
|
+
conn.send_message(eml)
|
|
84
|
+
sleep(pause)
|
|
85
|
+
self.i += 1
|
|
86
|
+
if self.i%100==0:
|
|
87
|
+
print(self.i)
|
|
88
|
+
conn.quit()
|
|
89
|
+
conn = smtp_connection(**self.smtp_cfg)
|
|
90
|
+
conn.quit()
|
|
84
91
|
|
|
85
92
|
def reset(self): self.i=0
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
markdown_merge/__init__.py,sha256=nugdIM7Lq9CCL0yID0e06gwlvYvIcYlywSE7YrdEjlA,42
|
|
2
|
+
markdown_merge/_modidx.py,sha256=bTtmxhhVACnK8Nd0w4hRAiZpu2BfygE6XNW2Qvsij14,1764
|
|
3
|
+
markdown_merge/core.py,sha256=zdSQT6k5Zdl0Hpg-Jaf12e24YB-TlGyoqd5f-hHuO90,3668
|
|
4
|
+
markdown_merge-0.1.6.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
5
|
+
markdown_merge-0.1.6.dist-info/METADATA,sha256=Jr64u5VRKFGCDBbjJW8c9zU5FH_m0cURMVHR1dhmono,2774
|
|
6
|
+
markdown_merge-0.1.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
7
|
+
markdown_merge-0.1.6.dist-info/entry_points.txt,sha256=jTaJtzTxHp7dbtuWOitXxilSKAgFXX-m6e_paLdbr70,50
|
|
8
|
+
markdown_merge-0.1.6.dist-info/top_level.txt,sha256=036ta8zjflvmW-hSc9kB-VSyF5UylMCOGjTC_EN3frU,15
|
|
9
|
+
markdown_merge-0.1.6.dist-info/RECORD,,
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
markdown_merge/__init__.py,sha256=-LeVYivXAjyF9-c9yzZbL3NNxzTjtw44rXGc0AC9he0,42
|
|
2
|
-
markdown_merge/_modidx.py,sha256=bTtmxhhVACnK8Nd0w4hRAiZpu2BfygE6XNW2Qvsij14,1764
|
|
3
|
-
markdown_merge/core.py,sha256=f6r5CWN8Z5RqBQTwWMvrBGGQ0T5BTSvRTF1OXv-QXc8,3388
|
|
4
|
-
markdown_merge-0.1.4.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
5
|
-
markdown_merge-0.1.4.dist-info/METADATA,sha256=dvWiQbuTp8VrPxvW0VBWZwFfDYXJ8SPygaYuYfYX_VY,2774
|
|
6
|
-
markdown_merge-0.1.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
7
|
-
markdown_merge-0.1.4.dist-info/entry_points.txt,sha256=jTaJtzTxHp7dbtuWOitXxilSKAgFXX-m6e_paLdbr70,50
|
|
8
|
-
markdown_merge-0.1.4.dist-info/top_level.txt,sha256=036ta8zjflvmW-hSc9kB-VSyF5UylMCOGjTC_EN3frU,15
|
|
9
|
-
markdown_merge-0.1.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|