Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python script ignoring newlines in a files

Tags:

python

shell

The following contents are in a file.i use a shell script to call a python script.This python script send the mail.But in the mail contents i see the output as shown below.Its all in oneline..What am i doing wrong

 /usr/bin/python $DIR/sm.py "$message"  "`cat /tmp/alert.txt`"

Input:The following are the contents of alert.txt

  Thu Jun 28 14:29:26 IST 2012

  Disk usage limit exceeded -Current disk usage is 167G-Configured disk usage is 200HTTPD connections exceeded configured usage limit -Current HTTPD connections is 21-Configured HTTPD connection is 20


  ========================OTHER INFO==================
  Total fds: 8
  Socket fds: 0
  Other fds: 8
  Free memory :Free Memory:183732
  Buffered memory Buffered Memory:78224
  Cache memory : Cache Memory:579040
  Disk usage is 167G
  DB connections 1
  Network connections 21
  CPU Usage: 0.0

Output:

  Thu Jun 28 14:29:26 IST 2012 Disk usage limit exceeded -Current disk usage is 167G-Configured disk usage is 200HTTPD connections exceeded configured usage limit -Current HTTPD connections is 21-Configured HTTPD connection is 20 ========================OTHER INFO================== Total fds: 8 Socket fds: 0 Other fds: 8 Free memory :Free Memory:183732 Buffered memory Buffered Memory:78224 Cache memory : Cache Memory:579040 Disk usage is 167G DB connections 1 Network connections 21 CPU Usage: 0.0

This is sm.py

import logging
import smtplib
import sys
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart


      try:
         smaid = qs[0].id
         gmailUser = '[email protected]'
         gmailPassword = '12345'
         mailServer = smtplib.SMTP('smtp.gmail.com', 587)
         mailServer.ehlo()
         mailServer.starttls()
         mailServer.ehlo()
         mailServer.login(gmailUser, gmailPassword)

         to_addr = "[email protected]"
         subject = sys.argv[1]
         body = sys.argv[2]
         try:
             msg = MIMEMultipart()
             msg['From'] = gmailUser
             msg['To'] = to_addr
             msg["Content-type"] = "text/html"
             sub = subject
             msg['Subject'] = sub
             body = body

             msg.attach(MIMEText(body, 'html'))
             mailServer.sendmail(gmailUser, to_addr, msg.as_string())
         except:
             write_exception("send exception")

         mailServer.close()
     except:
          write_exception("send exception1")
like image 426
Rajeev Avatar asked Nov 28 '25 08:11

Rajeev


2 Answers

If you insist on sending HTML, you need HTML line breaks:

import cgi
# escape special HTML characters
body = cgi.escape(body)
# use HTML line breaks
body = body.replace("\r\n", "\n").replace("\n", "<br />\n")

But probably you need neither Multipart nor HTML, so you can just use smtplib.SMTP.sendmail:

headers = (('From', gmailUser), 
           ('To', to_addr), 
           ('Subject', subject))

# normalize newlines to CR+LF, as required by SMTP
body = body.replace("\r\n", "\n").replace("\n", "\r\n")

msg = '\r\n'.join("%s: %s" % kv for kv in headers) + '\r\n'*2 + body

mailServer.sendmail(gmailUser, [to_addr], msg)

Also, you should not supply the file contents via the command line, because the command line is length-restricted. Instead you should supply the file via STDIN, like in python ... < /tmp/alert.txt and read it via

import sys
body = sys.stdin.read()
like image 108
Niklas B. Avatar answered Nov 30 '25 21:11

Niklas B.


Send it as text/plain instead of text/html. You do not have any HTML there. That should fix it, because it's up to client to show the text correctly then. New lines do not have the same effect in HTML.

like image 38
Uku Loskit Avatar answered Nov 30 '25 23:11

Uku Loskit