Python PIL Image图片显示系列
282
2022-08-17
用Python发一封图文并茂的邮件 荐(python邮件附件)
环境
虽说就发邮件这么个小事,很容易兼容Python2, Python3, 但是大家还是拥抱Python3吧, 我这里没有做python2的兼容写法,所以需要python3以上。
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789
邮件的格式
邮件的格式主要就两种: plain和html
plain就像一个普通的文本, 没有格式。
html就如其名, 是html的格式,相当于一个邮件就是一个 静态 的网页,这样的话可玩性就很高了,你可以通过css控制表现形式.
注意: 这里的css虽然语法一样,但,是否与浏览器渲染结果完全一致, 是不一定的。
那么可能有人要问了,我要发一个动态的网页怎么办? 发个链接呀
邮箱账号
无论是QQ邮箱抑或网易邮箱都是没有问题的,重要的是有一个可以通过smtp服务器发送邮件的账户名及密码,这里大家百度吧。
发送邮件的代码
因为发送邮件的代码在下面每个步骤都是一样的所以线贴出来
def send_email(msg, mail_to, smtp_host, smtp_username, smtp_password, subject, from_):
msg["Subject"] = Header(subject, "utf-8")
msg["From"] = Header(from_, "utf-8")
if not isinstance(mail_to, list):
mail_to = [mail_to]
msg["To"] = COMMASPACE.join(mail_to)
try:
print("准备连接smtp邮件服务器: %s" % smtp_host)
client = smtplib.SMTP(smtp_host)
print("连接成功")
# client = smtplib.SMTP("localhost")
# client.set_debuglevel(1)
# print(self.mail_user, self.mail_pass)
client.login(smtp_username, smtp_password)
print("登录成功")
# print("=====>", self.mail_from, mail_to)
print("通过邮箱[%s]发送邮件给 %s" % (smtp_username, COMMASPACE.join(mail_to)))
client.sendmail(smtp_username, mail_to, msg.as_string())
print("发送成功...")
return True
except Exception:
print("发送邮件失败")
finally:
client.quit()
如果遇到邮件发送的问题可以将client.set_debuglevel(1)的注释取消,这样会显示足够多的debug信息用于排查问题。
发送本地图片
这里发送图片的意思是指, 图片内嵌在邮件中而不是以附件的形式出现。
效果如下:
代码如下:
EMAIL_IMAGE_TEMPLATE = """
mime_image = MIMEImage(img_bytes.getvalue())
# 注意: 一定需要<>括号
mime_image.add_header("Content-ID", "<%s>" % image_name)
msg.attach(mime_image)
# 渲染邮件文本内容
text = tpl.render(image_name=image_name)
msg_alternative = MIMEMultipart("alternative")
msg_alternative.attach(MIMEText(text, "html", "utf-8"))
msg.attach(msg_alternative)
return msg
这里很有意思一点是用BytesIO模拟file-like对象。这里需要安装PIL哦
发送一个带样式的静态网页
前面的代码已经足够说明图片怎么发了,这里通过一个写了css样式的表格进行演示
效果如下:
代码如下:
EMAIL_TEMPLATE = """
table
{
border-collapse: collapse;
margin: 0 auto;
text-align: center;
}
table td, table th
{
border: 1px solid #cad9ea;
color: #666;
height: 30px;
}
table thead th
{
background-color: #CCE8EB;
width: 100px;
}
table tr:nth-child(odd)
{
background: #fff;
}
table tr:nth-child(even)
{
background: #F5FAFA;
}
一共有以下{{record_size}}条数据
{% for label in labels %} {% endfor %} {{label}}
{% for label in labels %}
{% endfor %}
{% for item in items %}
{% for value in item %}
{% endfor %}
{% endfor %}
"""
def create_html_content():
tpl = Template(EMAIL_TEMPLATE)
record_size = 10
label_size = 5
labels = ["label-%s" % i for i in range(label_size)]
items = []
for _ in range(record_size):
item = ["item-%s" % value_index for value_index in range(label_size)]
items.append(item)
text = tpl.render(record_size=record_size, items=items, labels=labels)
msg = MIMEText(text, "html", "utf-8")
return msg
源代码地址
https://github.com/youerning/blog/tree/master/sendmail
后记
其实发送一个附件也是不错的方式,比如发送一个生成的PDF, PDF是一个很棒的文件格式。但是PDF暂时没用到,以后有机会再说吧。最后要注意的是,手机端的显示效果跟电脑网页版的显示效果是不一样的。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~