首页 论坛 置顶 Python基础邮件自动化

正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 作者
    帖子
  • #26725

    邮件自动化是一个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)
    
    # ['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)
正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 哎呀,回复话题必需登录。