|
158 | 158 | "outputs": [], |
159 | 159 | "source": [ |
160 | 160 | "#| export\n", |
161 | | - "def create_multipart_msg(subj, from_addr, to_addrs, md=None, html=None, attach=None):\n", |
| 161 | + "def create_multipart_msg(subj, from_addr, to_addrs, md=None, html=None, attach=None, hdrs=None):\n", |
162 | 162 | " \"Create a multipart email with markdown text and HTML\"\n", |
163 | 163 | " msg = MIMEMultipart('alternative', policy=EmailPolicy())\n", |
164 | 164 | " msg['Subject'],msg['From'] = subj,str(from_addr)\n", |
| 165 | + " for k,v in (hdrs or {}).items(): msg[k]=v\n", |
165 | 166 | " msg['To'] = ', '.join([str(a) for a in listify(to_addrs)])\n", |
166 | 167 | " if md: msg.attach(MIMEText(md, 'plain'))\n", |
167 | 168 | " if html: msg.attach(MIMEText(html, 'html'))\n", |
|
176 | 177 | "metadata": {}, |
177 | 178 | "outputs": [], |
178 | 179 | "source": [ |
179 | | - "msg = create_multipart_msg('Test Subject', from_addr, to_addrs, md='**Bold text**', html='<b>Bold text</b>')\n", |
| 180 | + "msg = create_multipart_msg('Test Subject', from_addr, to_addrs, hdrs={'atest':'foo'},\n", |
| 181 | + " md='**Bold text**', html='<b>Bold text</b>')\n", |
180 | 182 | "test_eq(msg['Subject'], 'Test Subject')\n", |
181 | 183 | "test_eq(msg['From'], str(from_addr))\n", |
| 184 | + "test_eq(msg['atest'], 'foo')\n", |
182 | 185 | "test_eq(len(msg.get_payload()), 2)\n", |
183 | 186 | "test_eq(msg.get_payload()[0].get_content_type(), 'text/plain')\n", |
184 | 187 | "test_eq(msg.get_payload()[1].get_content_type(), 'text/html')\n", |
|
193 | 196 | "outputs": [], |
194 | 197 | "source": [ |
195 | 198 | "#| export\n", |
196 | | - "def md2email(subj, from_addr, to_addrs, md, attach=None):\n", |
| 199 | + "def md2email(subj, from_addr, to_addrs, md, attach=None, hdrs=None):\n", |
197 | 200 | " \"Create a multipart email from markdown\"\n", |
198 | 201 | " html = markdown(md)\n", |
199 | | - " return create_multipart_msg(subj, from_addr, to_addrs, md=md, html=html, attach=attach)" |
| 202 | + " return create_multipart_msg(subj, from_addr, to_addrs, md=md, html=html, attach=attach, hdrs=hdrs)" |
200 | 203 | ] |
201 | 204 | }, |
202 | 205 | { |
|
384 | 387 | "#| export\n", |
385 | 388 | "class MarkdownMerge:\n", |
386 | 389 | " \"Send templated email merge messages formatted with Markdown\"\n", |
387 | | - " def __init__(self, addrs, from_addr, subj, msg, smtp_cfg=None, inserts=None, test=False):\n", |
| 390 | + " def __init__(self, addrs, from_addr, subj, msg, smtp_cfg=None, inserts=None, test=False, hdrs=None):\n", |
388 | 391 | " self.addrs,self.from_addr,self.subj,self.msg,self.i = addrs,from_addr,subj,msg,0\n", |
389 | 392 | " self.inserts = [{}]*len(addrs) if inserts is None else inserts\n", |
390 | | - " self.smtp_cfg,self.test = smtp_cfg,test\n", |
| 393 | + " self.smtp_cfg,self.test,self.hdrs = smtp_cfg,test,hdrs\n", |
391 | 394 | "\n", |
392 | 395 | " def send_msgs(self, pause=0.2):\n", |
393 | 396 | " \"Send all unsent messages to `addrs` with `pause` secs between each send\"\n", |
394 | 397 | " conn = smtp_connection(**self.smtp_cfg)\n", |
395 | 398 | " while self.i < len(self.addrs):\n", |
396 | 399 | " addr,insert = self.addrs[self.i],self.inserts[self.i]\n", |
397 | 400 | " msg = self.msg.format(**insert)\n", |
398 | | - " eml = md2email(self.subj, self.from_addr, addr, md=msg)\n", |
| 401 | + " eml = md2email(self.subj, self.from_addr, addr, md=msg, hdrs=self.hdrs)\n", |
399 | 402 | " if self.test: print(f\"To: {addr}\\n{'-'*40}\\n{msg}\\n{'='*40}\\n\")\n", |
400 | 403 | " else:\n", |
401 | 404 | " conn.send_message(eml)\n", |
|
512 | 515 | ] |
513 | 516 | } |
514 | 517 | ], |
515 | | - "metadata": {}, |
| 518 | + "metadata": { |
| 519 | + "kernelspec": { |
| 520 | + "display_name": "python3", |
| 521 | + "language": "python", |
| 522 | + "name": "python3" |
| 523 | + } |
| 524 | + }, |
516 | 525 | "nbformat": 4, |
517 | 526 | "nbformat_minor": 5 |
518 | 527 | } |
0 commit comments