在我的公司,我们有一个天平,可以检查箱子的重量,然后把它们装进卡车。在该箱包含的产品或多或少超出可接受的情况下,该箱被拒绝并交付到另一个传送带。电子天平记录着操作的性能。文件存储在刻度盘中,并从附近的桌面计算机使用ftp访问。我的老板希望这些报告自动发到他的账户上,这样他就不需要去那个机构检查前一天的拒绝情况了。为了做到这一点,我开始用Python编写一个程序,但被塞进了关于从文件夹中检索文件的部分。这是我的代码:
#This program tries to retrieve the latest report and send it by email.
import urllib
import shutil
import ftplib
import os
import sys
import glob
import time
import datetime
import smtplib
import email
#Define the server and folder where the reports are stored.
carpetaftp = "/reports/"
#This function looks for the last file in the folder.
def obtenerultimoarchivo(camino):
for cur_path, dirnames, filenames in os.walk(camino):
for filename in filenames:
datos_archivo = os.stat(filename)
tiempo_archivo = datos_archivo.st_mtime
#Connects to an ftp folder and downloads the last report.
def descargareporteftp(carpetaftp):
ftp = ftplib.FTP("server.scale.com")
ftp.login()
ftp.cwd(carpetaftp)
#Uses 'ultimoreporte.pdf' as a copy of the last report.
archivo = open('C:\\Balanza\\Reportes\\ultimoreporte.pdf',"wb")
ftp.retrbinary("RETR " + obtenerultimoarchivo(),archivo.write)
archivo.close()
return archivo
#The function enviaemail() sends an email with an attachment.
def enviaemail(destinatario, adjunto):
remitente = "electronic_scale@email.com.uy"
msg = email.MIMEMultipart()
msg['From'] = remitente
msg['To'] = destinatario
msg['Subject'] = "Ultimo informe de la balanza."
adjunto = open('C:\\Balanza\\Reportes\\ultimoreporte.pdf', 'rb')
attach = email.MIMENonMultipart('application', 'pdf')
payload = base64.b64encode(adjunto.read()).decode('ascii')
attach.set_payload(payload)
attach['Content-Transfer-Encoding'] = 'base64'
adjunto.close()
attach.add_header('Content-Disposition', 'attachment', filename = 'ultimoreporte.pdf')
msg.attach(attach)
server = smtplib.SMTP('smtp.email.com.uy')
server.login('electronic_scale@email.com.uy', 'thermofischer')
server.sendmail('electronic_scale@email.com.uy',destinatario, msg.as_string())
server.quit()
#The main routine, to retrieve the last report and send it by email.
adjunto = descargareporteftp(carpetaftp)
print("Reporte descargado")
enviaemail('myemail@email.com.uy',reporte)
print("Reporte enviado")发布于 2017-12-14 06:56:27
以下是我犯了一个错误后发现的一种肮脏的方式:
如果在urllib检索命令中没有指定任何文件,它将返回目录中的文件列表(就像ls命令中的那样)。
因此,使用此方法,代码执行以下操作:
这当然不是最有效的方法,但在我的场景中有效。
参考文献:
https://stackoverflow.com/questions/15640003
复制相似问题