You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:24:25