Excel文件用于存放信息,邮箱还需开启smtp服务:
实现代码如下:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
import xlrd
class SendMails(object):
def __init__(self):
self.username = input('输入邮箱账号:')
self.password = input('输入邮箱密码:')
# 打开工作簿
self.wb = xlrd.open_workbook('1.2_自动发送邮件Tool.xls')
self.mails = []
self.content = ''
self.title = ''
def get_content(self):
# 读取工作簿中的第一个工作表
sheet_1 = self.wb.sheet_by_index(0)
# 获取标题
self.title = sheet_1.cell(10, 1).value
# 获取正文
self.content = ''
for i in range(14, 63):
i = sheet_1.cell(i, 1).value
self.content += i + '\n'
self.content = self.content.strip()
self.content += '\n\n\n'
for i in range(15, 22):
i = sheet_1.cell(i, 3).value
self.content += '\n' + i
def get_mails(self):
# 获取抄送邮箱、接收邮箱、附件存放路径、附件名称
ws = self.wb.sheet_by_index(1)
for index, row in enumerate(ws.get_rows()):
if index > 4 and len(row[5].value) != 0:
self.mails.append([row[9].value, row[5].value, row[13].value, row[14].value])
def send_one_mail(self, mail):
cc = mail[0]
receiver = mail[1]
file_path = mail[2]
file_name = mail[3]
print(mail)
try:
# 创建一个多类型的消息
message = MIMEMultipart('mixed')
# 设置标题、发送人、接收人、抄送人
message['Subject'] = self.title
message['From'] = self.username
message['To'] = receiver
message['Cc'] = cc
# 构建多类型消息的正文部分,并负载到消息中
text_plain = MIMEText(self.content, _subtype='plain', _charset='UTF-8')
message.attach(text_plain)
# 添加附件到消息中
file = MIMEApplication(open(file_path, 'rb').read())
file.add_header('Content-Disposition', 'attachment', filename=file_name)
message.attach(file)
# 初始化一个smtp实例
smtp = smtplib.SMTP(host='smtp.office365.com')
# 链接outlook 服务器
smtp.connect(host='smtp.office365.com', port=587)
# 向邮箱发送ehlo 命令
smtp.ehlo()
# 将到SMTP 服务器的连接设置为TLS模式
smtp.starttls()
# 登录账号
smtp.login(self.username, self.password)
# 发送邮件
smtp.sendmail(self.username, receiver, message.as_string())
smtp.quit()
print(receiver, 'success')
except smtplib.SMTPException as e:
print(receiver, 'error', e)
def run(self):
self.get_content()
self.get_mails()
print('发送邮件中。。。')
for mail in self.mails:
self.send_one_mail(mail)
if __name__ == '__main__':
send_mail = SendMails()
send_mail.run()