在小工具这个系列里记录一些我使用简易代码实现的一些小功能,方便自己在以后有需求的时候查看和调用,同时会讲解这些小功能实现实现过程,基础向,有需求或者感兴趣的朋友不妨上手试试。

涉及包及项目结构介绍

本次介绍的是使用python实现群发邮件的一个小功能,其中使用到的包及其功能如下:

  • configparser:读取配置文件
  • email:管理电子邮件消息
  • smtplib:封装了smtp协议,用于发送电子邮件
  • sys:提供对解释器使用或维护的一些变量的访问

为了方便对不同功能的更改,将不同的功能实现通过不同的模块来实现,不同的文件及其对应的功能如下:

  • user.ini:存放发件人邮箱与授权码的配置文件
  • customers.ini:存放收件人邮件列表的配置文件
  • config.py:读取配置文件的模块
  • message.py编写邮件内容的模块
  • send.py:用于发送邮件的模块

邮箱SMTP服务设置

在使用python发送邮件时,首先需要中先使用开通自己邮箱里的SMTP服务,下面我们以QQ邮箱为例,简单介绍一下开启服务的方法.

1.首先进入QQ邮箱,打开设置界面;

python脚本群发qq 如何用python群发邮件_email

2.切换到邮箱设置下的账号界面;

python脚本群发qq 如何用python群发邮件_smtplib_02

3.在以下的服务界面开启IMAP/SMTP服务,通过验证后你可以获得一个授权码,将其保存;

python脚本群发qq 如何用python群发邮件_python_03

完成以上设置之后我们就可以开始着手构建群发邮件的python项目。

配置文件准备

在这个项目中使用配置文件来存放发件人和收件人的相关信息,分开存放这样的信息的有点在于可以使得程序更加灵活。可以直接用记事本或Notepad++对构建配置文件,在输入文件信息后在保存时将文件的后缀修改为ini就好

在本次项目中使用的两份项目文件,分别是:

  • user.ini:存放发件人邮箱与授权码的配置文件
[get_user]

# 发件人邮箱与授权码

user_mail = xxxxxxxxx@qq.com

user_pwd = xxxxxxxxx
  • customer.ini:用于存放收件人邮件列表的配置文件
[get_customers]

# 存放收件人邮件

client_mail_1 = xxxxx@yahoo.com

client_mail_2 = xxxxxx@qq.com

读取配置文件

设置完配置文件后我们自然需要读取配置文件的信息来进行使用,Python的configparser模块便很好的完成了这项功能。

下列简单介绍configparser包的使用,假设我们有一个名为class.ini的配置文件如下所示:

[class]

number = 4
num_of_people = 60

如果在python中要读取class这个section下key值为num_of_people的数据时,可以使用如下操作:

import configparser                           # 加载configparser模块

config = configparser.ConfigParser()          # 定义一个ConfigParser对象
config.read("C:/Users/CCC/Desktop/class.ini") # 使用该对象读取class.ini配置文件
config.get("class", "num_of_people")          # 获取section下的key值
'60'

通过以上的方法我们得到了class里面的人数,同理,在我们的项目里两个配置文件对应的section就是get_user和get_customers。于是,我们通过以上的知识封装好针对读取自己的配置文件的函数,并保存于config.py中,文件内容如下所示。

import configparser

#填写配置文件所对应的目录
the_path = "E:/18_learn/Project/stock/new_email/"

# 读取配置文件
# 获取发件邮箱得用户名与密码
def get_config(section, key, file_name):
    config = configparser.ConfigParser()
    path = the_path+file_name
    config.read(path,encoding="utf-8-sig")
    return config.get(section, key)


# 获取收件人邮箱列表
def get_client(option, file_name):
    config = configparser.ConfigParser()
    path = the_path+file_name
    config.read(path,encoding="utf-8-sig")
    options = config.options(option)
    client_list = []
    for i in options:
        mail = config.get(option, i)
        client_list.append(mail)
    return(client_list)

编写邮件内容

我们把需要书写的邮件内容单独放到一个python文件下,方便后续的修改,在这个过程中主要使用到了Python下的email包,它提供了管理电子邮件消息的功能。

在日常的工作中,纯文本的邮件已经不足以满足我们的需求了,因此我们使用mail.mime中的MIMEText类来实现支持HTML格式的邮件,因此这样的邮件便可以支持HTML所以支持的元素,包括表单、CSS等多种功能。而你所需要的操作仅需要如下几行代码便可以设置成功。

from email.mime.text import MIMEText
from email.header import Header

msg = MIMEText(content, 'html', 'utf-8') # 在content变量中传入准备好的hhtml代码
msg['Subject'] = Header(subject, 'utf-8') # 设置邮件的主题,放入subject变量中

设置一个用于存放邮件信息的代码,命名为message.py,文件内容如下:

from email.mime.text import MIMEText
from email.header import Header

# 书写邮件内容
content = """

            <meta>您好!</meta>

            <p></p>

            <meta>很高兴和你见面:)。</meta>

        """
# 书写邮件主题
subject = 'python email test'


def get_mail_message():
    msg = MIMEText(content, 'html', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')
    return(msg)

发送邮件模块

设置完以上所用内容之后,只需要将他们用于发送邮件即可,SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

在这个部分使用到了smtplib这个包,它对smtp协议进行了简单的封装。下列的send.py模块封装了用于发送邮件的代码,在使用过程中只需要运行这个文件便可以成功发送邮件,具体的功能解释过多,不单独解释,在注释里进行标注。如果感兴趣的同学可以点击Python SMTP发送邮件,自行了解。

import smtplib
import sys
import config
import message
# 添加文件所在的地址的文件夹,以加载模块
sys.path.append("passl")


# 发送邮件
def send_mail():
    msg = message.get_mail_message() 
    smtpserver = 'smtp.qq.com'                                       # 定义发件邮箱所用的服务器类型
    sender = config.get_config("get_user", "user_mail", "user.ini")  # 读取发件人邮箱
    username = sender
    password = config.get_config("get_user", "user_pwd", "user.ini") # 读取发件人授权码
    receiver = config.get_client("get_customers", "customers.ini")   # 读取收件人邮箱列表
    smtp = smtplib.SMTP()                                            # 定义一个SMTP对象
    smtp.connect(smtpserver)                                         # 连接邮件服务器
    smtp.login(username, password)                                   # 使用邮箱和授权码登陆
    for i in receiver:
        smtp.sendmail(sender, i, msg.as_string())                    # 循环发送邮件
    smtp.quit()                                                      # 退出登陆

send_mail()

以上就是这个小工具群发邮件的所有内容了,其实可以可以定制的东西还很多,比如可以丰富HTML格式还美化邮件、也可以加入添加邮件附件的代码,感兴趣的同学可以自己多尝试,需要下载所有项目文件的同学可以移步我的Github,以上。