通过popline和smtp收发邮件

时间:2022-08-21 19:03:33

popline收邮件

  • 用poplib把邮件的原始文本下载到本地;

  • 用email解析原始文本,还原为邮件对象。

导入模块

import poplib

设置参数

host = '写入pop3 服务器地址'# pop3 服务器地址
username = '写入登入邮箱'  #用户名(邮箱地址)
password = '写入邮箱密码'  #密码

连接到POP3服务器

server = poplib.POP3_SSL(host)
print(server.getwelcome())
b'+OK The Microsoft Exchange POP3 service is ready. [UwBIAEEAUABSADAAMQBDAEEAMAAyADAALgBDAEgATgBQAFIAMAAxAC4AcAByAG8AZAAuAHAAYQByAHQAbgBlAHIALgBvAHUAdABsAG8AbwBrAC4AYwBuAA==]'

传递参数进行身份认证

server.user(username)
server.pass_(password)   #如果身份验证正确会显示成功登入
b'+OK User successfully logged on.'

查看邮箱的统计资料

  • 使用.stat( )方法查看邮箱的统计资料,包括邮件总数和总字节数
stat_mail = server.stat()
print('Messages: %s. Size: %s' % stat_mail)
Messages: 5. Size: 179422

查看所有邮件列表

  • 使用 .list( )方法查看邮件列表
resp, mails, octets = server.list()    #list方法返回的是一个元组
print(resp)
print('-----------')
print(mails)
print('-----------')
print(octets)
b'+OK 4 157794'
-----------
[b'1 26042', b'2 25357', b'3 44920', b'4 61475']
-----------
36

获取最新的邮件

  • 使用 .retr( )方法获取指定索引的邮件的内容
index = len(mails)  #注意retr方法的索引是从1开始计算的
resp, lines, octets = server.retr(index) # lines里面一行一行的存储了邮件的原始文本的内容

删除邮件

server.dele(index)  #删除指定index的邮件
b'+OK'

smtp发邮件

  • SMTP:Simple Mail Transfer Protocol
  • Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

纯文本邮件

参数1:邮件正文(hello,world)

参数2:MIME的subtype,传入‘plain’,最终的MIME就是’text/plain’

参数3:代表编码

导入模块

from email.mime.text import MIMEText
from email.header import Header     #用来格式化邮件地址
from email.utils import parseaddr, formataddr
import smtplib  #用于发邮件

编写正文

msg = MIMEText('hello,你好啊!', 'plain', 'utf-8')   #编写邮件正文

输入收发件邮箱,密码和SMTP服务器地址

# 输入Email地址和口令:
from_addr = "填写发送邮件的邮箱"
#输入密码
password = "发邮件的邮箱的密码"
# 输入SMTP服务器地址:这里我们用smtp.partner.outlook.cn,可以根据使用的邮箱类型查
smtp_server = "写入SMTP服务器地址"
# 输入收件人地址:
to_addr = "收件人邮箱"

编辑邮件

#设置发件人,收件人姓名和邮件主题
msg['From'] = formataddr([u'发件人名称',from_addr])
msg['To'] = formataddr([u'收件人名称',to_addr])
msg['Subject'] = Header(u'测试邮件……', 'utf-8').encode()  #主题

发送邮件

server = smtplib.SMTP(smtp_server, 587) # SMTP协议默认端口是25,我的是587
server.set_debuglevel(1)#打印出和SMTP服务器交互的所有信息
server.starttls()   #更换一种认证方式(如果出错删掉这句)
server.login(from_addr, password)#登录服务器
#发送邮件,这里第二个参数是个列表,可以有多个收件人
#邮件正文是一个str,as_string()把MIMEText对象变成str
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

HTML邮件

  • 只需要修改一行代码,把正文换成html格式文本,plain换成html,其他不变
msg = MIMEText('<html><body><h1>Hello</h1>' +
    '<p>send by <a href="http://blog.csdn.net/csdn15698845876">csdn</a>...</p>' +
    '</body></html>', 'html', 'utf-8')

带附件的邮件

  • 带附件的邮件可以看做包含若*分的邮件:文本和各个附件本身,所以,可以构造一个MIMEMultipart对象代表邮件本身,然后往里面加上一个MIMEText作为邮件正文,再继续往里面加上表示附件的MIMEBase对象即可。

导入模块

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.utils import parseaddr, formataddr
import smtplib

编辑有附件的邮件

# 输入Email地址和口令:
from_addr = "填写发送邮件的邮箱"
#输入密码
password = "发邮件的邮箱的密码"
# 输入SMTP服务器地址:这里我们用smtp.partner.outlook.cn,可以根据使用的邮箱类型查
smtp_server = "写入SMTP服务器地址"
# 输入收件人地址:
to_addr = "收件人邮箱"

##############----以下这段跟纯文本邮件有区别-----##############
msg = MIMEMultipart()  #首先创建一个MIMEMultipart对象
#设置发件人,收件人姓名和邮件主题
msg['From'] = formataddr([u'发件人名称',from_addr])
msg['To'] = formataddr([u'收件人名称',to_addr])
msg['Subject'] = Header(u'测试邮件……', 'utf-8').encode()  #主题

# 添加第一个正文部分,邮件正文是MIMEText:
msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))

# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
filename = ['E:\\file\\1.png','E:\\file\\2.txt',   #传入filename列表包含你所要传输的附件的地址
            'E:\\file\\3.docx','E:\\file\\4.pdf',
            'E:\\file\\5.xlsx','E:\\file\\6.rar',
            'E:\\file\\7.py']

for file in filename:    #遍历地址并将其添加到邮件对象的附件中
    name = file.split("\\")[-1]  
    part = MIMEApplication(open(file,'rb').read())   
    part.add_header('Content-Disposition', 'attachment', filename=name)  
    msg.attach(part)  #添加附件

##############----以上这段跟纯文本邮件有区别-----##############

#跟发送纯文本邮件一样发送邮件
server = smtplib.SMTP(smtp_server, 587) # SMTP协议默认端口是25,我使用这个是587
server.set_debuglevel(1)
server.starttls()
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()