Snowman08
Snowman08

Reputation: 425

Is it possible to iterate a dict in python for use in a html email

I am trying to send a email notification, and I would like to send dynamic data(for testing purposes my dictionary is static). How ever when I iterate trough my dictionary only one value shows up in the email. Any help would be greatly appreciated!!!

Here is my email.py

import smtplib

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# me == my email address
# you == recipient's email address
me = "[email protected]"
you = "[email protected]"

msg = MIMEMultipart('alternative')
msg['Subject'] = "Link"
msg['From'] = me
msg['To'] = you

justin = "Justin"

p = {u'Contracts that need signed by: Justin': [[u'/contracts/26203', u'/contracts/26194', u'/contracts/26199', u'/contracts/26173']]}


for a in p.keys():
  b = p['Contracts that need signed by: Justin']
  for c, d in enumerate(b):
    e = d
    for f in e:
      html = """\
      <html>
        <head></head>
        <body>
          <p>Contracts that need signed by """ + justin  + """<br>
             How are you?<br>
             Here is the <a href="http://contract.mydomain.com/""" + f + """">link</a> you wanted.
          </p>
        </body>
      </html>
      """

part2 = MIMEText(html, 'html')

msg.attach(part2)

s = smtplib.SMTP('localhost')
s.sendmail(me, you, msg.as_string())
s.quit()

Here is the email I get ^

Contracts that need signed by Justin
How are you?
Here is the link you wanted.

Which I want it to look like this

Contracts that need signed by Justin
How are you?
#EACH OF THE LINKS WOULD BE THE NEXT VALUE IN MY DICTONARY. 
Here is the link1 you wanted.
Here is the link2 you wanted.
Here is the link3 you wanted.
Here is the link4 you wanted. 

Upvotes: 2

Views: 2087

Answers (2)

mudo121
mudo121

Reputation: 96

You are overwriting the html variable over and over again. You have to add always 1 line in the for loop like this:

justin = "Justin"

p = {u'Contracts that need signed by: Justin': [[u'/contracts/26203', u'/contracts/26194', u'/contracts/26199', u'/contracts/26173']]}


for a in p.keys():
    b = p['Contracts that need signed by: Justin']
    for c, d in enumerate(b):
        e = d
        html = """\
<html>
<head></head>
<body>
<p>Contracts that need signed by """ + justin  + """<br>
How are you?<br>
"""
        for f in e:
            html = html + """Here is the <a href="http://contract.mydomain.com/""" + f + """">link</a> you wanted. \n"""
        html = html + """</p>
</body>
</html>
"""


part2 = MIMEText(html, 'html')

print part2

Upvotes: 2

neverwalkaloner
neverwalkaloner

Reputation: 47364

The problem is you overwrite html variable on each iteration. You can use string formatting for your problem:

for c, d in enumerate(b):
    e = d
    html = """\
      <html>
        <head></head>
        <body>
          <p>Contracts that need signed by """ + justin + """<br>
             How are you?<br>
             {0}
          </p>
        </body>
      </html>
      """
    s = []
    for f in e:
        print(f)
        s.append('Here is the <a href="http://contract.mydomain.com/{0}>link</a> you wanted.'.format(f))
    print(s)
html = html.format('\n'.join(s))

print(html)

output:

<html>
    <head></head>
    <body>
      <p>Contracts that need signed by aaa<br>
         How are you?<br>
         Here is the <a   href="http://contract.mydomain.com//contracts/26203>link</a> you wanted.
         Here is the <a href="http://contract.mydomain.com//contracts/26194>link</a> you wanted.
         Here is the <a href="http://contract.mydomain.com//contracts/26199>link</a> you wanted.
         Here is the <a href="http://contract.mydomain.com//contracts/26173>link</a> you wanted.
      </p>
    </body>
  </html>

Upvotes: 2

Related Questions