如何验证pysftp的SFTP连接与文件上传是否成功?
SFTP连接校验、上传确认与失败邮件通知实现
实现步骤与代码
1. 导入依赖并配置参数
先导入所需库,再把SFTP和邮件的配置参数统一整理,方便后续修改:
import pysftp import smtplib from email.mime.text import MIMEText from email.header import Header # SFTP相关配置 SFTP_HOST = 'hostname' SFTP_USER = 'me' SFTP_PWD = 'secret' REMOTE_DIR = '/allcode' LOCAL_FILE = '/pycode/filename' # 邮件通知配置 SMTP_SERVER = 'smtp.example.com' # 比如QQ邮箱填smtp.qq.com,网易邮箱填smtp.163.com SMTP_PORT = 587 # 普通端口用587,SSL加密端口一般用465 SMTP_SENDER = 'your_email@example.com' SMTP_PWD = 'your_email_auth_code' # 注意填邮箱授权码,不是登录密码 ALERT_EMAIL = 'your_alert_email@example.com'
2. 编写邮件发送函数
单独写一个函数处理邮件发送逻辑,异常时直接调用即可:
def send_alert_email(error_detail): """发送SFTP操作失败的通知邮件""" email_content = f"SFTP操作出现异常,具体错误信息:\n{error_detail}" msg = MIMEText(email_content, 'plain', 'utf-8') msg['Subject'] = Header('SFTP操作失败通知', 'utf-8') msg['From'] = SMTP_SENDER msg['To'] = ALERT_EMAIL try: # 根据邮箱服务商选择SMTP或SMTP_SSL with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server: server.starttls() # 启用TLS加密,用SSL的话直接替换为smtplib.SMTP_SSL server.login(SMTP_SENDER, SMTP_PWD) server.sendmail(SMTP_SENDER, ALERT_EMAIL, msg.as_string()) except Exception as e: print(f"通知邮件发送失败:{str(e)}")
3. SFTP主操作逻辑
用try-except包裹整个SFTP操作流程,精准捕获连接、上传阶段的异常,同时做上传后的双重校验:
def run_sftp_task(): try: # 能进入with块说明SFTP连接成功 with pysftp.Connection(SFTP_HOST, username=SFTP_USER, password=SFTP_PWD) as sftp: print("SFTP服务器连接成功") # 切换到目标远程目录 sftp.cd(REMOTE_DIR) # 上传本地文件 sftp.put(LOCAL_FILE) print("文件上传完成") # 可选:验证远程文件是否存在,确保上传真的成功 remote_file_name = LOCAL_FILE.split('/')[-1] if sftp.exists(remote_file_name): print("远程文件已存在,上传验证通过") else: raise Exception("文件上传后,远程目录未找到该文件") # 捕获特定的连接异常 except pysftp.AuthenticationException: err_msg = "SFTP连接失败:用户名或密码错误" print(err_msg) send_alert_email(err_msg) except pysftp.ConnectionException: err_msg = f"SFTP连接失败:无法连接到主机 {SFTP_HOST}" print(err_msg) send_alert_email(err_msg) # 捕获其他所有异常 except Exception as e: err_msg = f"SFTP操作失败:{str(e)}" print(err_msg) send_alert_email(err_msg) if __name__ == "__main__": run_sftp_task()
关键说明
- 连接成功判断:只要能进入
pysftp.Connection的with块且未抛出异常,就说明连接成功;若连接失败(主机不可达、认证错误等),会直接抛出对应异常。 - 上传成功判断:
sftp.put方法在上传失败时会直接抛出异常,额外用sftp.exists检查远程文件是否存在,能双重确认上传结果。 - 邮件通知:所有异常场景都会触发邮件发送,把错误详情告知指定邮箱,同时控制台也会打印错误信息方便排查。
内容的提问来源于stack exchange,提问作者SkyeBoniwell
相关产品推荐
相关产品推荐

