0

I am using Django's Email message module to trigger an email with an embedded image. Currently i have that image in my static folder.I tried using the html code directly in python to trigger the email. But the image is not getting embedded in the triggered email. I have tried by specifyjng the image source attribute as static path as well as a url. Could someone help? Below is the code that I have used.

Code :

recipient_list = ['a...@gmail.com']
from_email = 'a...@gmail.com'
message = ''
path = "{% static 'images/Welcome_image.jpg' %}" //Using this image in the below html also tried specifying the source as an url that points to the url path. Like https://abc/images/Welcome_imagr.jpg
message += "<table border='1' cellpadding='1' cellspacing='0' width='800'>\
            <tbody>\
                <tr>\
                    <td height='506'>\
                    <table border='0' cellpadding='0' cellspacing='0' width='600'>\
                        <tbody>\
                            <tr>\
                                <td valign='top'>\
                                    <img height='190' src=%s width='800'  tabindex='0'>\    //Using this image here but it is not rendered properly.
                                </td>\
                            </tr>\
                            <tr>\
                                <td height='306' valign='top'>\
                                    <table cellpadding='0' cellspacing='20' width='800'>\
                                        <tbody>\
                                            <tr>\
                                                <td align='left' height='804' style='font-family:arial,helvetica,sans-serif;font-size:13px' valign='top'>Hi User,<br><br>\
                                                    Welcome to the world.\
                                                </td>\
                                            </tr>\
                                        </tbody>\
                                    </table>\
                                </td>\
                            </tr>\
                        </tbody>\
                    </table>\
                    </td>\
                </tr>\
            </tbody>\
            </table>"%(path)

subject = "Welcome to the place!"
try:
    msg = EmailMessage(subject, message, from_email, recipient_list)
    msg.content_subtype = "html"  # Main content is now text/html
    if any(recipient_list):
        msg.send()
except Exception:
    print("Exception while sending mail")
Santhosh
  • 83
  • 1
  • 8
  • You can check the [docs](https://docs.djangoproject.com/en/3.0/topics/email/#sending-alternative-content-types) – arjun Dec 18 '19 at 16:27
  • use triple `"` - `"""text in many lines"""` and you will no need \ at the end of every line – furas Dec 18 '19 at 17:17
  • you can always read image and convert to `base64` string and embed directly in `` – furas Dec 18 '19 at 17:21
  • You should attach an image and reference it in email. message.attach('design.png', img_data, 'image/png'). .attach() is part of the send email package https://docs.djangoproject.com/en/3.0/topics/email/ – ja408 Dec 18 '19 at 18:09

1 Answers1

0

I have tried the below code and it worked:

Python:

def send():

msg = EmailMessage()

# generic email headers
msg['Subject'] = 'Welcome'
msg['From'] = 'abc@gmail.com'
recipients = ['abc@gmail.com']

# set the plain text body
msg.set_content('This is a plain text body.')

# now create a Content-ID for the image
image_cid = make_msgid(domain='')
# if `domain` argument isn't provided, it will
# use your computer's name

# set an alternative html body
msg.add_alternative("""\
    <html>
   <body>
      <table border='0' cellpadding='1' cellspacing='0' width='800'>
         <tbody>
            <tr>
               <td height='506'>
                  <table border='0' cellpadding='0' cellspacing='0' width='600'>
                     <tbody>
                        <tr>
                           <td valign='top'>
                              <img height='190' src="cid:{image_cid}" width='800'  tabindex='0'>
                           </td>
                        </tr>
                        <tr>
                           <td height='306' valign='top'>
                              <table cellpadding='0' cellspacing='20' width='800'>
                                 <tbody>
                                    <tr>
                                       <td align='left' height='804' style='font-family:arial,helvetica,sans-serif;font-size:13px' valign='top'>
                                          Hi {name},<br><br>
                                          Welcome!
                                       </td>
                                    </tr>
                                 </tbody>
                              </table>
                           </td>
                        </tr>
                     </tbody>
                  </table>
               </td>
            </tr>
         </tbody>
      </table>
   </body>
</html>
""".format(image_cid=image_cid[1:-1],name='ABC'), subtype='html')
# image_cid looks like <long.random.number@xyz.com>
# to use it as the img src, we don't need `<` or `>`
# so we use [1:-1] to strip them off

# now open the image and attach it to the email
with open('/path/image.jpg', 'rb') as img:
    # know the Content-Type of the image
    maintype, subtype = mimetypes.guess_type(img.name)[0].split('/')

    # attach it
    msg.get_payload()[1].add_related(img.read(),
                                     maintype=maintype,
                                     subtype=subtype,
                                     cid=image_cid)
server = smtplib.SMTP(host=<hostname>, port=25)

server.starttls()
# send the message via the server.
server.sendmail(msg['From'], recipients, msg.as_string())

server.quit()
Santhosh
  • 83
  • 1
  • 8