小工具:使用python群发邮件

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

涉及包及项目结构介绍

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

  • configparser:读取配置文件

  • email:管理电子邮件消息

  • smtplib:封装了smtp协议,用于发送电子邮件

  • sys:提供对解释器使用或维护的一些变量的访问

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

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

  • customers.ini:存放收件人邮件列表的配置文件

  • config.py:读取配置文件的模块

  • message.py编写邮件内容的模块

  • send.py:用于发送邮件的模块

邮箱SMTP服务设置

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

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


01.png

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

02.png

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

03.png

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

配置文件准备

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

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

  • user.ini:存放发件人邮箱与授权码的配置文件
[get_user]
​
# 发件人邮箱与授权码
​
user_mail = xxxxxxxxx@qq.com
​
user_pwd = xxxxxxxxx</pre>
  • customer.ini:用于存放收件人邮件列表的配置文件
[get_customers]
​
# 存放收件人邮件
​
client_mail_1 = xxxxx@yahoo.com
​
client_mail_2 = xxxxxx@qq.com</pre>

读取配置文件

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

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

[class]
​
number = 4
num_of_people = 60</pre>

如果在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值

通过以上的方法我们得到了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等多种功能。而你所需要的操作仅需要如下几行代码便可以设置成功。

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,以上。
Escher
2018/11/16

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容