学习笔记(二十一)—— 使用SMTP发送电子邮件

Posted 别呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记(二十一)—— 使用SMTP发送电子邮件相关的知识,希望对你有一定的参考价值。

一、常用的电子邮件协议

常用的电子邮件协议有SMTPPOP3IMAP4,它们都隶属于TCP/IP协议簇,默认状态下,分别通过TCP端口25110143建立连接。下面分别对其进行简单介绍

1.1、SMTP协议

SMTP的全称是"SimpleMailTransferProtocol",即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服务器就是遵循SMTP协议的发送邮件服务器。SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录SMTP服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰。

SMTP已是事实上的E-Mail传输的标准。


1.2、POP协议

POP邮局协议负责从邮件服务器中检索电子邮件。它要求邮件服务器完成下面几种任务之一:从邮件服务器中检索邮件并从服务器中删除这个邮件;从邮件服务器中检索邮件但不删除它;不检索邮件,只是询问是否有新邮件到达。POP协议支持多用户互联网邮件扩展,后者允许用户在电子邮件上附带二进制文件,如文字处理文件和电子表格文件等,实际上这样就可以传输任何格式的文件了,包括图片和声音文件等。在用户阅读邮件时,POP命令所有的邮件信息立即下载到用户的计算机上,不在服务器上保留。POP3(PostOfficeProtocol3)即邮局协议的第3个版本,是因特网电子邮件的第一个离线协议标准。


1.3、IMAP协议

互联网信息访问协议(IMAP)是一种优于POP的新协议。和POP一样,IMAP也能下载邮件、从服务器中删除邮件或询问是否有新邮件,但IMAP克服了POP的一些缺点。例如,它可以决定客户机请求邮件服务器提交所收到邮件的方式,请求邮件服务器只下载所选中的邮件而不是全部邮件。客户机可先阅读邮件信息的标题和发送者的名字再决定是否下载这个邮件。通过用户的客户机电子邮件程序,IMAP可让用户在服务器上创建并管理邮件文件夹或邮箱、删除邮件、查询某封信的一部分或全部内容,完成所有这些工作时都不需要把邮件从服务器下载到用户的个人计算机上。支持种IMAP的常用邮件客户端有:ThunderMail,Foxmail,MicrosoftOutlook等。


电子邮件传输协议的运用

Internet上传送电子邮件是通过一套称为邮件服务器的程序进行硬件管理并储存的。与个人计算机不同,这些邮件服务器及其程序必须每天24小时不停地运行,否则就不能收发邮件了,简单邮件传输协议SMTP(SimpleMailTransferProtocol)和邮局协议POP(PostOfficeProtocol)是负责用客户机/服务器模式发送和检索电子邮件的协议。


二、SMTP使用

准备:导入email模块:

pip install pyemail

在Python中, smtplib模块定义了一个SMTP客户端会话对象,该对象可用于通过SMTP或ESMTP侦听器守护程序将邮件发送到任何Internet计算机。(Python 2.3或更高版本默认自带smtplib模块,无需额外安装。)

发送邮件

  • 邮件发送方(发送方地址,发送方客户端授权密码,SMTP服务器地址)
  • 邮件内容
  • 邮件接收方

示例代码1(发送文本)

import smtplib
from email.mime.text import MIMEText

#邮箱这些我就不方便写了哈
msg_from = '11xxxx@qq.com'   #发送方邮箱  
msg_to = 'xxxx@126.com'   #接收方邮箱
pwd = 'xxxxx'   #授权码

subject = '来着python的信'
content = '你完蛋了!!!'
#构造邮件
msg = MIMEText(content)   #msg邮件对象
msg['Subject'] = subject
msg['To'] = msg_to
msg['From'] = msg_from

#发送邮件
try:
    ss = smtplib.SMTP_SSL('smtp.qq.com',465)  #465:QQ邮箱服务器的端口号
    ss.login(msg_from,pwd)
    ss.sendmail(msg_from,msg_to,msg.as_string())  #发送
    print('邮箱发送成功!')
except Exception as e:
    print('邮箱发送失败!详情:',e)

示例代码2(发送HTML页面)
html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>selenium</title>
</head>
<body>
    <input id="alert" value="alert" type="button" onclick="alert('this is alert!!!')">
    <input id="confirm" value="confirm" type="button" onclick="confirm('this is confirm!!!')">
    <input id="prompt" value="prompt" type="button" onclick="var name = prompt('请输入用户名:','请输入');document.write(name)">
</body>
</html>

py代码:

import smtplib
from email.mime.text import MIMEText

#邮箱这些我就不方便写了哈
msg_from = '11xxxx@qq.com'   #发送方邮箱 
msg_to = 'xxxx@126.com'   #接收方邮箱
pwd = 'xxxxx'   #授权码

subject = '这是HTML页面'
with open('ex.html','rb') as f:
    content = f.read().decode()
#构造邮件
msg = MIMEText(content,'html','utf-8')   #msg邮件对象
msg['Subject'] = subject
msg['To'] = msg_to
msg['From'] = msg_from

#发送邮件
try:
    ss = smtplib.SMTP_SSL('smtp.qq.com',465)  #465:QQ邮箱服务器的端口号
    ss.login(msg_from,pwd)
    ss.sendmail(msg_from,msg_to,msg.as_string())  #发送
    print('邮箱发送成功!')
except Exception as e:
    print('邮箱发送失败!详情:',e)

结果展示:

以上是关于学习笔记(二十一)—— 使用SMTP发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

Python学习笔记(四十七)SMTP发送邮件

Linux 第十一周上课笔记SMTP服务进阶篇

python学习(二十七)邮件发送及面向对象编程

[python]《Python编程快速上手:让繁琐工作自动化》学习笔记6

Python学习笔记(二十一)

调整Exchange接收连接器延迟参数解决SMTP代发送邮件问题