Python邮件发送:动态内容嵌入与F-string实践指南


Python邮件发送:动态内容嵌入与F-string实践指南

本文详细介绍了如何在python中通过电子邮件发送动态内容,重点讲解了使用f-string(格式化字符串字面量)高效地将变量值嵌入到邮件正文中的方法。教程涵盖了smtp邮件发送的基本流程,并提供了完整的代码示例,指导读者构建一个能够根据用户输入动态生成邮件内容的应用程序,同时强调了邮件发送过程中的关键注意事项和最佳实践。

在Python编程中,通过电子邮件发送动态生成的信息是一项常见需求,例如发送报告、通知或用户输入的数据。然而,初学者在尝试将变量的值直接嵌入到字符串(如邮件正文)时,常会遇到只发送变量名而非其内容的困惑。本教程将深入探讨如何利用Python的字符串格式化机制,特别是F-string,来解决这一问题,并提供一个完整的邮件发送示例。

核心问题:字符串中的变量引用

在Python中,当你定义一个多行字符串时,如果直接在其中写入变量名,Python会将其视为普通文本而不是变量的引用。例如:

first_element = "测试数据1"
email_body = """
[
  {
    production1: first_element
  }
]
"""
print(email_body)

上述代码的输出将是 production1: first_element,而不是 production1: 测试数据1。这是因为字符串字面量不会自动解析内部的变量。为了将变量的实际值嵌入到字符串中,我们需要使用特定的字符串格式化方法。

解决方案:使用F-string进行字符串格式化

Python 3.6及更高版本引入的F-string(格式化字符串字面量)是处理字符串中动态内容嵌入的最简洁、最推荐的方式。F-string允许你在字符串前加上 f 或 F,然后在字符串内部使用花括号 {} 包裹变量名或表达式,Python会在运行时自动将其替换为相应的值。

立即学习“Python免费学习笔记(深入)”;

F-string基本用法

name = "Alice"
age = 30
message = f"你好,{name}!你今年{age}岁了。"
print(message)
# 输出: 你好,Alice!你今年30岁了。

F-string不仅可以嵌入变量,还可以嵌入任意有效的Python表达式:

x = 10
y = 5
result = f"10 + 5 的结果是 {x + y}。"
print(result)
# 输出: 10 + 5 的结果是 15。

构建动态邮件发送程序

现在,我们将结合F-string和Python的 smtplib 模块来创建一个能够发送包含动态内容的电子邮件程序。

1. 导入所需模块

我们需要 email.message 来构建邮件对象,smtplib 来发送邮件,以及 sys 和 os 来处理程序重启(如果需要)。

import email.message
import smtplib
import sys
import os

2. 定义程序重启函数 (可选)

为了方便测试或实现循环输入,可以定义一个重启当前程序的函数。

def restart_program():
    """重启当前Python脚本。"""
    python = sys.executable
    os.execl(python, python, *sys.argv)

3. 获取用户输入

程序需要从用户那里获取动态数据,这些数据将被嵌入到邮件正文中。

print('请输入第一个元素:')
first_element = input()
print('请输入第二个元素:')
second_element = input()
print('请输入结果:')
result = input()

4. 定义邮件发送函数

这是核心部分,我们将在这里使用F-string构建邮件正文。

def send_email(first_element_val, second_element_val, result_val):
    """
    发送包含动态内容的电子邮件。

    参数:
    first_element_val (str): 第一个动态元素的值。
    second_element_val (str): 第二个动态元素的值。
    result_val (str): 结果元素的值。
    """
    # 使用F-string构建邮件正文
    email_body = f"""
[
  {{
    "production1": "{first_element_val}",
    "production2": "{second_element_val}",
    "result": "{result_val}"
  }}
]
"""
    # 邮件发送配置
    from_addr = '你的发件邮箱@gmail.com'  # 替换为你的发件邮箱
    to_addr = '收件人邮箱@example.com'    # 替换为收件人邮箱
    password = '你的应用密码'            # 替换为你的Gmail应用密码 (非账户密码)

    # 创建邮件消息对象
    msg = email.message.Message()
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Subject'] = '动态数据报告'
    msg.set_payload(email_body) # 默认发送纯文本

    # 如果需要发送HTML内容,可以这样设置:
    # msg.add_header('Content-Type', 'text/html')
    # msg.set_payload(f"<html><body><p>生产1: {first_element_val}</p>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/ai/895">
                            <img src="https://img.php.cn/upload/ai_manual/000/000/000/175679995460121.png" alt="晓象AI资讯阅读神器">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/895">晓象AI资讯阅读神器</a>
                            <p>晓象-AI时代的资讯阅读神器</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="晓象AI资讯阅读神器">
                                <span>72</span>
                            </div>
                        </div>
                        <a href="/ai/895" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="晓象AI资讯阅读神器">
                        </a>
                    </div>
                <p>生产2: {second_element_val}</p><p>结果: {result_val}</p></body></html>")


    # 连接SMTP服务器并发送邮件
    try:
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.starttls()  # 启用TLS加密
        server.login(from_addr, password)
        server.sendmail(from_addr, to_addr, msg.as_string())
        server.quit()
        print('邮件发送成功!')
    except smtplib.SMTPAuthenticationError:
        print('邮件发送失败: 认证错误。请检查发件邮箱、密码和应用密码设置。')
    except smtplib.SMTPConnectError:
        print('邮件发送失败: 连接SMTP服务器失败。请检查网络连接或SMTP服务器地址。')
    except Exception as e:
        print(f'邮件发送失败: 发生未知错误 - {e}')

注意:

  • 在F-string中,如果你的字符串本身包含花括号 {},你需要使用双花括号 {{ 或 }} 来进行转义,以避免与F-string的变量占位符冲突。例如,在上述JSON格式的字符串中,"production1": "{first_element_val}" 外层的 { 和 } 是JSON结构的一部分,而内层的 {first_element_val} 则是F-string的占位符。
  • password 应该是一个应用密码,而不是你的Gmail账户密码。为了安全起见,强烈建议不要在代码中硬编码密码。更好的做法是将其存储在环境变量中,并通过 os.environ.get('EMAIL_PASSWORD') 获取。

5. 主程序逻辑

将上述部分整合到主程序流程中。

# 打印确认信息
print("是否正确?")
print(f"{first_element} + {second_element} = {result}")
print('确认 (yes/no):')
confirm = input()

if confirm.lower() == "yes":
    print("正在发送邮件...")
    send_email(first_element, second_element, result) # 调用发送邮件函数,传入变量值
    restart_program()
else:
    print("请重试。")
    restart_program()

完整示例代码

import email.message
import smtplib
import sys
import os

# --- 配置部分 ---
# 强烈建议使用环境变量管理敏感信息,例如:
# from_addr = os.environ.get('EMAIL_USER')
# password = os.environ.get('EMAIL_PASSWORD')
# to_addr = os.environ.get('RECIPIENT_EMAIL')
# 以下为示例,请替换为你的实际信息或使用环境变量
FROM_ADDR = 'your_email@gmail.com'
APP_PASSWORD = 'your_gmail_app_password' # 获取方式请参考Gmail帮助文档
TO_ADDR = 'recipient_email@example.com'
SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587
# --- 配置部分结束 ---

def restart_program():
    """重启当前Python脚本。"""
    python = sys.executable
    os.execl(python, python, *sys.argv)

def send_email(first_element_val, second_element_val, result_val):
    """
    发送包含动态内容的电子邮件。
    """
    # 使用F-string构建邮件正文 (JSON格式)
    email_body = f"""
[
  {{
    "production1": "{first_element_val}",
    "production2": "{second_element_val}",
    "result": "{result_val}"
  }}
]
"""
    msg = email.message.Message()
    msg['From'] = FROM_ADDR
    msg['To'] = TO_ADDR
    msg['Subject'] = '动态数据报告'
    msg.set_payload(email_body)

    try:
        server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
        server.starttls()  # 启用TLS加密
        server.login(FROM_ADDR, APP_PASSWORD)
        server.sendmail(FROM_ADDR, TO_ADDR, msg.as_string())
        server.quit()
        print('邮件发送成功!')
    except smtplib.SMTPAuthenticationError:
        print('邮件发送失败: 认证错误。请检查发件邮箱、应用密码和Gmail设置(如“两步验证”和“应用密码”)。')
    except smtplib.SMTPConnectError:
        print('邮件发送失败: 连接SMTP服务器失败。请检查网络连接或SMTP服务器地址/端口。')
    except Exception as e:
        print(f'邮件发送失败: 发生未知错误 - {e}')

if __name__ == "__main__":
    print('请输入第一个元素:')
    first_element = input()
    print('请输入第二个元素:')
    second_element = input()
    print('请输入结果:')
    result = input()

    print("\n请确认输入的数据:")
    print(f"第一个元素: {first_element}")
    print(f"第二个元素: {second_element}")
    print(f"结果: {result}")
    print('是否正确? (输入 "yes" 确认发送邮件,其他任意键重试)')
    confirm = input().strip().lower()

    if confirm == "yes":
        print("\n正在发送邮件...")
        send_email(first_element, second_element, result)
        restart_program() # 发送后重启程序
    else:
        print("\n输入未确认,程序将重试。")
        restart_program() # 重启程序以便重新输入

注意事项与最佳实践

  1. 安全性:

    • 不要硬编码密码:将敏感信息(如发件邮箱和密码)存储在环境变量中,或者使用配置文件(如 .env 文件配合 python-dotenv 库)进行管理。
    • 使用应用密码:对于Gmail等服务,当开启了两步验证后,需要生成一个“应用专用密码”来用于程序登录,而不是你的账户主密码。
    • 避免在公共代码库中暴露凭据
  2. 错误处理:

    • 在 send_email 函数中添加 try-except 块来捕获 smtplib 相关的异常,例如认证失败 (SMTPAuthenticationError) 或连接问题 (SMTPConnectError),这能让程序更健壮。
  3. 邮件内容类型:

    • 默认情况下,msg.set_payload() 发送的是纯文本内容。如果你想发送HTML格式的邮件,需要设置 msg.add_header('Content-Type', 'text/html'),并在 set_payload 中传入HTML字符串。
  4. SMTP服务器配置:

    • 不同的邮件服务提供商(如Gmail, Outlook, QQ邮箱)有不同的SMTP服务器地址和端口。请确保使用正确的配置。Gmail的SMTP服务器通常是 smtp.gmail.com,端口为 587 (TLS) 或 465 (SSL)。
  5. 字符串格式化选择:

    • F-string:Python 3.6+ 的首选,简洁高效,可读性强。
    • .format() 方法:在旧版本Python中常用,功能强大,例如 "{0} {1}".format(var1, var2) 或 "{} {}".format(var1, var2)。
    • % 操作符:类似C语言的 printf 风格,在现代Python中不推荐用于新代码,但可能在旧代码中见到,例如 "%s %d" % (string_var, int_var)。

总结

通过本教程,我们学习了如何利用Python的F-string功能,将动态变量值高效且清晰地嵌入到字符串中,从而解决了在邮件正文中发送变量而非其名称的问题。结合 smtplib 模块,我们构建了一个完整的Python邮件发送程序,能够根据用户输入生成个性化的邮件内容。在实际应用中,务必关注安全性、错误处理和正确的SMTP配置,以确保邮件发送功能的稳定与可靠。

以上就是Python邮件发送:动态内容嵌入与F-string实践指南的详细内容,更多请关注其它相关文章!


# 宜昌百度推广网站有哪些  # 第一个  # 第二个  # 文档  # 电子邮件  # 将其  # 请检查  # 黄冈外包网站推广哪里好  # 滨州营销型网站建设费用  # 发送邮件  # wix seo  # 推广小游戏试玩网站  # 网红的推广网站有哪些呢  # 建设网站建设网站  # 新河本地网站建设  # 关键词怎么补单都没排名  # 沧州献县网站页面优化  # qq  # python  # html  # js  # json  # c语言  # 编码  # app  # 端口  # word  # ssl  # ai  # 环境变量  # outloo  # 邮件发送  # 重启  # 请输入 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 在J*a中如何实现在线问答与评分系统_问答评分项目开发方法说明  Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置  如何在mysql中设计餐饮点餐系统_mysql点餐系统项目实战  画质怪兽120帧安卓和平精英免费版  小红书如何引流到私信?引流到私信有用吗?  b站如何管理订阅_b站订阅标签分类管理  外媒评《燕云十六声》DIY载具新玩法:很像《塞尔达传说王国之泪》!  《七读免费小说》开通会员方法  Symfony路由参数转换器:实体存在性验证与错误处理策略  蜻蜓FM如何设置移动流量播放  传统曲艺莲花落的表演形式是  Yandex浏览器官方入口_Yandex搜索引擎中文版  《海豚家》注销账号方法  PHP使用DOMDocument与XPath精准追加XML元素教程  快手缓存清理方法  b站怎么查看视频的码率_b站视频码率查看方法  招商淘客入门指南  淘口令快速解析技巧  如何用mysql开发用户注册登录功能_mysql用户注册登录数据库设计  MySQL多重关联查询:利用别名高效获取同一表的多个关联字段  稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口  CSS布局中意外顶部空白的调试与解决:深入理解padding-top  发博客与长微博技巧  使用VS Code作为你的个人知识管理系统  Yandex无需登录畅游 俄罗斯搜索引擎最新官网指南  《小宇宙》标记不友善评论方法  《糖豆》添加舞曲方法  PHP中实现JSON数据数组分页的教程  偃武诸葛亮阵容搭配推荐  晨报|开发商暗示《空洞骑士:丝之歌》DLC开发中 《合金装备4》有望重制  告别繁琐SEO!如何使用SyliusSitemap插件自动化生成网站地图,提升搜索引擎排名  泰拉瑞亚水晶无法放置问题  PHP中动态类名访问的类实例类型提示与静态分析实践  胃动力不足?试试这5个调理方法  VS Code源代码管理(SCM)视图的进阶使用技巧  电脑从睡眠中被自动唤醒怎么办_Windows唤醒源事件查看与禁用【解决】  厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项  Mac hosts文件在哪里_Mac修改hosts文件详细教程  mysql怎么查询数据_mysql基础查询语句使用教程  NumPy 高性能技巧:基于多列条件查找最近邻行索引的向量化实现  如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?  QQ网站入口直接登录 QQ官方正版登录页面  Python实战:高效处理实时数据流中的最小/最大值  mail.qq.com登录入口 QQ邮箱网页版直达  Go语言中方法接收器的选择:值类型还是指针类型?  4399小游戏下装链接 4399小游戏下载链接入口  微信注销后银行卡解绑了吗_微信注销后银行卡解绑状态  解决Pandas DataFrame高度碎片化警告:高效创建多列的策略  小米倒班助手添加日历提醒 

 2025-12-13

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.