如何借助subprocess调用mailx向Python用户列表发送邮件?
用subprocess调用mailx向Python邮箱列表批量发送邮件
原代码可实现向指定单个/多个邮箱发送邮件,现有邮箱列表users=['email1@email.com', 'email2@email.com', 'email3@email.com', 'email4@email.com'],可通过以下两种方式修改代码实现批量发送:
方式一:兼容原写法(使用shell=True)
将邮箱列表转换为空格分隔的字符串,直接拼入mailx命令中:
import subprocess msg = "My text message" users = ['email1@email.com', 'email2@email.com', 'email3@email.com', 'email4@email.com'] # 把邮箱列表转为mailx可识别的空格分隔格式,每个邮箱用单引号包裹避免特殊字符干扰 recipient_str = ' '.join(f"'{u}'" for u in users) cmd = f"mailx -s 'Subject: Hive Alert' {recipient_str} < /dev/stdin" p1 = subprocess.run(["echo", msg], stdout=subprocess.PIPE) subprocess.run(cmd, stdout=subprocess.PIPE, input=p1.stdout, shell=True)
方式二:更安全的写法(不使用shell=True)
避免启用shell环境,将命令拆分为参数列表传递,杜绝命令注入风险,同时省去echo调用,直接传递消息内容:
import subprocess msg = "My text message" users = ['email1@email.com', 'email2@email.com', 'email3@email.com', 'email4@email.com'] # 构造命令参数:mailx命令、主题选项、所有收件人邮箱 cmd_args = ["mailx", "-s", "Subject: Hive Alert"] + users # 将消息内容编码后通过stdin传入,check=True会在命令执行失败时抛出异常 subprocess.run(cmd_args, stdout=subprocess.PIPE, input=msg.encode(), check=True)
注:方式二更推荐,因为
shell=True存在安全隐患,若邮箱列表中包含特殊字符(如空格、引号),可能导致命令执行异常或注入风险。
内容的提问来源于stack exchange,提问作者Ferari
相关产品推荐
相关产品推荐

