目录
本系列文章为参与【Python】CSDN21天学习挑战赛,成为更好的自己,根据自身的学习进度并记录自己的学习过程。我也是Python纯小白,和大家一起学习,保持热爱学习的好习惯?
活动地址:CSDN21天学习挑战赛
注册网易邮箱,其他邮箱也支持的,我这里以网易为例,都差不多
1.注册后登录邮箱,选择我们设置

2.找到我们的POP3/SMTP/IMAP

3.需要开启我们的IMAP/SMTP服务和POP3/SMTP服务

提示:如果服务默认是开启的,但是不知道授权码,可以选择新增,或者删除,关闭服务重新开启,都是可以的

4.首先我们开启IMAP/SMTP服务,需要发送短信验证,使用手机微信,浏览器扫码都行,发送成功后,点击我已发送

5.然后就会生成一串授权码,一定一定要先记下来,再点击确定,这里使用设备随便填

6.接着,我们开启POP3/SMTP服务,一样需要扫码发送短信

7.开启成功后,就会弹出提示,我们就可以用刚刚的授权码来发送邮件了

POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
网易163免费邮箱相关服务器信息
服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号 IMAP imap.163.com 993 143 SMTP smtp.163.com 456/994 25 POP3 pop.163.com 995 110
POP3和IMAP的区别协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。
而
IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。同时,
IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读。IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。此外,IMAP更好地支持了从多个不同设备中随时访问新邮件。
操作位置 操作内容 IMAP POP3 收件箱 阅读,标记,移动,删除邮件等 客户端与邮箱更新同步 仅客户端内 发件箱 保存到已发送 客户端与邮箱更新同步 仅客户端内 创建文件夹 新建自定义文件夹 客户端与邮箱更新同步 仅客户端内 草稿 保存草稿 客户端与邮箱更新同步 仅客户端内 垃圾文件夹 接受误移入垃圾文件夹的邮件 支持 不支持 广告邮件 接受被移入广告文件夹的邮件 支持 不支持 总之,
IMAP整体上为用户带来更为便捷和可靠的体验。POP3更易丢失邮件或多次下载相同的邮件,但IMAP通过邮件客户端与webmail 之间的双向同步功能很好地避免了这些问题。
注:若在web邮箱中设置了“保存到已发送”,使用客户端POP服务发信时,已发邮件也会自动同步到网页端“已发送”文件夹内。
1.启动PyCharm
2.新建文件email_163

3.导入发送邮件模块
# 导入发送邮件模块
import smtplib
4.创建class类
# 发送网易邮箱类
class Email163(object):
5.建议所有不怎么会变动的设置为类常量
# 服务器地址
HOST = 'smtp.163.com'
# 端口
PORT = '25'
# 授权码
PASSWORD = '填写自己的授权码(不是邮箱密码)'
# 登录用户(邮件发送者)
FROM_ADDR = '填写自己发送者的邮箱'
6.构造函数
def __init__(self, msg: str, to_addrs: str) -> None:
"""
构造函数
:param msg: 邮件内容
:param to_addrs: 邮件接收者
"""
self.msg = msg
self.to_addrs = to_addrs
7.定义发送默认邮件函数
def send_default_email(self) -> None:
"""
发送默认邮件
:return:None
"""
try:
# 实例SMTP
smtp = smtplib.SMTP()
# 连接邮箱服务器
smtp.connect(self.HOST, self.PORT)
# 验证授权码
smtp.login(self.FROM_ADDR, self.PASSWORD)
# 发送邮件
smtp.sendmail(self.FROM_ADDR, self.to_addrs, self.msg)
# 发送完邮件,关闭服务
smtp.close()
print(f'邮件成功发送给:{self.to_addrs}')
except smtplib.SMTPException:
raise f'给{to_addrs}发送邮件失败'
8.入口函数调用
if __name__ == '__main__':
# 邮件内容
msg = 'hello world'
# 邮件接收者(填写自己想要发送给别人的邮箱地址)
# 可以发送多人(可以发给自己),格式:to_addrs = ['980338974@qq.com','*****','********']
to_addrs = '980338974@qq.com'
# 实例发送网易邮箱的类
email163 = Email163(msg, to_addrs)
# 调用发送邮件函数
email163.send_default_email()
9.可以看到邮件以及发送成功了

10.接下来我们登录接收的邮箱看看,发现成功接收了邮件,但是没有主题,也没有任何内容

我们可以使用第三方库email中的一些模块,更方便快速的构造邮件内容
提示:如果使用email模块群发邮件,群发报错:AttributeError: 'list' object has no attribute 'decode',可以将接收者列表用,或;拼接为字符串:','.join(to_addrs)
1.导入模块
# 导入邮件主题构造模块
from email.header import Header
# 导入邮件内容构造模块
from email.mime.text import MIMEText
2.定义发送文本格式邮件函数
def send_text_email(self) -> None: """ 发送文本格式邮件 :return:None """ try: # 实例SMTP smtp = smtplib.SMTP() # 连接邮箱服务器 smtp.connect(self.HOST, self.PORT) # 验证授权码 smtp.login(self.FROM_ADDR, self.PASSWORD) # 构造邮件内容 # 第一个参数_text:内容 # 第二个参数_subtype:格式 # 第三个参数_charset:编码 # 实例邮件正文 message = MIMEText('这是使用Python发送的邮件测试!', 'plain', 'utf-8') # 构造邮件主题信息 # 主题 message['Subject'] = Header('Python发送邮件', 'utf-8') # 发送者 message['From'] = Header(self.FROM_ADDR, 'utf-8') # 接收者 # message['To'] = Header(','.join(self.to_addrs), 'utf-8') # 接收者为多人[]时,需要用,拼接为字符串 message['To'] = Header(self.to_addrs, 'utf-8')<span class="token comment"># 发送邮件</span> smtp<span class="token punctuation">.</span>sendmail<span class="token punctuation">(</span>self<span class="token punctuation">.</span>FROM_ADDR<span class="token punctuation">,</span> self<span class="token punctuation">.</span>to_addrs<span class="token punctuation">,</span> message<span class="token punctuation">.</span>as_string<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 发送完邮件,关闭服务</span> smtp<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f'邮件成功发送给:</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>self<span class="token punctuation">.</span>to_addrs<span class="token punctuation">}</span></span><span class="token string">'</span></span><span class="token punctuation">)</span> <span class="token keyword">except</span> smtplib<span class="token punctuation">.</span>SMTPException<span class="token punctuation">:</span> <span class="token keyword">raise</span> <span class="token string-interpolation"><span class="token string">f'给</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>to_addrs<span class="token punctuation">}</span></span><span class="token string">发送邮件失败'</span></span>
3.入口函数调用
if __name__ == '__main__':
# 邮件内容
msg = 'hello world'
# 邮件接收者(填写自己想要发送给别人的邮箱地址)
# 可以发送多人(可以发给自己),格式:to_addrs = ['980338974@qq.com','*****','********']
to_addrs = '980338974@qq.com'
# 实例发送网易邮箱的类
email163 = Email163(msg, to_addrs)
# 调用发送邮件函数
email163.send_text_email()
4.再看邮箱,就有主题和内容了

1.定义发送HTML格式邮件函数
def send_html_email(self) -> None: """ 发送HTML格式邮件 :return:None """ try: # 实例SMTP smtp = smtplib.SMTP() # 连接邮箱服务器 smtp.connect(self.HOST, self.PORT) # 验证授权码 smtp.login(self.FROM_ADDR, self.PASSWORD) # 构造邮件内容 # 第一个参数_text:内容 # 第二个参数_subtype:格式 # 第三个参数_charset:编码 text = """ <h1>这是使用Python发送的HTML格式邮件测试,我是h1</h1> <a href="http://t.csdn.cn/p58Yf">我是一个链接</a> <table> <th>我是表格列头</th> <tr> <td bgcolor="PowderBlue">我是有颜色的表单元格</td> </tr> </table> """ # 实例邮件正文 message = MIMEText(text, 'html', 'utf-8') # 构造邮件主题信息 # 主题 message['Subject'] = Header('Python发送邮件', 'utf-8') # 发送者 message['From'] = Header(self.FROM_ADDR, 'utf-8') # 接收者 message['To'] = Header(','.join(self.to_addrs), 'utf-8') # 接收者为多人[]时,需要用,拼接为字符串 # message['To'] = Header(self.to_addrs, 'utf-8')<span class="token comment"># 发送邮件</span> smtp<span class="token punctuation">.</span>sendmail<span class="token punctuation">(</span>self<span class="token punctuation">.</span>FROM_ADDR<span class="token punctuation">,</span> self<span class="token punctuation">.</span>to_addrs<span class="token punctuation">,</span> message<span class="token punctuation">.</span>as_string<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 发送完邮件,关闭服务</span> smtp<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f'邮件成功发送给:</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>self<span class="token punctuation">.</span>to_addrs<span class="token punctuation">}</span></span><span class="token string">'</span></span><span class="token punctuation">)</span> <span class="token keyword">except</span> smtplib<span class="token punctuation">.</span>SMTPException<span class="token punctuation">:</span> <span class="token keyword">raise</span> <span class="token string-interpolation"><span class="token string">f'给</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>to_addrs<span class="token punctuation">}</span></span><span class="token string">发送邮件失败'</span></span>
2.入口函数调用
if __name__ == '__main__':
# 邮件内容
msg = 'hello world'
# 邮件接收者(填写自己想要发送给别人的邮箱地址)
# 可以发送多人(可以发给自己),格式:to_addrs = ['980338974@qq.com','*****','********']
to_addrs = '980338974@qq.com'
# 实例发送网易邮箱的类
email163 = Email163(msg, to_addrs)
# 调用发送邮件函数
email163.send_html_email()
邮件中HTML文本中,如果使用外网链接地址,一般是无效的,同样,我们可以用:MIMEImage模块完成
1.导入模块
# 导入邮件混合构造模块
from email.mime.multipart import MIMEMultipart
# 导入邮件图片处理模块
from email.mime.image import MIMEImage
2.定义函数
def send_html_with_image_email(self) -> None: """ 发送HTML格式邮件带图片 :return:None """ try: # 实例SMTP smtp = smtplib.SMTP() # 连接邮箱服务器 smtp.connect(self.HOST, self.PORT) # 验证授权码 smtp.login(self.FROM_ADDR, self.PASSWORD) # 实例内嵌的邮件(文本,HTML,图片) message = MIMEMultipart('related') # 构造邮件内容 # 第一个参数_text:内容 # 第二个参数_subtype:格式 # 第三个参数_charset:编码<span class="token comment"># 构造邮件主题信息</span> <span class="token comment"># 主题</span> message<span class="token punctuation">[</span><span class="token string">'Subject'</span><span class="token punctuation">]</span> <span class="token operator">=</span> Header<span class="token punctuation">(</span><span class="token string">'Python发送邮件'</span><span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token comment"># 发送者</span> message<span class="token punctuation">[</span><span class="token string">'From'</span><span class="token punctuation">]</span> <span class="token operator">=</span> Header<span class="token punctuation">(</span>self<span class="token punctuation">.</span>FROM_ADDR<span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token comment"># 接收者</span> message<span class="token punctuation">[</span><span class="token string">'To'</span><span class="token punctuation">]</span> <span class="token operator">=</span> Header<span class="token punctuation">(</span><span class="token string">','</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>self<span class="token punctuation">.</span>to_addrs<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token comment"># 接收者为多人[]时,需要用,拼接为字符串</span> <span class="token comment"># message['To'] = Header(self.to_addrs, 'utf-8')</span> text <span class="token operator">=</span> <span class="token triple-quoted-string string">""" <h1>这是使用Python发送的HTML格式邮件测试,我是h1</h1> <a href="http://t.csdn.cn/p58Yf">我是一个链接</a> <table> <th>我是表格列头</th> <tr> <td bgcolor="PowderBlue">我是有颜色的表单元格</td> </tr> </table> <p>CSDN:</p> <p><img src="cid:csdn"></p> """</span> <span class="token comment"># 附加邮件正文</span> message<span class="token punctuation">.</span>attach<span class="token punctuation">(</span>MIMEText<span class="token punctuation">(</span>text<span class="token punctuation">,</span> <span class="token string">'html'</span><span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 打开图片</span> img_name <span class="token operator">=</span> <span class="token string">'csdn.gif'</span> <span class="token builtin">file</span> <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span>img_name<span class="token punctuation">,</span> <span class="token string">'rb'</span><span class="token punctuation">)</span> img_data <span class="token operator">=</span> <span class="token builtin">file</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">file</span><span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># 创建图片</span> img <span class="token operator">=</span> MIMEImage<span class="token punctuation">(</span>img_data<span class="token punctuation">)</span> <span class="token comment"># 定义图片ID,在HTML文本中引用</span> img<span class="token punctuation">.</span>add_header<span class="token punctuation">(</span><span class="token string">'Content-ID'</span><span class="token punctuation">,</span> <span class="token string">'csdn'</span><span class="token punctuation">)</span> <span class="token comment"># 附加图片</span> message<span class="token punctuation">.</span>attach<span class="token punctuation">(</span>img<span class="token punctuation">)</span> <span class="token comment"># 发送邮件</span> smtp<span class="token punctuation">.</span>sendmail<span class="token punctuation">(</span>self<span class="token punctuation">.</span>FROM_ADDR<span class="token punctuation">,</span> self<span class="token punctuation">.</span>to_addrs<span class="token punctuation">,</span> message<span class="token punctuation">.</span>as_string<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 发送完邮件,关闭服务</span> smtp<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f'邮件成功发送给:</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>self<span class="token punctuation">.</span>to_addrs<span class="token punctuation">}</span></span><span class="token string">'</span></span><span class="token punctuation">)</span> <span class="token keyword">except</span> smtplib<span class="token punctuation">.</span>SMTPException<span class="token punctuation">:</span> <span class="token keyword">raise</span> <span class="token string-interpolation"><span class="token string">f'给</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>to_addrs<span class="token punctuation">}</span></span><span class="token string">发送邮件失败'</span></span>
3.入口函数调用
if __name__ == '__main__':
# 邮件内容
msg = 'hello world'
# 邮件接收者(填写自己想要发送给别人的邮箱地址)
# 可以发送多人(可以发给自己),格式:to_addrs = ['980338974@qq.com','*****','********']
to_addrs = '980338974@qq.com'
# 实例发送网易邮箱的类
email163 = Email163(msg, to_addrs)
# 调用发送邮件函数
email163.send_html_with_image_email()
4.查看邮箱,图片显示正常,因为我是网易邮箱发送给QQ邮箱,QQ邮箱设置了保护机制,点击显示图片就行了

5.可以看到,HTML和内嵌图片都显示成功了(这个CSDN是个gif)

1.在email_163.py同级创建attachment.txt文件,文件内容可写可不写

2.导入模块,混合模式包含所有类型,可以发送文本格式,HTML格式,带附件
# 导入邮件混合构造模块
from email.mime.multipart import MIMEMultipart
3.定义发送带附件邮件函数
def send_attachment_email(self) -> None: """ 发送带附件邮件 :return:None """<span class="token keyword">try</span><span class="token punctuation">:</span> <span class="token comment"># 实例SMTP</span> smtp <span class="token operator">=</span> smtplib<span class="token punctuation">.</span>SMTP<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># 连接邮箱服务器</span> smtp<span class="token punctuation">.</span>connect<span class="token punctuation">(</span>self<span class="token punctuation">.</span>HOST<span class="token punctuation">,</span> self<span class="token punctuation">.</span>PORT<span class="token punctuation">)</span> <span class="token comment"># 验证授权码</span> smtp<span class="token punctuation">.</span>login<span class="token punctuation">(</span>self<span class="token punctuation">.</span>FROM_ADDR<span class="token punctuation">,</span> self<span class="token punctuation">.</span>PASSWORD<span class="token punctuation">)</span> <span class="token comment"># 实例带附件的邮件</span> message <span class="token operator">=</span> MIMEMultipart<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># 构造邮件内容</span> <span class="token comment"># 第一个参数_text:内容</span> <span class="token comment"># 第二个参数_subtype:格式</span> <span class="token comment"># 第三个参数_charset:编码</span> text <span class="token operator">=</span> <span class="token triple-quoted-string string">""" <h1>这是使用Python发送的HTML格式邮件测试,我是h1</h1> <a href="http://t.csdn.cn/p58Yf">我是一个链接</a> <table> <th>我是表格列头</th> <tr> <td bgcolor="PowderBlue">我是有颜色的表单元格</td> </tr> </table> """</span> <span class="token comment"># 邮件正文</span> message<span class="token punctuation">.</span>attach<span class="token punctuation">(</span>MIMEText<span class="token punctuation">(</span>text<span class="token punctuation">,</span> <span class="token string">'html'</span><span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 构造邮件主题信息</span> <span class="token comment"># 发送者</span> message<span class="token punctuation">[</span><span class="token string">'From'</span><span class="token punctuation">]</span> <span class="token operator">=</span> Header<span class="token punctuation">(</span>self<span class="token punctuation">.</span>FROM_ADDR<span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token comment"># 接收者</span> message<span class="token punctuation">[</span><span class="token string">'To'</span><span class="token punctuation">]</span> <span class="token operator">=</span> Header<span class="token punctuation">(</span><span class="token string">','</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>self<span class="token punctuation">.</span>to_addrs<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token comment"># 接收者为多人[]时,需要用,拼接为字符串</span> <span class="token comment"># message['To'] = Header(self.to_addrs, 'utf-8')</span> <span class="token comment"># 主题</span> message<span class="token punctuation">[</span><span class="token string">'Subject'</span><span class="token punctuation">]</span> <span class="token operator">=</span> Header<span class="token punctuation">(</span><span class="token string">'Python发送邮件'</span><span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token comment"># 上传当前目录下的test.txt文件(附加文件1)</span> attachment <span class="token operator">=</span> MIMEText<span class="token punctuation">(</span><span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">'attachment.txt'</span><span class="token punctuation">,</span> <span class="token string">'rb'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'base64'</span><span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token comment"># 指定消息内容为字节流</span> attachment<span class="token punctuation">[</span><span class="token string">"Content-Type"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'application/octet-stream'</span> <span class="token comment"># 消息描述,这里的filename可以随便填写(最好不要中文,可能会乱码),这里填写的就会在邮件中附件名称显示</span> attachment<span class="token punctuation">[</span><span class="token string">"Content-Disposition"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'attachment; filename="attachment.txt"'</span> <span class="token comment"># 附加文件</span> message<span class="token punctuation">.</span>attach<span class="token punctuation">(</span>attachment<span class="token punctuation">)</span> <span class="token comment"># 上传当前目录下的test.txt文件(附件2)</span> attachment <span class="token operator">=</span> MIMEText<span class="token punctuation">(</span><span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">'attachment.txt'</span><span class="token punctuation">,</span> <span class="token string">'rb'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'base64'</span><span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token comment"># 指定消息内容为字节流</span> attachment<span class="token punctuation">[</span><span class="token string">"Content-Type"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'application/octet-stream'</span> <span class="token comment"># 消息描述,这里的filename可以随便填写(最好不要中文,可能会乱码),这里填写的就会在邮件中附件名称显示</span> attachment<span class="token punctuation">[</span><span class="token string">"Content-Disposition"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'attachment; filename="attachment2.txt"'</span> <span class="token comment"># 附加文件2</span> message<span class="token punctuation">.</span>attach<span class="token punctuation">(</span>attachment<span class="token punctuation">)</span> <span class="token comment"># 发送邮件</span> smtp<span class="token punctuation">.</span>sendmail<span class="token punctuation">(</span>self<span class="token punctuation">.</span>FROM_ADDR<span class="token punctuation">,</span> self<span class="token punctuation">.</span>to_addrs<span class="token punctuation">,</span> message<span class="token punctuation">.</span>as_string<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f'邮件成功发送给:</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>self<span class="token punctuation">.</span>to_addrs<span class="token punctuation">}</span></span><span class="token string">'</span></span><span class="token punctuation">)</span> <span class="token keyword">except</span> smtplib<span class="token punctuation">.</span>SMTPException<span class="token punctuation">:</span> <span class="token keyword">raise</span> <span class="token string-interpolation"><span class="token string">f'给</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>to_addrs<span class="token punctuation">}</span></span><span class="token string">发送邮件失败'</span></span>
4.入口函数调用
if __name__ == '__main__':
# 邮件内容
msg = 'hello world'
# 邮件接收者(填写自己想要发送给别人的邮箱地址)
# 可以发送多人(可以发给自己),格式:to_addrs = ['980338974@qq.com','*****','********']
to_addrs = '980338974@qq.com'
# 实例发送网易邮箱的类
email163 = Email163(msg, to_addrs)
# 调用发送邮件函数
email163.send_attachment_email()
5.打开邮箱查看,发现邮件中有两个附件

其实上面代码中,大量的脏代码,很多重复性内容,下面完整代码我做了简单的封装处理
PASSWORD填写自己的授权码,FROM_ADDR填写邮件发送者
# 导入发送邮件模块 import smtplib # 导入邮件主题构造模块 from email.header import Header # 导入邮件文字构造模块 from email.mime.text import MIMEText # 导入邮件混合构造模块 from email.mime.multipart import MIMEMultipart # 导入邮件图片处理模块 from email.mime.image import MIMEImage# 发送网易邮件类
class Email163(object):
# 服务器地址
HOST = 'smtp.163.com'
# 端口
PORT = '25'
# 授权码(不是邮箱密码)'
PASSWORD = ''
# 登录用户(邮件发送者)
FROM_ADDR = ''
# 文本格式
SUBTYPE_PLAIN = 'plain'
# HTML格式
SUBTYPE_HTML = 'html'
# 附件
ATTACHMENT = 'attachment'
# 内嵌
EMBEDDED = 'embedded'<span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> subtype<span class="token punctuation">:</span> <span class="token builtin">str</span> <span class="token operator">=</span> SUBTYPE_PLAIN<span class="token punctuation">,</span> charset<span class="token punctuation">:</span> <span class="token builtin">str</span> <span class="token operator">=</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token boolean">None</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">""" 构造函数 :param subtype: 邮件格式:plain:文本,html:超文本标记语言,n(默认plain) :param charset: 编码,默认utf-8 """</span> self<span class="token punctuation">.</span>subtype <span class="token operator">=</span> subtype self<span class="token punctuation">.</span>charset <span class="token operator">=</span> charset <span class="token keyword">def</span> <span class="token function">get_smtp</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> smtplib<span class="token punctuation">.</span>SMTP<span class="token punctuation">:</span> <span class="token triple-quoted-string string">""" 实例SMTP并验证 :return: smtplib.SMTP """</span> <span class="token keyword">try</span><span class="token punctuation">:</span> <span class="token comment"># 实例SMTP</span> smtp <span class="token operator">=</span> smtplib<span class="token punctuation">.</span>SMTP<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># 连接邮箱服务器</span> smtp<span class="token punctuation">.</span>connect<span class="token punctuation">(</span>self<span class="token punctuation">.</span>HOST<span class="token punctuation">,</span> self<span class="token punctuation">.</span>PORT<span class="token punctuation">)</span> <span class="token comment"># 验证授权码</span> smtp<span class="token punctuation">.</span>login<span class="token punctuation">(</span>self<span class="token punctuation">.</span>FROM_ADDR<span class="token punctuation">,</span> self<span class="token punctuation">.</span>PASSWORD<span class="token punctuation">)</span> <span class="token keyword">return</span> smtp <span class="token keyword">except</span> smtplib<span class="token punctuation">.</span>SMTPException<span class="token punctuation">:</span> <span class="token keyword">raise</span> <span class="token string-interpolation"><span class="token string">f'验证邮箱失败:用户:</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>self<span class="token punctuation">.</span>FROM_ADDR<span class="token punctuation">}</span></span><span class="token string">,授权码:</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>self<span class="token punctuation">.</span>PASSWORD<span class="token punctuation">}</span></span><span class="token string">'</span></span> <span class="token keyword">def</span> <span class="token function">get_message</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> subject<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> text<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> subtype<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">""" 获取邮件信息 :param subject: 主题 :param text: 内容 :param charset: 编码 :return: str """</span> <span class="token comment"># 构造邮件内容</span> <span class="token comment"># 第一个参数_text:内容</span> <span class="token comment"># 第二个参数_subtype:格式</span> <span class="token comment"># 第三个参数_charset:编码</span> <span class="token keyword">if</span> subtype <span class="token operator">==</span> <span class="token string">"attachment"</span><span class="token punctuation">:</span> <span class="token comment"># 实例混合邮件(附件)</span> message <span class="token operator">=</span> MIMEMultipart<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">elif</span> subtype <span class="token operator">==</span> <span class="token string">"embedded"</span><span class="token punctuation">:</span> <span class="token comment"># 实例内嵌的邮件(文本,HTML,图片)</span> message <span class="token operator">=</span> MIMEMultipart<span class="token punctuation">(</span><span class="token string">'related'</span><span class="token punctuation">)</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token comment"># 实例文字邮件</span> message <span class="token operator">=</span> MIMEText<span class="token punctuation">(</span>text<span class="token punctuation">,</span> self<span class="token punctuation">.</span>subtype<span class="token punctuation">,</span> self<span class="token punctuation">.</span>charset<span class="token punctuation">)</span> <span class="token comment"># 构造邮件主题信息</span> <span class="token comment"># 主题</span> message<span class="token punctuation">[</span><span class="token string">'Subject'</span><span class="token punctuation">]</span> <span class="token operator">=</span> Header<span class="token punctuation">(</span>subject<span class="token punctuation">,</span> self<span class="token punctuation">.</span>charset<span class="token punctuation">)</span> <span class="token comment"># 发送者</span> message<span class="token punctuation">[</span><span class="token string">'From'</span><span class="token punctuation">]</span> <span class="token operator">=</span> Header<span class="token punctuation">(</span>self<span class="token punctuation">.</span>FROM_ADDR<span class="token punctuation">,</span> self<span class="token punctuation">.</span>charset<span class="token punctuation">)</span> <span class="token comment"># 接收者,接收者为多人[]时,需要用,拼接为字符串</span> message<span class="token punctuation">[</span><span class="token string">'To'</span><span class="token punctuation">]</span> <span class="token operator">=</span> Header<span class="token punctuation">(</span><span class="token string">','</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>to_addrs<span class="token punctuation">)</span><span class="token punctuation">,</span> self<span class="token punctuation">.</span>charset<span class="token punctuation">)</span> <span class="token comment"># 返回消息实例</span> <span class="token keyword">return</span> message <span class="token keyword">def</span> <span class="token function">attach_attachment</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> message<span class="token punctuation">,</span> text<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> subtype<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> attachment_list<span class="token punctuation">:</span> <span class="token builtin">list</span><span class="token punctuation">[</span><span class="token builtin">dict</span><span class="token punctuation">[</span><span class="token builtin">str</span><span class="token punctuation">,</span> <span class="token builtin">str</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token boolean">None</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">""" 附加上传附件(可多文件) :param message: 邮件消息 :param subtype: 邮件类型 :param attachment_list: 附件列表(内嵌也一样,名称对应src="cid:name"中的name):格式[{"path":"附件路径1","name":"显示名称"},{"path":"附件路径2","name":"显示名称"}] :return: None """</span> <span class="token comment"># 附加正文</span> <span class="token keyword">if</span> subtype <span class="token keyword">in</span> <span class="token punctuation">(</span>Email163<span class="token punctuation">.</span>ATTACHMENT<span class="token punctuation">,</span> Email163<span class="token punctuation">.</span>EMBEDDED<span class="token punctuation">)</span><span class="token punctuation">:</span> message<span class="token punctuation">.</span>attach<span class="token punctuation">(</span>MIMEText<span class="token punctuation">(</span>text<span class="token punctuation">,</span> self<span class="token punctuation">.</span>subtype<span class="token punctuation">,</span> self<span class="token punctuation">.</span>charset<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">if</span> subtype <span class="token operator">==</span> Email163<span class="token punctuation">.</span>ATTACHMENT<span class="token punctuation">:</span> <span class="token comment"># 附件</span> <span class="token keyword">for</span> item <span class="token keyword">in</span> attachment_list<span class="token punctuation">:</span> <span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>item<span class="token punctuation">[</span><span class="token string">"path"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">'rb'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span> file_data <span class="token operator">=</span> f<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># 上传文件</span> attachment <span class="token operator">=</span> MIMEText<span class="token punctuation">(</span>file_data<span class="token punctuation">,</span> <span class="token string">'base64'</span><span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token comment"># 指定消息内容为字节流</span> attachment<span class="token punctuation">[</span><span class="token string">"Content-Type"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'application/octet-stream'</span> <span class="token comment"># 消息描述,这里的filename可以随便填写,这里填写的就会在邮件中附件名称显示</span> attachment<span class="token punctuation">[</span><span class="token string">"Content-Disposition"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string-interpolation"><span class="token string">f'attachment; filename="</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>item<span class="token punctuation">[</span><span class="token string">"name"</span><span class="token punctuation">]</span><span class="token punctuation">}</span></span><span class="token string">"'</span></span> <span class="token comment"># 附加文件</span> message<span class="token punctuation">.</span>attach<span class="token punctuation">(</span>attachment<span class="token punctuation">)</span> <span class="token keyword">elif</span> subtype <span class="token operator">==</span> Email163<span class="token punctuation">.</span>EMBEDDED<span class="token punctuation">:</span> <span class="token comment"># 内嵌</span> <span class="token keyword">for</span> item <span class="token keyword">in</span> attachment_list<span class="token punctuation">:</span> <span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>item<span class="token punctuation">[</span><span class="token string">"path"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">'rb'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span> img_data <span class="token operator">=</span> f<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># 创建图片</span> img <span class="token operator">=</span> MIMEImage<span class="token punctuation">(</span>img_data<span class="token punctuation">)</span> <span class="token comment"># 定义图片ID,在HTML文本中引用</span> img<span class="token punctuation">.</span>add_header<span class="token punctuation">(</span><span class="token string">'Content-ID'</span><span class="token punctuation">,</span> item<span class="token punctuation">[</span><span class="token string">"name"</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment"># 附加图片</span> message<span class="token punctuation">.</span>attach<span class="token punctuation">(</span>img<span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">send_email</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> smtp<span class="token punctuation">:</span> smtplib<span class="token punctuation">.</span>SMTP<span class="token punctuation">,</span> message<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> to_addrs<span class="token punctuation">:</span> <span class="token builtin">list</span><span class="token punctuation">[</span><span class="token builtin">str</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token boolean">None</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">""" 发送邮件 :param smtp: SMTP实例 :param message: 邮件消息 :return: None """</span> <span class="token keyword">try</span><span class="token punctuation">:</span> <span class="token comment"># 发送邮件</span> smtp<span class="token punctuation">.</span>sendmail<span class="token punctuation">(</span>self<span class="token punctuation">.</span>FROM_ADDR<span class="token punctuation">,</span> <span class="token string">','</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>to_addrs<span class="token punctuation">)</span><span class="token punctuation">,</span> message<span class="token punctuation">.</span>as_string<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 发送完邮件,关闭服务</span> smtp<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f'邮件成功发送给:</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>to_addrs<span class="token punctuation">}</span></span><span class="token string">'</span></span><span class="token punctuation">)</span> <span class="token keyword">except</span> smtplib<span class="token punctuation">.</span>SMTPException<span class="token punctuation">:</span> <span class="token keyword">raise</span> <span class="token string-interpolation"><span class="token string">f'给</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>to_addrs<span class="token punctuation">}</span></span><span class="token string">发送邮件失败'</span></span> <span class="token keyword">def</span> <span class="token function">main</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> subject<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> text<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> to_addrs<span class="token punctuation">:</span> <span class="token builtin">list</span><span class="token punctuation">[</span><span class="token builtin">str</span><span class="token punctuation">]</span><span class="token punctuation">,</span> subtype<span class="token punctuation">:</span> <span class="token builtin">str</span> <span class="token operator">=</span> <span class="token boolean">None</span><span class="token punctuation">,</span> attachment_list<span class="token punctuation">:</span> <span class="token builtin">list</span><span class="token punctuation">[</span><span class="token builtin">dict</span><span class="token punctuation">[</span><span class="token builtin">str</span><span class="token punctuation">,</span> <span class="token builtin">str</span><span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">None</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token boolean">None</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">""" 发送网易邮件 :param subject: 主题 :param text: 内容 :param to_addrs: 接收者 :param attachment_list: 附件(默认空,格式[{"path":"文件路径","name":"显示文件名"}]) :return: """</span> <span class="token comment"># 获取SMTP实例</span> smtp <span class="token operator">=</span> self<span class="token punctuation">.</span>get_smtp<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># 获取邮件消息</span> message <span class="token operator">=</span> self<span class="token punctuation">.</span>get_message<span class="token punctuation">(</span>subject<span class="token punctuation">,</span> text<span class="token punctuation">,</span> subtype<span class="token punctuation">)</span> <span class="token comment"># 处理附件和内嵌</span> self<span class="token punctuation">.</span>attach_attachment<span class="token punctuation">(</span>message<span class="token punctuation">,</span> text<span class="token punctuation">,</span> subtype<span class="token punctuation">,</span> attachment_list<span class="token punctuation">)</span> <span class="token comment"># 发送邮件</span> self<span class="token punctuation">.</span>send_email<span class="token punctuation">(</span>smtp<span class="token punctuation">,</span> message<span class="token punctuation">,</span> to_addrs<span class="token punctuation">)</span>if name == 'main':
<span class="token comment"># region 发送文本格式邮件</span> <span class="token comment"># 实例发送网易邮件</span> <span class="token comment"># email163 = Email163()</span> <span class="token comment"># # 主题</span> <span class="token comment"># subject = 'Python发送邮件'</span> <span class="token comment"># # 内容</span> <span class="token comment"># text = '这是使用Python发送的文本格式邮件测试!'</span> <span class="token comment"># # 接收者(用list[str])</span> <span class="token comment"># to_addrs = ['980338974@qq.com']</span> <span class="token comment"># # 调用统一函数main</span> <span class="token comment"># email163.main(subject, text, to_addrs)</span> <span class="token comment"># endregion</span> <span class="token comment"># 发送HTML格式,附件格式,HTML内嵌图片格式公用内容</span> html_text <span class="token operator">=</span> <span class="token triple-quoted-string string">""" <h1>这是使用Python发送的HTML格式邮件测试,我是h1</h1> <a href="http://t.csdn.cn/p58Yf">我是一个链接</a> <table> <th>我是表格列头</th> <tr> <td bgcolor="PowderBlue">我是有颜色的表单元格</td> </tr> </table> <h3>CSDN:</h3> <img src="cid:csdn"> """</span> <span class="token comment"># region 发送HTML格式邮件</span> <span class="token comment"># # 实例发送网易邮件</span> <span class="token comment"># email163_html = Email163('html')</span> <span class="token comment"># # 主题</span> <span class="token comment"># subject = 'Python发送邮件'</span> <span class="token comment"># # 接收者(用list[str])</span> <span class="token comment"># to_addrs = ['980338974@qq.com']</span> <span class="token comment"># # 调用统一函数main</span> <span class="token comment"># email163_html.main(subject, html_text, to_addrs)</span> <span class="token comment"># endregion</span> <span class="token comment"># region 发送带附件邮件</span> <span class="token comment"># # 实例发送网易邮件</span> <span class="token comment"># email163_html = Email163('html')</span> <span class="token comment"># # 主题</span> <span class="token comment"># subject = 'Python发送邮件'</span> <span class="token comment"># # 接收者(用list[str])</span> <span class="token comment"># to_addrs = ['980338974@qq.com']</span> <span class="token comment"># # 调用上传附件</span> <span class="token comment"># attachment_list = [{"path": "./attachment.txt", "name": "1.txt"}]</span> <span class="token comment"># # 调用统一函数main</span> <span class="token comment"># email163_html.main(subject, html_text, to_addrs, Email163.ATTACHMENT, attachment_list)</span> <span class="token comment"># endregion</span> <span class="token comment"># region 发送HTML内嵌图片邮件</span> <span class="token comment"># # 实例发送网易邮件</span> <span class="token comment"># email163_html = Email163('html')</span> <span class="token comment"># # 主题</span> <span class="token comment"># subject = 'Python发送邮件'</span> <span class="token comment"># # 接收者(用list[str])</span> <span class="token comment"># to_addrs = ['980338974@qq.com']</span> <span class="token comment"># # 调用上传附件</span> <span class="token comment"># attachment_list = [{"path": "./csdn.gif", "name": "csdn"}]</span> <span class="token comment"># # 调用统一函数main</span> <span class="token comment"># email163_html.main(subject, html_text, to_addrs, Email163.EMBEDDED, attachment_list)</span> <span class="token comment"># endregion</span>
以上就是关于用Python发送邮件的基本用法了,还有其他的邮箱也都可以,其实方法类似,一样注册邮箱,开通服务,然后登录验证授权码,构造邮件头,构造邮件正文,上传附件…等,有啥疑问的欢迎大家评论留言,感谢大家支持!
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem