Python基础邮件自动化

邮件自动化是一个Python脚本,通常被称为“邮件合并生成器”,但我更喜欢称其为邮件自动化,所以在文章中我将使用这个名称。

这篇文章非常适合初学者,我们将做的是获取我们的信件模板,并将[name]替换为每个名字,为每个名字创建一封新邮件。


这是我们的目录、文件夹和我们将在本文中使用的起始文件。

/Main_Folder/
├── main.py  <-- 我们在这里
├── Input
│   ├── Letters
│   │   └── letter_template.txt <-- 我们需要获取这个文件
│   └── Names
│       └── invited_names.txt <-- 以及这个文件
└── Output

让我们从基本逻辑开始:

1.打开 letter_template.txtinvited_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)

# ['Alice\n', 'Bob\n', 'Charlie\n', 'Diana\n', 'Ethan\n', 'Fiona\n', 'Greg\n', 'Hannah\n']

在我们进行下一步并遍历名称之前,让我们在 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)

更多