首页 > 编程语言 >Python 使用 smtp ssl 模式 发送邮件与附件

Python 使用 smtp ssl 模式 发送邮件与附件

时间:2022-12-20 17:07:06浏览次数:75  
标签:None attach Python self smtp ssl pwd path email

 

参考 :
        发送邮件简单入门 ( 以qq邮箱,163邮箱为
        Python3 使用 SMTP 发送带附件邮件:​​​https://www.jb51.net/article/142231.htm​

还可以使用 scrapy.mail 模块发送邮

 

把代码中这个几设置成你自己的参数:

self._smtp_host = "smtp.mxhichina.com"    # 设置 服务器
self._smtp_port = 465 # 设置 端口
self._email_address = "[email protected]" # 用户名
self._email_password = "xxxxxxxxxxxxxxx" # 口令

完整代码( send_email_attach.py )

# -*- coding: utf-8 -*-
# @Author :
# @File : temp.py
# @Software: PyCharm
# @description : XXX


import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import optparse


class SendEmail(object):

def __init__(self):
super(SendEmail, self).__init__()

# 第三方 SMTP 服务
self._smtp_host = "smtp.mxhichina.com" # 设置 服务器
self._smtp_port = 465 # 设置 端口

# 默认的发送邮件的邮箱地址和密码。
# 当没有传递发送者的邮箱地址和密码时,使用默认的邮箱地址和密码发送
self._email_address = "[email protected]" # 用户名
self._email_password = "xxxxxxxxxxxxxxx" # 口令

self.frm = None
self.pwd = None
self.to = None
self.email_title = None
self.email_content = None
self.attach_path = None
self.attach_path_list = None
pass

def set_args(self, frm=None, pwd=None, to=None, email_title=None, email_content=None, attach_path=None):
"""
设置参数
:param frm: 发送者邮箱地址
:param pwd: 发送者邮箱密码
:param to: 接收者邮箱地址,多个接收者时以逗号','分割
:param email_title: 邮件标题
:param email_content:邮件内容
:param attach_path: 附件路径,多个附件时以逗号','分割
:return:
"""
if frm:
self.frm = frm
if not pwd:
raise Exception('设置邮箱密码')
else:
self.pwd = pwd
else:
self.frm = self._email_address
self.pwd = self._email_password
self.to = to
self.email_title = email_title
self.email_content = email_content
self.attach_path = attach_path

# 把逗号分割的附件路径变成 list
if self.attach_path is not None:
self.attach_path_list = self.attach_path if ',' not in self.attach_path else self.attach_path.split(',')

def send_email(self):
multi_part = MIMEMultipart()
multi_part['From'] = self.frm
multi_part['To'] = self.to
multi_part['Subject'] = Header(self.email_title, "utf-8")

# 添加 邮件 内容
msg = self.email_content
email_body = MIMEText(msg, 'plain', 'utf-8')
multi_part.attach(email_body)

# 添加附件
if isinstance(self.attach_path_list, str):
# 只有一个附件
attach = MIMEText(open(self.attach_path, 'rb').read(), 'base64', 'utf-8')
attach["Content-Type"] = 'application/octet-stream'

# filename not strict
attach_file_name = self.attach_path_list.split('/')[-1]
attach["Content-Disposition"] = 'attachment; filename="{0}"'.format(attach_file_name)
multi_part.attach(attach)
elif isinstance(self.attach_path_list, list):
# 多个附件
for item in self.attach_path_list:
attach = MIMEText(open(item, 'rb').read(), 'base64', 'utf-8')
attach["Content-Type"] = 'application/octet-stream'

# filename not strict
attach_file_name = item.split('/')[-1]
attach["Content-Disposition"] = 'attachment; filename="{0}"'.format(attach_file_name)
multi_part.attach(attach)

# ssl 协议安全发送
smtp_server = smtplib.SMTP_SSL(host=self._smtp_host, port=self._smtp_port)
try:
smtp_server.login(self.frm, self.pwd)
smtp_server.sendmail(self.frm, self.to, multi_part.as_string())
except smtplib.SMTPException as e:
print("send fail", e)
else:
print("send success")
finally:
try:
smtp_server.quit()
except smtplib.SMTPException:
print("quit fail")
else:
print("quit success")


if __name__ == '__main__':
parse = optparse.OptionParser(
usage='"usage : %prog [options] arg1,arg2"', version="%prog 1.2"
)
parse.add_option(
'-t', '--to', dest='to', action='store', type=str, metavar='to',
help='接收者的邮箱地址, 多个接收者时以逗号 "," 分隔'
)
parse.add_option(
'-f', '--from', dest='frm', type=str, metavar='from',
help='发送者的邮箱地址'
)
parse.add_option(
'-p', '--pwd', dest='pwd', type=str, metavar='pwd',
help='发送者的邮箱密码'
)
parse.add_option(
'-T', '--title', dest='email_title', type=str, metavar='title',
help='邮件标题'
)
parse.add_option(
'-C', '--content', dest='email_content', type=str, metavar='content',
help='邮件内容'
)
parse.add_option(
'-A', '--attach', dest='attach_path', type=str, metavar='attach',
help='邮件的附件路径, 多个附件时以逗号 "," 分隔'
)
parse.add_option('-v', help='help')

options, args = parse.parse_args()

temp_send = SendEmail()
temp_send.set_args(
frm=options.frm, pwd=options.pwd, to=options.to,
email_title=options.email_title,
email_content=options.email_content,
attach_path=options.attach_path
)
temp_send.send_email()

可以执行 :python3 send_email_attach.py -h

Python 使用 smtp ssl 模式 发送邮件与附件_服务器

发送邮件:

Python 使用 smtp ssl 模式 发送邮件与附件_用户名_02

邮箱截图

Python 使用 smtp ssl 模式 发送邮件与附件_服务器_03

 

 

 

标签:None,attach,Python,self,smtp,ssl,pwd,path,email
From: https://blog.51cto.com/csnd/5956108

相关文章

  • 安装 Python 包时解决 Microsoft visual c++ 14.0 is required 问题
     参考:​​http://www.hongweipeng.com/index.php/archives/1532/​​ 在windows上安装scrapy时经常会遇到这个问题,安装其他组件也可能会遇到。但问题解决办法都是大致......
  • Python PyQt5 教程
     PyQt5教程 :http://code.py40.com/face 教程翻译自:​​http://zetcode.com/gui/pyqt5/​​ 【第一节】PyQt5简介:​​http://code.py40.com/1948.html​​​【第二节】P......
  • Python GUI 开发工具
     PythonTkinter教程(GUI图形界面开发教程):​​http://c.biancheng.net/python/tkinter/​​PyQt5教程:​​http://code.py40.com/face​​ 作为 Pyhon 开发者,我们迟早都会......
  • Python 异步 IO 、协程、asyncio、async/await、aiohttp
    From:廖雪峰 异步IO:​​https://www.liaoxuefeng.com/wiki/1016959663602400/1017959540289152​​PythonAsync/Await入门指南:​​https://zhuanlan.zhihu.com/p/27258......
  • Python 大规模异步新闻爬虫、google、百度、有道、百度指数
    参考:​​https://www.yuanrenxue.com/crawler/news-crawler-urlpool.html​​url_pool.py#-*-coding:utf-8-*-#@Author:佛祖保佑,永无bug#@Date:#@File......
  • python 之将xmind转为excel用例文件
    1.xmind文件模板如下所示(最后一个子级为预置条件)2.excel用例模板3.获取xmind文件数据并转成字典形式fromxmindparserimportxmind_to_dict#xmind_to_dict可读取......
  • python+excel=openpyxl(一)
     原计划写一个openpyxl的操作文档,普及下python如何来操作excel,结果人家官方的文档已经写的非常完美了,就临时改主意把人家的文档翻译了一遍。可以阅读英文文档的同学,建议......
  • Python学习笔记--元组+字符串
    元组元组一旦定义完成,就不能再被修改同样,元组也可以进行嵌套操作当然,若是在元组里面嵌套一个list,那么list里面的元素是可以进行修改的!案例:实现:字符串查找索......
  • python-FunctionType动态创建函数,并改变函数名称
    方法一但无法编写foo函数体里面内容importtypesdeffoo(x,y):#print(x,y)return1x=1y=2f=types.FunctionType(foo.__code__,{},name='te......
  • 解决python无法导入自定义类的问题
    问题:在自定义了类之后,想在另外一个文件导入自定义类,无法导入目录:在class_test.py中自定了类在test.py中导入类A,出现问题解决方法:test.py:importsysimportos......