我们这里拿新浪邮箱作为发送者,qq邮箱作为接收者
首先,我们要在新浪邮箱开启SMTP服务
网易邮箱的话是在客户授权密码里面开启,并且需要设置授权密码(新浪不用)
然后我们就可以开始写代码了:
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email import encoders
from email.utils import parseaddr,formataddr
import smtplib
from_addr='********'#用来发送邮件的邮箱地址
password='********'#邮箱密码或者是授权密码
to_addr=['******']#目标邮箱地址
smtp_server='smtp.sina.com'#这里是新浪的SMTP服务器地址
#发送的信息格式
content=MIMEText('hello,send by Python','plain','utf-8')
msg=MIMEMultipart()
msg['From']=Header(from_addr)#定义发件人
msg['Subject']=Header('Python 邮件测试','utf-8')#定义邮件名
msg.attach(content)#加上邮件的内容
try:
server=smtplib.SMTP()
server.connect(smtp_server,25)#连接SMTP服务器
server.set_debuglevel(1)#打印调试信息
server.login(from_addr,password)#登陆邮箱
server.sendmail(from_addr,to_addr,msg.as_string())#发送邮件
print("Send successfully!")
except smtplib.SMTPException as e:
server.quit()#退出
print("发送失败")
注意这里的password如果有设置客户授权密码的话就是授权密码,否则就是登陆密码
运行程序,我们就可以看见目标邮箱收到了我们的测试邮件
但是这样我们用25号端口都是以明文发送的,很容易被监视,所以我们可以发送加密邮件,只需要利用SSL:
try:
server=smtplib.SMTP_SSL(smtp_server,"465")
server.set_debuglevel(1)
server.login(from_addr,password)
server.sendmail(from_addr,to_addr,msg.as_string())
print("Send successfully!")
except smtplib.SMTPException as e:
server.quit()
print("发送失败")
具体端口还是要看每个邮箱:
如果我们要带上附件,假如我们这里需要发送一张图片
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email import encoders
from email.utils import parseaddr,formataddr
import smtplib
from_addr='********'#用来发送邮件的邮箱地址
password='********'#邮箱密码或者是授权密码
to_addr=['******']#目标邮箱地址
smtp_server='smtp.sina.com'#这里是新浪的SMTP服务器地址
#发送的信息格式
content=MIMEText('hello,send by Python','plain','utf-8')
msg=MIMEMultipart()
msg['From']=Header(from_addr)#定义发件人
msg['Subject']=Header('Python 邮件测试','utf-8')#定义邮件名
msg.attach(content)#加上邮件的内容
with open('test.png','rb') as f:
mime=MIMEBase('image','png',filename="test.png")
#头信息
mime.add_header('Content-Disposition','attachment',filename="test.png")
mime.add_header('Content-ID','<0>')
mime.add_header('X-Attachment-ID','0')
#把附件内容读进来
mime.set_payload(f.read())
#用Base64编码
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)
try:
server=smtplib.SMTP()
server.connect(smtp_server,25)#连接SMTP服务器
server.set_debuglevel(1)#打印调试信息
server.login(from_addr,password)#登陆邮箱
server.sendmail(from_addr,to_addr,msg.as_string())#发送邮件
print("Send successfully!")
except smtplib.SMTPException as e:
server.quit()#退出
print("发送失败")
如果要把一个图片嵌入到邮件正文中怎么做?直接在HTML邮件中链接图片地址行不行?答案是,大部分邮件服务商都会自动屏蔽带有外链的图片,因为不知道这些链接是否指向恶意网站。
要把图片嵌入到邮件正文中,我们只需按照发送附件的方式,先把邮件作为附件添加进去,然后,在HTML中通过引用src="cid:0"
就可以把附件作为图片嵌入了。如果有多个图片,给它们依次编号,然后引用不同的cid:x
即可。
把上面代码加入MIMEMultipart
的MIMEText
从plain
改为html
,然后在适当的位置引用图片:
msg.attach(MIMEText('<html><body><h1>Hello</h1>' +
'<p><img src="cid:0"></p>' +
'</body></html>', 'html', 'utf-8'))
再次发送,就可以看到图片直接嵌入到邮件正文的效果: