python3 通过excel发送邮件报错解决办法

使用Python3批量通过Excel发送邮件时遇到AttributeError:'NoneType' object has no attribute 'strip'的报错。经过分析,发现是Excel文件存在空行导致。解决方法是检查并删除多余的空行,通过ws.max_row获取最大行号确认空行位置,删除后保存文件,再次运行程序即可避免报错。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间使用python批量发邮件,通过excel获取收件人信息,结果发完后报错如下:

Traceback (most recent call last):

  File "D:\python practice\发送邮件  带附件.py", line 46, in <module>
    smtpObj.sendmail(sender, receivers, message.as_string())
  File "C:\Users\lenovo\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 871, in sendmail
    (code, resp) = self.rcpt(each, rcpt_options)
  File "C:\Users\lenovo\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 541, in rcpt
    self.putcmd("rcpt", "TO:%s%s" % (quoteaddr(recip), optionlist))
  File "C:\Users\lenovo\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 153, in quoteaddr
    if addrstring.strip().startswith('<'):

AttributeError: 'NoneType' object has no attribute 'strip'

当时百思不得其解啊,为什么发完了报错......

今天终于静下心来看了一下错误内容, NoneType object, 空类型对象,是不是表示什么都没有啊?

难道是excel多出来了空行?

于是用ws.max_row获取了一下最大行号,果然比邮件联系人行多很多

选中那些空行,删除整行,点击保存(必须点击保存啊)

再次运行程序,没有报错。

至此,问题解决~

使用excel的时候得养成一个好习惯,删除内容的时候,直接删除整行,不留下操作过的空行,否则各种程序极易认为那不是空行。

<think>嗯,用户想用Kettle处理Excel订单信息,涉及过滤、写日志和发邮件通知。首先我需要回忆Kettle的基本操作步骤,比如如何连接Excel、过滤数据、写日志、条件判断发邮件,还有异常处理。 用户提到的步骤包括:从Excel读取订单数据,过滤“未处理”状态的订单,结果写入日志,根据金额发不同级别的邮件,还要捕获异常发报警邮件。需要逐步拆解每个环节怎么做。 首先,输入阶段,用户用的是Excel文件,所以需要用“Excel输入”步骤。要确认Excel的路径、工作表名称以及字段是否正确解析。可能需要设置字段类型,比如订单号是字符串,金额是数值,状态是字符串。 然后过滤“未处理”状态的订单,应该用“过滤记录”步骤。这里要注意条件的设置,比如“status”字段等于“未处理”。可能需要用正则表达式或者简单的等于判断。 接下来写日志,可以用“写日志”步骤,或者将数据输出到文本文件。如果用户需要持久化存储,可能需要使用“文本文件输出”步骤,定义好输出文件的路径和格式。 然后是根据金额发送不同级别的邮件。这里可能需要用“Switch / Case”步骤,根据金额范围分派到不同的邮件发送步骤。比如普通、重要、紧急三个级别,每个级别对应不同的邮件内容和收件人。需要配置SMTP服务器信息,以及邮件的内容模板。 异常处理的话,整个转换需要启用错误处理,将错误信息捕获后通过邮件发送。可能需要使用“捕获异常”步骤,或者设置每个步骤的错误处理钩子,将错误信息传递给“发送邮件”步骤。 另外,用户提到的引用中有关于表输入输出的内容,可能和数据库连接有关,但这里处理的是Excel和文件,所以可能不需要用到数据库连接,除非日志要写入数据库。不过用户要求写日志文件,所以用文本文件输出更合适。 需要注意的点:Kettle的转换和作业的区别。转换是数据处理流程,作业可以包含多个转换和定时任务。这里应该创建一个转换,包含所有步骤。作业可能用于调度整个流程,比如定时执行。 步骤之间的连接线要正确,比如Excel输入连接到过滤记录,过滤后的数据连接到写日志,然后分支到Switch根据金额发送邮件。同时,整个流程的错误处理需要连接到发送报警邮件的步骤。 可能还需要使用“获取系统信息”来获取时间戳,或者“生成随机数”来生成日志文件名,但用户没有特别要求,可能不需要。 测试时,需要准备一个测试Excel文件,包含不同状态和金额的订单,确保过滤正确,日志写入正确,邮件按条件发送。异常情况比如Excel文件不存在,或者字段格式错误,是否能被捕获并发送邮件报警。 还需要注意Kettle的版本是否支持某些步骤,比如发送邮件可能需要配置SMTP服务器的认证信息,包括用户名、密码、主机名和端口。另外,邮件的内容可能需要动态生成,比如包含订单号、金额等信息,这需要用到字段值替换。 总结下来,步骤大概是: 1. Excel输入读取数据。 2. 过滤记录,保留状态为“未处理”的订单。 3. 写日志文件,记录处理后的数据。 4. 使用Switch根据金额判断级别,发送不同邮件。 5. 整体异常捕获,发送报警邮件。 每个步骤的具体配置可能需要详细说明,比如Excel输入的字段设置,过滤条件表达式,日志输出的格式和路径,Switch的条件设置,邮件步骤的配置等。同时,确保所有步骤之间的跳转正确,特别是错误处理的连接。</think>### 使用Kettle实现Excel订单信息处理的详细步骤 #### 一、环境准备 1. 安装Kettle(Pentaho Data Integration)并创建数据库连接(若需要操作数据库)[^2] 2. 准备Excel文件,字段建议包含:`订单号、金额、状态、客户邮箱`等 #### 二、核心流程构建 ```mermaid graph TD A[Excel输入] --> B[过滤记录] B --> C[写日志文件] B --> D[Switch/Case] D -->|金额<1000| E[发送普通邮件] D -->|1000≤金额<5000| F[发送重要邮件] D -->|金额≥5000| G[发送紧急邮件] B --> H[捕获异常] H --> I[发送报警邮件] ``` #### 三、分步实施 **1. Excel输入配置** - 新建转换 → 拖入`Excel输入`组件 - 设置文件路径 → 指定工作表 → 获取字段(点击"获取头部字段") - 验证字段类型:金额应为`Number`,状态应为`String` **2. 过滤未处理订单** - 添加`过滤记录`组件,设置条件: ```sql status = &#39;未处理&#39; -- 注意字段名称需与Excel列名一致 ``` - 使用正则表达式匹配器或简单判断[^4] **3. 日志文件写入** - 使用`文本文件输出`组件 - 设置日志路径(如:`/logs/order_${system_date}.log`) - 定义字段格式与分隔符(建议TSV格式) **4. 邮件分级通知** ```python # Switch/Case条件设置(金额字段为amount) if amount < 1000 → 普通邮件通道 elif 1000 ≤ amount < 5000 → 重要邮件通道 else → 紧急邮件通道 ``` - 每个通道配置独立的`发送邮件`组件 - 邮件模板示例(使用变量替换): ```text 主题:${邮件级别}订单通知 - ${订单号} 内容: 客户您好, 您的订单(${订单号})金额为${金额},已被标记为${邮件级别}级别。 ``` **5. 异常处理机制** - 在转换属性中启用`错误处理` - 添加`捕获异常`组件连接所有步骤 - 配置报警邮件组件: ```sql 主题:订单处理异常报警 内容:错误时间 ${system_datetime} 错误信息:${error_message} 堆栈跟踪:${error_stack} ``` #### 四、调试与优化 1. 使用`预览数据`功能验证每个步骤的输出 2. 测试边界值:空文件、异常数据格式、网络中断等场景 3. 性能优化建议: - 在Excel输入步骤设置合理的数据分块大小 - 对金额字段建立索引(若连接数据库)[^1] - 使用`线程数`配置并行处理 #### 五、部署运行 1. 保存转换文件(.ktr) 2. 通过命令行或调度工具定时执行: ```bash pan.sh -file=/path/to/order_process.ktr ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值