首页 › 论坛 › 置顶 › Python基础邮件自动化
-
作者帖子
-
2025-10-13 10:21 #26725Q QPY课程团队管理员
邮件自动化是一个Python脚本,通常被称为“邮件合并生成器”,但我更喜欢称其为邮件自动化,所以在文章中我将使用这个名称。
这篇文章非常适合初学者,我们将做的是获取我们的信件模板,并将
[name]
替换为每个名字,为每个名字创建一封新邮件。
这是我们的目录、文件夹和我们将在本文中使用的起始文件。
/Main_Folder/ ├── main.py <-- 我们在这里 ├── Input │ ├── Letters │ │ └── letter_template.txt <-- 我们需要获取这个文件 │ └── Names │ └── invited_names.txt <-- 以及这个文件 └── Output
让我们从基本逻辑开始:
1.打开
letter_template.txt
和invited_names.txt
2.读取文件
3.循环遍历
invited_names.txt
文件中的名字 a. 获取内容 b. 用name
替换[name]
c. 为每封信写入输出
现在让我们更详细地了解这些步骤。
1. 打开文件:
├── main.py <-- 我们在这里 ├── Input │ ├── Letters │ │ └── letter_template.txt <-- 我们需要获取这个文件 │ └── Names │ └── invited_names.txt <-- 还有这个文件 └── Output
# 打开 letter_template 文件 with open("Input/Letters/letter_template.txt") as letter_file:
# 打开名字文件 with open("Input/Names/invited_names.txt") as name_file:
2. 读取文件:
- 首先从
letter_template
文件开始。
我们知道读取文件时使用
read()
方法。以下是文章《》的一部分的中文翻译:
with open("Input/Letters/letter_template.txt") as letter_file: letter_content = letter_file.read()
- 接下来是名字文件:
我们不能使用read()
方法来读取名字,因为它会返回一个大字符串,而我们并不想要那样。
我们需要的是一个list
类型的名字,以便我们可以进行循环处理。
所以我们需要使用
readlines()
方法,而不是read()
方法:with open("Input/Names/invited_names.txt") as name_file: names = name_file.readlines()
如果你打印出
names
,结果将是:with open("Input/Names/invited_names.txt") as name_file: names = name_file.readlines() print(names) # ['Alicen', 'Bobn', 'Charlien', 'Dianan', 'Ethann', 'Fionan', 'Gregn', 'Hannahn']
在我们进行下一步并遍历名称之前,让我们在
main.py
的顶部创建一个constant
来表示[name]
:PLACEHOLDER = "[name]"
3. 遍历名称:
基本上,我们需要做的是获取信件内容,并用每个名称替换
PLACEHOLDER ([name])
:with open("Input/Names/invited_names.txt") as name_file: names = name_file.readlines() for name in names: new_letter = letter_content.replace(PLACEHOLDER, name)
现在如果你打印出
new_letter
,结果可能看起来有点奇怪:你好,Fiona , 我们写信正式邀请您参加我们的年度年终庆祝活动。 你好,Ethan , 我们写信正式邀请您参加我们的年度年终庆祝活动。
你看到了吗?每个名字后面都有换行,这是因为
readlines()
方法的原因。如您所见,每个名字后面都有换行符
n
,我们需要使用strip()
方法去掉它,也就是说我们需要先清理这些单词:cleaned_word = name.strip()
with open("Input/Names/invited_names.txt") as name_file: names = name_file.readlines() for name in names: cleaned_name = name.strip()
new_letter = letter_content.replace(PLACEHOLDER, cleaned_name)
4.最后一步是为每个名字打印出一封新的单独信件:
在我们的循环中,我们需要进入
Output
文件夹并在那里写入新的信件。├── main.py ├── Input │ ├── Letters │ │ └── letter_template.txt │ └── Names │ └── invited_names.txt
└── 输出 <-- 我们需要在这个文件夹内创建新的字母
为了写入文件,我们需要切换到
w
(写入)模式:with open(f"Output/ReadyToSend/letter_for_{cleaned_name}.txt", "w") as output: output.write(new_letter)
现在如果你运行你的代码,你会在
Output
文件夹中看到每个名字的新信件├── main.py ├── Input │ ├── Letters │ │ └── letter_template.txt │ └── Names │ └── invited_names.txt ├── Output ├── ReadyToSend └── letter_for_Alice.txt └── letter_for_Bob.txt └── letter_for_Charlie.txt └── 以及其他
这是完整的代码片段:
PLACEHOLDER = "[name]"
with open("Input/Letters/letter_template.txt") as letter_file: letter_content = letter_file.read() with open("Input/Names/invited_names.txt") as name_file: names = name_file.readlines() for name in names: cleaned_name = name.strip()
在这段代码中,首先使用 `with open(“Input/Letters/letter_template.txt”) as letter_file:` 语句打开一个名为 `letter_template.txt` 的文件,并将其内容读取到 `letter_content` 变量中。接着,使用 `with open(“Input/Names/invited_names.txt”) as name_file:` 语句打开另一个名为 `invited_names.txt` 的文件,并将文件中的每一行读取到 `names` 列表中。然后,通过 `for name in names:` 循环遍历 `names` 列表中的每个名字,并使用 `strip()` 方法去除名字前后的空白字符,结果存储在 `cleaned_name` 变量中。
new_letter = letter_content.replace(PLACEHOLDER, cleaned_name) with open(f"Output/ReadyToSend/letter_for_{cleaned_name}.txt", "w") as output: output.write(new_letter)
注意:
我们也可以像这样将读取步骤合并:
# 将两个文件的读取合并为一个块 with open("Input/Letters/letter_template.txt") as letter_file, open("Input/Names/invited_names.txt") as name_file: letter_content = letter_file.read() names = name_file.readlines()
with open("Input/Letters/letter_template.txt") as letter_file, open("Input/Names/invited_names.txt") as name_file:
letter_content = letter_file.read() names = name_file.readlines() for name in names: cleaned_name = name.strip() new_letter = letter_content.replace(PLACEHOLDER, cleaned_name) with open(f"Output/ReadyToSend/letter_for_{cleaned_name}.txt", "w") as output:
output.write(new_letter)
- 首先从
-
作者帖子
- 哎呀,回复话题必需登录。