python使用SMTP发送email

python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。

smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。

email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。

#连接部分
import smtplib

smtp = smtplib.SMTP() 
smtp.connect('smtp.163.com,25') 
smtp.login(username, password) 
smtp.sendmail(sender, receiver, msg.as_string()) 
smtp.quit()
说明:

smtplib.SMTP():实例化SMTP()

connect(host,port):

host:指定连接的邮箱服务器。常用邮箱的smtp服务器地址如下:

新浪邮箱:smtp.sina.com,新浪VIP:smtp.vip.sina.com,搜狐邮箱:smtp.sohu.com,126邮箱:smtp.126.com,139邮箱:smtp.139.com,163网易邮箱:smtp.163.com。

port:指定连接服务器的端口号,默认为25.

login(user,password):

user:登录邮箱的用户名。

password:登录邮箱的密码,如果用的是网易邮箱,网易邮箱一般是网页版,需要用到客户端密码,需要在网页版的网易邮箱中设置授权码,该授权码即为客户端密码,在腾讯的网页版也可以找到其授权码.

sendmail(from_addr,to_addrs,msg,...):

from_addr:邮件发送者地址

to_addrs:邮件接收者地址。字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'

msg:发送消息:邮件内容。一般是msg.as_string():as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。

quit():用于结束SMTP会话。

网易网页版的设置中有这一项:

email模块

其中对于SMTPMultip里的参数进行一下说明
常见的multipart类型有三种:multipart/alternative, multipart/related和multipart/mixed。

邮件类型为"multipart/alternative"的邮件包括纯文本正文(text/plain)和超文本正文(text/html)。

邮件类型为"multipart/related"的邮件正文中包括图片,声音等内嵌资源。

邮件类型为"multipart/mixed"的邮件包含附件。向上兼容,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型。
#coding:utf-8
import smtplib


#设置smtplib使用的参数
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

smptserver='stmp.163.com'
username='****@163.com'
password=''
sender='****@163.com'
receiver=['@***.com']
#主题
subject='python email test'
#构造邮件对象MIMEMultipart对象
msg=MIMEMultipart('mixed')
msg['subject']=subject
msg['Form']='*****@163.com'
msg['To']=';'.join(receiver)

#构造文本内容
text="Hi\nthis is python test\n Can you receive email?you can address you problem with\n http://www.baidu.com"
text_plain=MIMEText(text,'plain','utf-8')
msg.attach(text_plain)

#构造图片链接
sendimage=open(r'E:\pythontest\EXO.jpg','rb').read()
image=MIMEImage(sendimage)
image.add_header('Content_ID','<image>')
image["Content-Disposition"]='attachment;filename="EXO.jpg"'
msg.attach(image)

#构造html
html="""
<html>
    <head></head>
    <body>
        <p> Hi<br>
        <a href="http://www.baidu.com></a>
    </body>        
</html>
"""
text_html=MIMEText(html,'html','utf-8')
text_html["Content-disposition"]='attachment;filename=texthtml.html'
msg.attach(text_html)

#构造附件
send_file=open(r'E:\pythontest\Halloween.txt','rb').read()
text_att=MIMEText(send_file,'base64','utf-8')
text_html["Content-disposition"]='attachment;filename=Halloween.txt'
msg.attach(text_att)
#发送邮件
#登录
try:
    # smtp=smtplib.SMTP
    # smtp.connect('stmp.163.com,25')
    # smtp.login(username,password)
    # smtp.sendmail(sender,receiver,msg.as_string())
    # smtp.quit()
    print("sendemail success")
    # ssl登录
    smtp = smtplib.SMTP_SSL('smtp.163.com')
    #set_debuglevel(1)是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
    smtp.set_debuglevel(1)
    smtp.ehlo('smtp.163.com')
    smtp.login(username, password)
    smtp.quit()
    print("sendemail success")
except smtplib.SMTPException:
    print("Error :unale to send email")

交互信息

POP3邮局协议

IMAP因特网消息传输协议

STMP简单邮件传输协议

       

用来接收邮件

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr

import poplib

# 输入邮件地址, 口令和POP3服务器地址:
email = '###@163.com'
#密码什么的自己输入
password = input('Password: ')
pop3_server = 'pop.163.com'

# 文本邮件的内容也是str,还需要检测编码,否则,非UTF-8编码的邮件都无法正常显示
def guess_charset(msg):
    charset = msg.get_charset()
    if charset is None:
        content_type = msg.get('Content-Type', '').lower()
        pos = content_type.find('charset=')
        if pos >= 0:
            charset = content_type[pos + 8:].strip()
    return charset

def decode_str(s):

# decode_header()返回一个list  偷懒,只取了第一个元素

    value, charset = decode_header(s)[0]
    if charset:
        value = value.decode(charset)
    return value

def print_info(msg, indent=0):
    if indent == 0:
        for header in ['From', 'To', 'Subject']:
            value = msg.get(header, '')
            if value:
                if header=='Subject':
                    value = decode_str(value)
                else:
                    hdr, addr = parseaddr(value)
                    name = decode_str(hdr)
                    value = u'%s <%s>' % (name, addr)
            print('%s%s: %s' % ('  ' * indent, header, value))
    if (msg.is_multipart()):
        parts = msg.get_payload()
        for n, part in enumerate(parts):
            print('%spart %s' % ('  ' * indent, n))
            print('%s--------------------' % ('  ' * indent))
            print_info(part, indent + 1)
    else:
        content_type = msg.get_content_type()
        if content_type=='text/plain' or content_type=='text/html':
            content = msg.get_payload(decode=True)
            charset = guess_charset(msg)
            if charset:
                content = content.decode(charset)
            print('%sText: %s' % ('  ' * indent, content + '...'))
        else:
            print('%sAttachment: %s' % ('  ' * indent, content_type))

# 连接到POP3服务器: poplib.POP3_SSL(host)使用ssl连接也可以
server = poplib.POP3(pop3_server)
# 可以打开或关闭调试信息:
# server.set_debuglevel(1)
# 可选:打印POP3服务器的欢迎文字:
print(server.getwelcome().decode('utf-8'))
# 身份认证:
server.user(email)
server.pass_(password)
# stat()返回邮件数量和占用空间:
print('Messages: %s. Size: %s' % server.stat())
# list()返回所有邮件的编号:
resp, mails, octets = server.list()
# 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]
#print(mails)
# 获取最新一封邮件, 注意索引号从1开始:
index = len(mails)
resp, lines, octets = server.retr(index)
# lines存储了邮件的原始文本的每一行,
# 可以获得整个邮件的原始文本:
msg_content = b'\r\n'.join(lines).decode('utf-8')
# 稍后解析出邮件:
msg = Parser().parsestr(msg_content)
print_info(msg)
# 可以根据邮件索引号直接从服务器删除邮件:
# server.dele(index)
# 关闭连接:
server.quit()

详细解析,上面的代码执行结果

 python的poplib也针对这些命令分别提供了对应的方法,上面在第二列里已经标出来。收取邮件的过程一般是:
1. 连接pop3服务器 (poplib.POP3.__init__)
2. 发送用户名和密码进行验证 (poplib.POP3.user poplib.POP3.pass_)
3. 获取邮箱中信件信息 (poplib.POP3.stat)
4. 收取邮件 (poplib.POP3.retr)
5. 删除邮件 (poplib.POP3.dele)
6. 退出 (poplib.POP3.quit)

猜你喜欢

转载自blog.csdn.net/qq_37312720/article/details/82989451