åèèµæï¼
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868325601402299d1e941914a21990ac7861ef4bc2d000
https://blog.csdn.net/Mark_LQ/article/details/51204081?locationNum=3&fps=1
1ãçµåé®ä»¶å¨ç½ç»ä¸ä¼ è¾è¿ç¨ï¼å件人 -> MUA -> MTA -> MTA -> è¥å¹²ä¸ªMTA -> MDA <- MUA <- æ¶ä»¶äºº
ï¼1ï¼MUAï¼Mail User Agentââé®ä»¶ç¨æ·ä»£çã客æ·ç«¯ç¨äºåéææ¥æ¶é®ä»¶ç软件ï¼å¦Outlookãææºç«¯çåç±»é®ä»¶ç®¡çAPPçã
ï¼2ï¼MTAï¼Mail Transfer Agentââé®ä»¶ä¼ è¾ä»£çãEmailæå¡æä¾åï¼å¦æ°æµªãæçãç½æçã
ï¼3ï¼MDAï¼Mail Delivery Agentââé®ä»¶æé代çãé®ä»¶æç»ç®æ é®ç®±æå¡å¨ã
2ãæ¶åçµåé®ä»¶çç¨åºæ¯MUAçåè½ï¼ä½¿ç¨SMTPï¼Simple Mail Transfer Protocolï¼åè®®åéé®ä»¶å°MTAï¼ä½¿ç¨POPï¼Post Office Protocolï¼åè®®æIMAPï¼Internet Message Access Protocolï¼åè®®ä»MDAæ¶åé®ä»¶ä¿¡æ¯ãIMAPåè®®ä¸ä½è½æ¥æ¶æ¶ä»¶ç®±é®ä»¶ï¼è¿å¯ä»¥æä½é®ç®±å ¶ä»ç®å½ï¼ä½POPåè®®åªè½ä»æ¶ä»¶ç®±æ¥æ¶é®ä»¶ãä¸é¢æ¯æçå¦ä¹ 代ç ï¼
åéé®ä»¶ï¼
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.utils import parseaddr, formataddr
from email.mime.base import MIMEBase
import smtplib
import os
#é®ä»¶æ£æç±»åæ ¼å¼å¸¸é-HTML
MAILTYPE_HTML = 'html'
#é®ä»¶æ£æç±»åæ ¼å¼å¸¸é-ææ¬
MAILTYPE_TEXT = 'plain'
#对å¤åé®ä»¶å°åï¼å件人å称<é®ç®±å°å>ï¼è¿è¡ç¼ç
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr(( \
Header(name, 'utf-8').encode(), \
addr.encode('utf-8') if isinstance(addr, unicode) else addr))
#ç¨äºåéé®ä»¶çç±»
class EmailSender(object):
def __init__(self):
#é®ä»¶æ é¢
self.mTitle = None
#å件人å°å
self.mFrom = None
#æ¶ä»¶äººå°å
self.mTo = None
        #å件人å称
self.mFromName = None
        #æ¶ä»¶äººå称
self.mToName = None
        #æ£æ
self.mText = None
        #æ£æç±»åï¼é»è®¤ä¸ºææ¬
self.mType = MAILTYPE_TEXT
        #ç¼ç æ ¼å¼
self.mCode = 'utf-8'
        #é件å表
self.attachs = None
#å¤æé件类åï¼0-æªç¥ 1-å¾ç 2-å
¶ä»
def getAttachType(self, fname):
result = 0
try:
ext = os.path.splitext(fname)
sExt = None
if ext != None and len(ext) == 2:
sExt = ext[1].lower()
if sExt == '.png' or sExt == '.bmp' or sExt == '.jpeg' or sExt == '.jpg':
result = 1
else:
result = 2
except BaseException, e:
result = 0
return result
#æ·»å é件å°æ¶æ¯ï¼0-æ·»å 失败ï¼1-æ·»å æå
def addAttach(self, fname, msg, id):
if msg == None or not isinstance(msg, MIMEMultipart):
return 0
        #é件类å-->aType
aType = self.getAttachType(fname)
if aType > 0:
           #æ件å-->sFilename
sFilename = os.path.split(fname)[1]
            #æ©å±å-->sExt
sExt = sFilename.split('.')[1]
with open(fname, 'rb') as f:
mime = None
#æ ¹æ®æ件类åæ¼è£
é件对象-->mime
if aType == 1:
mime = MIMEBase('image', sExt, filename=sFilename)
if mime != None:
# å ä¸å¿
è¦ç头信æ¯:
mime.add_header('Content-Disposition', 'attachment', filename=sFilename)
mime.add_header('Content-ID', '<%s>' % id)
mime.add_header('X-Attachment-Id', id)
# æé件çå
容读è¿æ¥:
mime.set_payload(f.read())
# ç¨Base64ç¼ç :
encoders.encode_base64(mime)
# æ·»å å°MIMEMultipart:
msg.attach(mime)
return 1
return 0
    #åéé®ä»¶ï¼smtp_server-æå¡å¨ passwd-å¯ç
def send(self, smtp_server, passwd):
msg = None
s = None
#æ¶æ¯ç±»å
if self.mType == MAILTYPE_HTML:
s = MIMEText(self.mText, 'html', self.mCode)
else:
s = MIMEText(self.mText, 'plain', self.mCode)
#å¦æ没æé件åç´æ¥å¤çæ¶æ¯ï¼å¦åæ·»å é件
if self.attachs == None or not isinstance(self.attachs, list) or len(self.attachs) == 0:
msg = s
else:
msg = MIMEMultipart()
msg.attach(s)
id = 0
for fname in self.attachs:
if self.addAttach(fname, msg, '%d' % id) == 1:
id = id + 1
#æ¶æ¯åéå°å
msg['From'] = _format_addr(('%s' if self.mFromName == None else self.mFromName + '<%s>') % self.mFrom)
#æ¶æ¯ç®æ å°å
msg['To'] = _format_addr(('%s' if self.mToName == None else self.mToName + '<%s>') % self.mTo)
#æ¶æ¯ä¸»é¢
msg['Subject'] = Header(self.mTitle, self.mCode).encode()
#åé
server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
server.login(self.mFrom, passwd)
server.sendmail(self.mFrom, [self.mTo], msg.as_string())
server.quit()
#å符串ç¼ç
def encode(str, code):
h = Header(str, code)
return h.encode()
#æµè¯å
¥å£
def Test():
sender = EmailSender()
sServer = raw_input('Server:')
sPass = raw_input('Password:')
sender.mFrom = raw_input('From:')
sender.mFromName = raw_input('From name:')
sender.mTo = raw_input('To:')
sender.ToName = raw_input('To name:')
sender.mTitle = encode(raw_input('Title:'), "utf-8")
q = raw_input('mail type? 1-html, default - text')
if q == '1':
sender.mType = MAILTYPE_HTML
else:
sender.mType = MAILTYPE_TEXT
sender.mText = raw_input('Text:')
sender.attachs = []
while True:
s = raw_input('attach filename:')
if s == '':
break
else:
sender.attachs.append(s)
sender.send(sServer, sPass)
注ï¼ç±äºä¸ªäººåªæå è´¹é®ç®±ï¼å åå°è¯äºç½æãæ°æµªãæççSMTPæå¡ï¼åæªæåï¼æå使ç¨é¿éäºçé®ç®±æå¡æµè¯éè¿ã
æ¥æ¶é®ä»¶ï¼
import poplib, base64
from email.parser import Parser
from email.utils import parseaddr
from email.header import decode_header
from email.header import Header
#ç¨äºæ¥æ¶ææ°æ¶æ¯çæ¹æ³
def Pop3Receive(server, addr, passwd):
result = None
popserver = poplib.POP3(server)
popserver.user(addr)
popserver.pass_(passwd)
resp, mails, octets = popserver.list()
index = len(mails)
if index >= 1:
resp, lines, octets = popserver.retr(index)
sContent = '\r\n'.join(lines)
result = Parser().parsestr(sContent)
popserver.quit()
return result
#ç¨äºè§£ç å符串
def decode_str(s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
pre = '=?'+charset + '?'
if value.startswith(pre) and value.endswith('?='):
v = value.split('?')
if v and len(v) > 2:
value = v[len(v) - 2]
return value
#ç¨äºè¯å«æ¶æ¯ç¼ç æ ¼å¼
def guess_charset(msg):
# å
ä»msg对象è·åç¼ç :
charset = msg.get_charset()
if charset is None:
# å¦æè·åä¸å°ï¼åä»Content-Typeå段è·å:
content_type = msg.get('Content-Type', '').lower()
pos = content_type.find('charset=')
if pos >= 0:
charset = content_type[pos + 8:].strip()
return charset
#ç¨äºè§£æé®ä»¶çç±»
class Mail(object):
def __init__(self, msg, attpath):
#æ é¢
self.title = None
#å件人å称
self.fromName = None
#å件人å°å
self.fromAddr = None
#æ¶ä»¶äººå称
self.toName = None
#æ¶ä»¶äººå°å
self.toAddr = None
#é件å表
self.attachs = []
#æ£æå表
self.contents = []
#é误信æ¯
self.errors = []
#é件åæ¾ä½ç½®
self.attpath = attpath
if msg != None:
for header in ['From', 'To', 'Subject']:
value = msg.get(header, '')
if value:
if header=='Subject':
self.title = decode_str(value)
else:
# éè¦è§£ç Emailå°å:
hdr, addr = parseaddr(value)
name = decode_str(hdr)
if header == 'From':
self.fromName = name
self.fromAddr = addr
else:
self.toName = name
self.toAddr = addr
self.parseContent(msg)
#解æé®ä»¶æ£æï¼å
æ¬é件ï¼
def parseContent(self, msg):
if (msg.is_multipart()):
#éå½è§£æ
parts = msg.get_payload()
for n, part in enumerate(parts):
self.parseContent(part)
else:
# é®ä»¶å¯¹è±¡ä¸æ¯ä¸ä¸ªMIMEMultipart,
# å°±æ ¹æ®content_typeå¤æ:
content_type = msg.get_content_type()
if content_type=='text/plain' or content_type=='text/html':
# 纯ææ¬æHTMLå
容:
content = msg.get_payload(decode=True)
# è¦æ£æµææ¬ç¼ç :
charset = guess_charset(msg)
if charset:
content = content.decode(charset)
self.contents.append(content)
else:
# ä¸æ¯ææ¬,ä½ä¸ºé件å¤ç
# å
·ä½ä»£ç åèèªåèèµæ2
#解æé件æ件å
fname = msg.get_filename()
if fname:
#解ç æ件å
h = Header(fname)
dh = decode_header(h)
fname = dh[0][0]
if dh[0][1]: # å¦æå
å«ç¼ç çæ ¼å¼ï¼åæç
§è¯¥æ ¼å¼è§£ç
fname = unicode(fname, dh[0][1])
fname = fname.encode("utf-8")
#ä¿åé件
try:
data = msg.get_payload(decode=True)
with open(self.attpath + fname, 'wb') as att_file:
self.attachs.append(fname)
att_file.write(data)
except BaseException, e:
self.errors.append('error on save %s:%s' % (fname, e.message))
#æµè¯å
¥å£
def Test():
#è¾å
¥pop3æå¡å¨å°å
server = raw_input('POP3 Server:')
#è¾å
¥é®ç®±å°å
addr = raw_input('Username:')
#è¾å
¥å¯ç
passwd = raw_input('Password:')
#æ¥æ¶ææ°é®ä»¶-->msg
msg = Pop3Receive(server, addr, passwd)
if msg != None:
#è¾å
¥é件åæ¾ä½ç½®
attpath = raw_input('path to save attachs:')
if not attpath:
attpath = ''
else:
if attpath != '' and not attpath.endswith('\\'):
attpath = attpath + '\\'
#解æé®ä»¶
mail = Mail(msg, attpath)
if mail:
print 'title:', mail.title
print 'from:%s<%s>' % (mail.fromName, mail.fromAddr)
print 'to:%s<%s>' % (mail.toName, mail.toAddr)
print 'contents:', mail.contents
print 'attachs:', mail.attachs
print 'errors:', mail.errors
ä»å¤©å°±å¦ä¹ å°è¿éï¼ä¸ä¸èä»æ°æ®åºè®¿é®å¼å§å¦ä¹ ã