Python自动发邮件可使用smtplib
库和yagmail
库。
Python提供smtplib
模块,该模块定义了一个SMTP客户端会话对象,
可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。
yagmail
可以更简单的来实现自动发邮件功能。
使用smtplib
模块发送邮件
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,
它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
Python的smtplib
提供了一种很方便的途径发送电子邮件。
它对smtp协议进行了简单的封装。
Python创建 SMTP 对象语法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
参数说明:
- host: SMTP 服务器主机。 可以指定主机的ip地址或者域名如:
runoob.com
,这个是可选参数。 - port: 如果提供了 host 参数, 需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。
local_hostname
: 如果 SMTP 在本机上,只需要指定服务器地址为 localhost 即可。
Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
参数说明:
from_addr
: 邮件发送者地址。to_addrs
: 字符串列表,邮件发送地址。msg
: 发送消息
这里要注意一下第三个参数,msg
是字符串,表示邮件。
已知邮件一般由标题,发信人,收件人,邮件内容,
附件等构成,发送邮件的时候,要注意 msg
的格式。
这个格式就是 smtp 协议中定义的格式。
import smtplib
from email.mime.text import MIMEText
from cfg import email_cfg
邮箱服务器地址,设置服务器邮箱为smtp.163.com。给定邮箱的账号及密码。此账号的邮箱smtp服务需要提前开启并获取到授权码,否则会失败。
mailserver = "smtp.163.com"
username_send = email_cfg['user']
password = email_cfg['passwd']
列出收件人信息,当多个收件人时可以用逗号隔开,这个列子是将邮件内容发送给了自己。
username_recv = email_cfg['user']
写入想要发送的邮件内容及主题。
mail = MIMEText("hello!I'm samele")
mail['Subject'] = 'python'
设定发件人及收件人信息。
mail['From'] = username_send
mail['To'] = username_recv
连接邮箱服务器,smtp的端口号是465。 如果连接QQ邮箱的话使用如下代码:
smtp=smtplib.SMTP_SSL('smtp.qq.com',port=465)
smtp =smtplib.SMTP_SSL(mailserver,port=465)
登录服务器邮箱,使用邮箱开始发送邮件。
smtp.login(username_send,password)
(235, b'Authentication successful')
sendmail()
发送邮件,参数分别是发送者,接收者,第三个是把上面的发送邮件的内容变成字符串。
smtp.sendmail(username_send,username_recv,mail.as_string())
{}
发送完毕后关闭SMTP会话。
smtp.quit()
(221, b'Bye')
# !pip3 install yagmail
Collecting yagmail Downloading yagmail-0.15.293-py2.py3-none-any.whl.metadata (2.9 kB) Collecting premailer (from yagmail) Downloading premailer-3.10.0-py2.py3-none-any.whl.metadata (15 kB) Collecting lxml (from premailer->yagmail) Downloading lxml-5.3.1-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (3.7 kB) Collecting cssselect (from premailer->yagmail) Downloading cssselect-1.2.0-py2.py3-none-any.whl.metadata (2.2 kB) Collecting cssutils (from premailer->yagmail) Downloading cssutils-2.11.1-py3-none-any.whl.metadata (8.7 kB) Requirement already satisfied: requests in /opt/conda/lib/python3.12/site-packages (from premailer->yagmail) (2.32.3) Collecting cachetools (from premailer->yagmail) Downloading cachetools-5.5.1-py3-none-any.whl.metadata (5.4 kB) Collecting more-itertools (from cssutils->premailer->yagmail) Downloading more_itertools-10.6.0-py3-none-any.whl.metadata (37 kB) Requirement already satisfied: charset_normalizer<4,>=2 in /opt/conda/lib/python3.12/site-packages (from requests->premailer->yagmail) (3.4.1) Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.12/site-packages (from requests->premailer->yagmail) (3.10) Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/lib/python3.12/site-packages (from requests->premailer->yagmail) (2.3.0) Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.12/site-packages (from requests->premailer->yagmail) (2024.12.14) Downloading yagmail-0.15.293-py2.py3-none-any.whl (17 kB) Downloading premailer-3.10.0-py2.py3-none-any.whl (19 kB) Downloading cachetools-5.5.1-py3-none-any.whl (9.5 kB) Downloading cssselect-1.2.0-py2.py3-none-any.whl (18 kB) Downloading cssutils-2.11.1-py3-none-any.whl (385 kB) Downloading lxml-5.3.1-cp312-cp312-manylinux_2_28_x86_64.whl (5.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.0/5.0 MB 28.1 MB/s eta 0:00:00 Downloading more_itertools-10.6.0-py3-none-any.whl (63 kB) Installing collected packages: more-itertools, lxml, cssselect, cachetools, cssutils, premailer, yagmail Successfully installed cachetools-5.5.1 cssselect-1.2.0 cssutils-2.11.1 lxml-5.3.1 more-itertools-10.6.0 premailer-3.10.0 yagmail-0.15.293
导入yagmail
库和所需要的参数。
import yagmail
from cfg import email_cfg
连接smtp邮箱服务器。
yag = yagmail.SMTP( user=email_cfg['user'], password=email_cfg['passwd'], host='smtp.163.com')
提前写下邮件内容。
contents = ['This is the body, and here is just text http://somedomain/image.png',
'You can find an audio file attached.'']
send()
发送邮件,第一个参数为接收邮件的邮箱,第二个参数为邮件的主题,第三个参数为邮件内容。
yag.send('alanyers@163.com', 'subject', contents)
{}