python 实现邮件自动发送

目标:用Python实现邮件自动发送,邮件内容:正文、链接、图片,并附上附件,添加抄送。

参考文献:《Python核心编程-第三版》

库:smtplib、email(楼主装的是3.5版,无需安装)

 
import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.application import MIMEApplication


# 第三方 SMTP 服务,设置发送接收邮箱
mail_host = "smtp.mxhichina.com"  # 设置服务器  在邮箱设置中查询
mail_user = ""  # 发送邮箱账号
mail_pass = ""  # 发送邮箱密码

sender = ''#发送邮箱账号
receivers = '' # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
#设置邮件正文
mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.runoob.com">菜鸟教程链接</a></p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""
message = MIMEMultipart()
message['From'] = Header("ABC", 'utf-8')#发送人名字
message['To'] = Header("abcc", 'utf-8')#收件人名字
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
#正文内容
message.attach(MIMEText(mail_msg, 'html', 'utf-8'))

# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)

# 构造附件2,传送当前目录下的 runoob.txt 文件
att2 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="runoob.txt"'
message.attach(att2)

# xlsx类型的附件   
filename=(os.path.basename(path))
xlsxpart = MIMEApplication(open(path,'rb').read())
xlsxpart.add_header('Content-Disposition', 'attachment', filename=('gbk', '', filename))
message.attach(xlsxpart)

# 指定图片为当前目录
fp = open('test.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()

# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
message.attach(msgImage)
try:
    smtpObj = smtplib.SMTP()
    smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号 可在邮箱设置中查询
    smtpObj.login(mail_user, mail_pass)
  smtpObj.sendmail(sender,receivers,message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException:
    print("Error: 无法发送邮件")

用这个代码时,遇到一个困惑,即mail_host(服务器)查询,和SMTP端口查询。

以腾讯企业邮箱为例:

那么,服务器:smtp.exmail.qq.com。

但SMTP端口不能写465,而是25,楼主也不清楚这是什么原理,也是经过多次调试,才知道。如果遇到是别的邮箱,比如163等,先用官方给的端口试一下,实在不行,就用25试一试说不定就有惊喜了。哈哈。

猜你喜欢

转载自blog.csdn.net/weixin_41712808/article/details/79637106
今日推荐