Python, присоединяющий mailBody к электронной почте, не работает - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть скрипт ниже, который отлично работает для rsync, этот скрипт на самом деле перетаскивает файлы с удаленного хоста (ов) на сервер, где он работает под dest Папка.

Однако rsync работает нормально, но почтовая часть в основном msg = 'message + "rsync process completed"' не отправляется как электронное письмо.

Почему-то я не понимаю, что не так, я делаю!

import os
import sys
import subprocess
import argparse
import smtplib

#Dir Structure
dst = "/infralogs/external_dns_logs"
rsync_user = "root"
mailFrom = 'robo@helisis.com'
mailTo = 'robo@helisis.com'
mailSub = 'Rsync status'
msg = ""

parser = argparse.ArgumentParser()
parser.add_argument("-n","--hosts",dest="hosts",help="enter remote host/hosts name, comma seperated",metavar="HOSTS")
parser.add_argument("-s","--src",dest="source",help="source file/directory",metavar="SOURCE")
parser.add_argument("-e","--exclude",dest="exclude",help="Exclude files/Directories, comma seperated list",metavar="EXCLUDE")

if len(sys.argv) < 7:
    print(len(sys.argv))
    parser.print_help()
    parser.exit()

args = parser.parse_args()

def sync(host,dst):
    exclude = ""
    if not os.path.exists(dst):
        os.mkdir(dst)
    if ',' in args.exclude:
        for excl in args.exclude.split(','):
            exclude = exclude + " --exclude " + excl
        cmd = "rsync -e 'ssh -o StrictHostKeyChecking=no' -auPz %s %s@%s:%s %s/"%(exclude,rsync_user,host,args.source,dst)
    else:
        cmd = "rsync -e 'ssh -o StrictHostKeyChecking=no' -auPz --exclude %s %s@%s:%s %s/"%(args.exclude,rsync_user,host,args.source,dst)
    print(cmd)
    message = cmd
    p = subprocess.Popen(cmd,shell=True)
    p.wait()
    print("DONE")
    msg = message + "rsync process completed"

mailBody = "From: %s\nTo: %s\nSubject: %s\n\n%s" %(mailFrom,mailTo,mailSub,msg)

if ',' in args.hosts:
    for host in args.hosts.split(','):
        dest = dst + "/" + host
        sync(host,dest)
else:
    dest = dst + "/" + args.hosts
    sync(args.hosts,dest)

try:
    Mail = smtplib.SMTP('mailserver.global.helisis.com', 25, 'localhost.helisis.com')
    Mail.sendmail(mailFrom,mailTo,mailBody,msg)
    print("Mail Sent to %s" %(mailTo))
except:
    print("Mail Failed")

Вывод результата на терминал из приведенного выше сценария:

$ ./log_rsync -n remote_Server -s /var/log/infoSec/ -e "null"

bind.log
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=7/9)
default.log
       12769 100%   12.18MB/s    0:00:00 (xfer#2, to-check=6/9)
general.log
        9553 100%    4.56MB/s    0:00:00 (xfer#3, to-check=5/9)
lame-servers.log
         663 100%  129.49kB/s    0:00:00 (xfer#4, to-check=4/9)
network.log
           0 100%    0.00kB/s    0:00:00 (xfer#5, to-check=3/9)
notify.log
        3286 100%  356.55kB/s    0:00:00 (xfer#6, to-check=2/9)
queries.log
         578 100%   47.04kB/s    0:00:00 (xfer#7, to-check=1/9)
query-errors.log
           0 100%    0.00kB/s    0:00:00 (xfer#8, to-check=0/9)

sent 176 bytes  received 4303 bytes  814.36 bytes/sec
total size is 26849  speedup is 5.99
DONE
Mail Sent to robo@helisis.com

Почтовая служба работает нормально, однако переменная msg, которая содержит сообщение msg = message + "rsync process completed" не получается отправить остальное электронное письмо с темой работает, проблема, кажется, с msg часть, которая не вызывается или открывается неправильно.

просто альтернативный способ!

Хотя я применяю метод ниже, где я включил To адрес, Subject и Сообщение, т.е. Rsync Process Completed Successfully., который работает и отправляет электронную почту, но реальный вопрос снова остается тем же, если я хочу включить msg или сказать хотите раскрыть msg рИскусство здесь, как это могло быть сделано!

EmailSender="robo@localhost.helisis.com"
EmailReceiver="robo@helisis.com"

msgBody='''From: dnsmailer <netrobo@helisis.com>
To: To Person <robo@helisis.com>
Subject: rsync Status from  infra-syslog

Rsync Process Completed Succesfully.
'''

if ',' in args.hosts:
    for host in args.hosts.split(','):
        dest = dst + "/" + host
        sync(host,dest)
else:
    dest = dst + "/" + args.hosts
    sync(args.hosts,dest)

try:
    smtpobj=smtplib.SMTP('mailserver.global.helisis.com', 25, 'localhost.helisis.com')
    smtpobj.sendmail(EmailSender,EmailReceiver,msgBody)
except Exception as e:
    print(e)

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Проблема в том, что msg вычисляется внутри функции sync (которую можно вызывать в цикле), а затем просто забывает (то есть не хранится).

Так что, если вы хотите использовать его в своем теле письма, оно больше не доступно. Вы должны использовать его, когда он доступен, и напрямую размещать тело письма, или лучше хранить его в списке, а затем использовать его для построения тела письма. Код может стать:

...
def sync(host,dst):
    ...
    message = cmd
    p = subprocess.Popen(cmd,shell=True)
    p.wait()
    print("DONE")
    return message + " rsync process completed"  # returns the msg to the caller

msglist = []             # a list to store the messages for the mail body

if ',' in args.hosts:
    for host in args.hosts.split(','):
        dest = dst + "/" + host
        msglist.append(sync(host,dest))
else:
    dest = dst + "/" + args.hosts
    msglist.append(sync(args.hosts,dest))

msg = "\n".join(msglist)                 # combine all messages, one per line
mailBody = "From: %s\nTo: %s\nSubject: %s\n\n%s" %(mailFrom,mailTo,mailSub,msg)

try:
    Mail = smtplib.SMTP('mailserver.global.helisis.com', 25, 'localhost.helisis.com')
    Mail.sendmail(mailFrom,mailTo,mailBody,msg)
    print("Mail Sent to %s" %(mailTo))
    Mail.bye()                  # cleaner to say goodbye to server...
    Mail.close()
except:
    print("Mail Failed")
0 голосов
/ 18 сентября 2018

Просто позволю себе разместить здесь часть электронной почты, которая работала для меня как smtplib, выдавая некоторые ошибки, которые я применял ранее, ниже - рабочая часть электронной почты, может быть, кто-то будет искать то же самое :-)

Большое спасибо @Serge и @Vijay, помогающим в этом ..

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


email_sender = "syslogger@helisis.com"
email_receiver = "robo@helisis.com, robo01@helisis.com, robo02@helisis.com"


try:
    Mail = smtplib.SMTP('mailserver.global.helisis.com', 25, 'localhost.helisis.com')
    mail_obj = MIMEMultipart('alternative')
    mail_obj["From"] = email_sender
    mail_obj["To"] = email_receiver
    mail_obj["Cc"] = "someone@helisis.com"
    mail_obj["Subject"] = "rsync Status from  infra-syslog."
    mail_obj.preamble = "rsync Status from  infra-syslog. "
    msgBody = "Rsync Process Completed Successfully!"  # Message body
    mail_obj.attach(MIMEText(msg, 'plain'))
    Mail.sendmail(from_addr=[email_sender], to_addrs=[email_receiver],msg=mail_obj.as_string())
    print("Mail Sent to %s" % (email_sender))
except Exception as error:
    print("Mail Failed - {}".format(error))
0 голосов
/ 17 сентября 2018

Не могли бы вы попробовать отправить сообщение с помощью MIMEMultipart.Я должен работать таким образом.

import smtplib
from email.mime.multipart import MIMEMultipart

EmailSender = "robo@localhost.helisis.com"
EmailReceiver = "robo@helisis.com"

msgBody = '''From: dnsmailer <netrobo@helisis.com>
To: To Person <robo@helisis.com>
Subject: rsync Status from  infra-syslog

Rsync Process Completed Succesfully.
'''

try:
    Mail = smtplib.SMTP('mailserver.global.helisis.com', 25, 'localhost.helisis.com')
    mail_obj = MIMEMultipart()
    mail_obj["From"] = EmailSender
    mail_obj["To"] = EmailReceiver
    mail_obj["Subject"] = "rsync Status from  infra-syslog."
    mail_obj.preamble = "rsync Status from  infra-syslog. "
    msgBody = "Rsync Process Completed Successfully!"  # Message body
    mail_obj.attach(MIMEText(message, 'plain'))
    Mail.sendmail(from_addr=[EmailSender], to_addrs=[EmailReceiver], msg=mail_obj.as_string())
    print("Mail Sent to %s" % (EmailReceiver))
except Exception as error:
    print("Mail Failed - {}".format(error))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...