2014-09-04 6 views
-3

Мне нужно выяснить, как создать скрипт, который сканирует новые файлы в каталоге, а когда есть новый, отправляет файл по электронной почте.Отправить видеофайл через python

Кто-то продолжает красть велосипеды в моем многоквартирном доме! Сначала это была моя ошибка (я должен был ее заблокировать), теперь мошенник модернизирован, режу цепочки. У меня было это после того, как мошенник украл мой второй велосипед, разрезав полудюймовый самолет.

В любом случае, используя малину pi в качестве камеры с активированной функцией движения, я хочу, чтобы она отправила мне видеофайл, как только видеопрограмма завершит его запись. Это означает, что они крадут пи.

Я рассматриваю эти примеры, но я не могу понять, как заставить скрипт работать непрерывно (каждую минуту) или как заставить его сканировать папку для нового файла.

How do I send attachments using SMTP?

OK Я получил его до сканирования, а затем пытается по электронной почте. При попытке прикрепления видеофайла он не работает. Вы можете помочь? Вот пересмотренный код:

Неудача:
тзд = MIMEMultipart() TypeError: объект 'LazyImporter' не отозваны, строка 38

import time, glob 
import smtplib 
import email.MIMEMultipart 
from email.MIMEBase import MIMEBase 
from email.MIMEText import MIMEText 
from email.Utils import COMMASPACE, formatdate 
from email import Encoders, MIMEMultipart 
import os 

#Settings: 
fromemail= "Jose Garcia <[email protected]>" 
loginname="[email protected]" 
loginpassword="somerandomepassword" 
toemail= "Jose Garcia <[email protected]>" 
SMTPserver='smtp.gmail.com' 
SMTPort=587 
fileslocation="/Users/someone/Desktop/Test/*.mp4" 
subject="Security Notification" 

def mainloop(): 
     files=glob.glob(fileslocation) #Put whatever path and file format you're using in there. 
     while 1: 
      new_files=glob.glob(fileslocation) 
      if len(new_files)>len(files): 
       for x in new_files: 
        if x in files: 
         print("New file detected "+x) 
         print("about to call send email") 
         sendMail(loginname, loginpassword, toemail, fromemail, subject, gethtmlcode(), x, SMTPserver, SMTPort) 

      files=new_files 
      time.sleep(1) 

def sendMail(login, password, to, frome, subject, text, filee, server, port): 
# assert type(to)==list 
# assert type(filee)==list 

    msg = MIMEMultipart() 
    msg['From'] = frome 
    msg['To'] = COMMASPACE.join(to) 
    msg['Date'] = formatdate(localtime=True) 
    msg['Subject'] = subject 

    msg.attach(MIMEText(text)) 

# #for filee in files: 
    part = MIMEBase('application', "octet-stream") 
    part.set_payload(open(filee,"rb").read()) 
    Encoders.encode_base64(part) 
    part.add_header('Content-Disposition', 'attachment; filename="%s"' 
         % os.path.basename(filee)) 
    msg.attach(part) 

    smtp = smtplib.SMTP(SMTPserver, SMTPort) 
    smtp.sendmail(frome, to, msg.as_string()) 
    server.set_debuglevel(1) 
    server.starttls() 
    server.ehlo() 
    server.login(login, password) 
    server.sendmail(frome, to, msg) 
    server.quit() 

def gethtmlcode(): 
    print("about to assemble html") 
    html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ' 
    html +='"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">' 
    html +='<body style="font-size:12px;font-family:Verdana"><p>A new video file has been recorded </p>' 
    html += "</body></html>" 
    return(html) 

#Execute loop 
mainloop() 
+0

лучше, но то, что делает « Это не так? Он отправляет видео [Rick Astley] (http://en.wikipedia.org/wiki/Rickrolling)? Это порождает ошибку? Что такое сообщение об ошибке? –

+0

Я пересмотрел его снова, меньше беспорядка. Код все еще не работает: «Ошибка: msg = MIMEMultipart() TypeError: объект« LazyImporter »не может быть вызван, строка 38« –

+0

Пожалуйста, покажите нам, что такое 'LazyImporter' и« строка 38 ». –

ответ

0

Просто поместите свой сценарий петлю и спать 60 секунд. Вы можете использовать glob, чтобы получить список файлов в каталоге. in очень полезен для просмотра того, что находится в списке (т. Е. Списка файлов в каталоге).

import time, glob 

files=glob.glob("/home/me/Desktop/*.mp4") #Put whatever path and file format you're using in there. 

while 1: 
    new_files=glob.glob("/home/me/Desktop/*.mp4") 
    if len(new_files)>len(files): 
     for x in new_files: 
      if x not in files: 
       print("New file: "+x) #This is where you would email it. Let me know if you need help figuring that out. 
    files=new_files 
    time.sleep(60) 
+0

Не больно делать более частые интервалы, чем 60 секунд. Он не должен сильно потреблять ваш процессор. Однажды будет более чем нормально. – Shule

+0

Я получил его для сканирования и выполнения отправителя электронной почты, но он не загружает полезную нагрузку. вы видите, чего не хватает? –

1

Я, наконец, получил его работу. Мне пришлось использовать python 2.5, чтобы избавиться от ошибки LazyImporter. Каждый раз, когда новый файл добавляется в папку безопасности, он получает по электронной почте мне. Ведение журнала нарушено.

import time, glob 
import smtplib 
from email.MIMEMultipart import MIMEMultipart 
from email.MIMEMultipart import MIMEBase 
from email.MIMEText import MIMEText 
from email.Utils import COMMASPACE, formatdate 
import datetime 
from email import Encoders 
import os 
import sys 


#Settings: 
fromemail= 'RaspberryPI Security Camera <someone>' 
loginname='[email protected]' 
loginpassword='something' 
toemail= 'Jose Garcia < [email protected]>' 
SMTPserver='smtp.gmail.com' 
SMTPort=587 
fileslocation='/Users/someone/Desktop/Test/*.*' 
subject="Security Notification" 
log='logfile.txt' 

def mainloop(): 
     files=glob.glob(fileslocation) #Put whatever path and file format you're using in there. 
     while 1: 
      f = open(log, 'w') 
      sys.stdout = Tee(sys.stdout, f) 
      new_files=glob.glob(fileslocation) 
      if len(new_files)>len(files): 
       for x in new_files: 
        if x in files: 
         print(str(datetime.datetime.now()) + "New file detected "+x) 
         sendMail(loginname, loginpassword, toemail, fromemail, subject, gettext(), x, SMTPserver, SMTPort) 
      files=new_files 
      f.close() 
      time.sleep(1) 

def sendMail(login, password, send_to, send_from, subject, text, send_file, server, port): 

    msg = MIMEMultipart() 
    msg['From'] = send_from 
    msg['To'] = COMMASPACE.join(send_to) 
    msg['Date'] = formatdate(localtime=True) 
    msg['Subject'] = subject 

    msg.attach(MIMEText(text)) 

    part = MIMEBase('application', "octet-stream") 
    part.set_payload(open(send_file,"rb").read()) 
    Encoders.encode_base64(part) 
    part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(send_file)) 
    msg.attach(part) 

    smtp = smtplib.SMTP(SMTPserver, SMTPort) 
    smtp.set_debuglevel(1) 
    smtp.ehlo() 
    smtp.starttls() 
    smtp.login(login, password) 
    smtp.sendmail(send_from, send_to, msg.as_string()) 
    smtp.close() 


def gettext(): 
    text = "A new file has been added to the security footage folder. \nTime Stamp: "+ str(datetime.datetime.now()) 
    return(text) 

class Tee(object): 
    def __init__(self, *files): 
     self.files = files 
    def write(self, obj): 
     for f in self.files: 
      f.write(obj) 


#Execute loop 
mainloop() 
1

It looks like the email module has been refactored over time. Это исправлена ​​ошибка 'LazyImporter' object not callable для меня на Python 2.7:

from email.mime.text import MIMEText 

Noteably он не был доволен (что я думал, что было) синонимами, как import email; email.mime.text.MIMEText(...)

Смежные вопросы