NAMES.DIRECTORY_PATH

本文详细介绍了NAMES.DIRECTORY_PATH参数在数据库连接配置中的使用方式,包括常用值如tnsnames、hostname等,并解释了它们如何影响客户端连接数据库的过程。
    NAMES.DIRECTORY_PATH常用的值有tnsnames,hostname,onames和ezconnect和ldap,cds,nis不常用的值,默认值是(tnsnames,onames,hostname)。
    如果设置NAMES.DIRECTORY_PATH=(tnsnames),那么客户端就只会从tnsnames.ora查找你要连接的字符串(如orcl)记录,如果tnsname.ora文件中没有此记录,则连接不上数据库。
    如果设置NAMES.DIRECTORY_PATH=(tnsnames,hostname),那么客户端首先会从tnsnames.ora查找你要连接的字符串(如orcl)记录,如果tnsname.ora文件中没有此记录,则尝试把你要连接的字符串(如orcl)当作一个主机名,通过网络的途径去解析它的ip地址然后去连接这个ip上GLOBAL_DBNAME=连接字符串(如orcl)这个实例,当然这里连接字符串(如orcl)并不是一个主机名,最后会尝试以ezconnect的方式连接数据库。
import asyncio import pandas as pd import os import math from datetime import datetime from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication import aiosmtplib def safe_path_join(base: str, *parts) -> str: """ 安全路径拼接函数,处理空单元格和数值类型 :param base: 基础路径 :param parts: 路径组件 :return: 拼接后的完整路径 """ processed = [base] for part in parts: # 处理NaN值 if pd.isna(part): continue # 处理浮点数和整数 if isinstance(part, float) and math.isnan(part): continue elif isinstance(part, float) and part.is_integer(): processed.append(str(int(part))) elif isinstance(part, (float, int)): processed.append(str(part)) # 处理字符串 elif isinstance(part, str) and part.strip(): processed.append(part) # 拼接并规范化路径 path = os.path.join(*processed) return os.path.normpath(path) async def send_email_async(to_addrs, subject, body, attachments, smtp_config): """ 异步发送邮件 :param to_addrs: 收件人列表 :param subject: 邮件主题 :param body: 邮件正文 :param attachments: 附件路径列表 :param smtp_config: SMTP服务器配置 """ msg = MIMEMultipart() msg["From"] = smtp_config['username'] msg["To"] = ", ".join(to_addrs) msg["Subject"] = subject # 添加邮件正文 msg.attach(MIMEText(body, "plain")) # 添加附件 for file_path in attachments: # 检查路径是否有效且文件存在 if file_path and os.path.exists(file_path): with open(file_path, "rb") as f: part = MIMEApplication(f.read(), Name=os.path.basename(file_path)) part['Content-Disposition'] = f'attachment; filename="{os.path.basename(file_path)}"' msg.attach(part) elif file_path: print("请检查附件是否存在,收件人地址是否正确") continue # 异步发送 try: await aiosmtplib.send( msg, hostname=smtp_config['host'], port=smtp_config['port'], username=smtp_config['username'], password=smtp_config['password'], use_tls=True ) print(f"邮件发送成功: {subject}") return True except Exception as e: print(f"邮件发送失败: {subject} | 错误: {str(e)}") return False async def process_group_async(group, date_folder, smtp_config): """ 处理分组数据并异步发送邮件 :param group: 同一分类的数据组 :param date_folder: 当前日期文件夹路径 :param smtp_config: SMTP配置 """ today = datetime.today() F = today.strftime('%Y{y}%m{m}%d{d}').format(y='年', m='月', d='日') tasks = [] for _, row in group.iterrows(): # 获取数据 customer = row.iloc[2] # 第三列:客户名称 subject = f"{row.iloc[3]} - {customer}" # 第四列:邮件主题 # 安全生成附件路径 attachments = [] for col_index in range(4, 7): # 处理第五、六、七列 filename = row.iloc[col_index] if pd.isna(filename) or not str(filename).strip(): continue # 使用安全路径拼接 file_path = safe_path_join(date_folder, filename) if file_path != date_folder: # 确保不是空路径 attachments.append(file_path) # 提取邮箱地址 to_addrs = [] for col_index in range(7, len(row)): # 从第八列开始 email = row.iloc[col_index] if isinstance(email, str) and "@" in email: to_addrs.append(email) if not to_addrs: print(f"跳过: {customer} - 无有效邮箱") continue # 生成邮件正文 body = f"您好:\n 附件为{F}当天结算数据及下一交易日交易提示,请查收!" # 创建异步任务 tasks.append( send_email_async(to_addrs, subject, body, attachments, smtp_config) ) # 并发执行当前分组的所有邮件任务 await asyncio.gather(*tasks) async def main_async(excel_path, smtp_config): """ 主异步函数 :param excel_path: Excel文件路径 :param smtp_config: SMTP服务器配置 """ # 读取Excel数据 df = pd.read_excel(excel_path, header=0) print(f"成功读取Excel数据,共{len(df)}条记录") # 预处理空值 - 将第五、六、七列的NaN转换为空字符串 for col_index in [4, 5, 6]: # 第五、六、七列 if col_index < len(df.columns): df.iloc[:, col_index] = df.iloc[:, col_index].fillna('') # 创建当前日期文件夹 today = datetime.now().strftime("%Y%m%d") date_folder = os.path.join(os.getcwd(), today) os.makedirs(date_folder, exist_ok=True) print(f"附件目录: {date_folder}") # 按第二列(类别标识符)分组 grouped = df.groupby(df.columns[1]) # 为每个分组创建异步任务 tasks = [ process_group_async(group, date_folder, smtp_config) for _, group in grouped ] # 并行执行所有分组任务 await asyncio.gather(*tasks) print("所有邮件处理完成") if __name__ == "__main__": # 配置参数(需根据实际情况修改) CONFIG = { 'excel_path': 'recipients.xlsx', # Excel文件路径 'smtp': { 'host': 'smtp.qiye.163.com', # SMTP服务器 'port': 994, # 端口号 'username': 'jhqhjsb@zjlnqh.com', 'password': 'zvfLmHbWbhwHUqwg' } } # 运行异步主程序 asyncio.run(main_async(CONFIG['excel_path'], CONFIG['smtp'])) 改进一下代码,要求检索不到指定文件名的附件就不执行该类别的邮件发送
最新发布
09-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值