如何在Python邮件中传递变量值?现有代码变量替换失效
解决Python邮件正文变量替换问题
问题根源
你当前代码存在三个核心问题:
- 函数名大小写不匹配:定义的是
send_email(),但调用时写的是Send_email(),这会触发NameError。 - 变量作用域问题:
send_email函数内部无法直接访问外部定义的first_element、second_element、result变量。 - 字符串格式化语法错误:你尝试的
%s写法不符合Python规范,没有完成变量绑定。
修正后的代码实现
下面是三种可行的字符串格式化方案,同时修复了函数名和作用域问题:
方案1:使用f-string(Python3.6+推荐,语法最简洁)
import email.message import os import smtplib import sys def restart_program(): python = sys.executable os.execl(python, python, * sys.argv) print('Enter the first element:') first_element = input() print('Enter the second element:') second_element = input() print('Enter the result:') result = input() def send_email(): # 使用f-string直接嵌入变量,注意大括号转义 email_body = f"""[ {{ production1: {first_element} production2: {second_element} result: {result} }} ]""" from_addr = 'CENSURED' to_addr = 'CENSURED' password = 'CENSURED' msg = email.message.Message() msg.set_payload(email_body) server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(from_addr, password) server.sendmail(from_addr, to_addr, msg.as_string()) server.quit() print("It's correct?") print(first_element) print("+") print(second_element) print("=") print(result) print('Confirm') Confirm = input() if Confirm.lower() == "yes": print("Sending Email...") send_email() # 修正函数名大小写 print('Email sent!') restart_program() else: print("Try Again") restart_program()
方案2:使用%s格式化(兼容旧版Python)
def send_email(): # 先写%s占位,再用%绑定变量元组 email_body = """[ { production1: %s production2: %s result: %s } ]""" % (first_element, second_element, result) # 后续邮件发送代码不变
方案3:使用str.format()方法
def send_email(): email_body = """[ { production1: {} production2: {} result: {} } ]""".format(first_element, second_element, result) # 后续邮件发送代码不变
额外优化建议
如果你想让函数更健壮,推荐将变量作为参数传入send_email,避免依赖全局变量:
def send_email(prod1, prod2, res): email_body = f"""[ {{ production1: {prod1} production2: {prod2} result: {res} }} ]""" # 后续邮件发送代码不变... # 调用时传入参数 send_email(first_element, second_element, result)
内容的提问来源于stack exchange,提问作者Kamer
相关产品推荐
相关产品推荐

