首页 > 上网技巧 > 电脑小技巧 > 几个python邮件发送实现方法源码

几个python邮件发送实现方法源码

时间:2016-09-21 11:17 作者:QQ地带 我要评论

python 邮件发送我们用到imap,pop,imap协议了,今天我们要介绍的是imap4协议,主要用了imap4和mail类,下面小编来为各位介绍一篇关于python 邮件发送实现方法(基础篇),希望文章能够帮助到各位朋友。
 
下面把主要的代码贴一下:
初始化,定义邮件服务器
 
  1. self.IMAP_SERVER='imap.gmail.com' 
  2.         self.IMAP_PORT=993 
  3.         self.M = None 
  4.         self.response 
  5.         self.mailboxes = []  
登录,选择mailbox:
 
  1. self.M = imaplib.IMAP4_SSL(self.IMAP_SERVER, self.IMAP_POR 
  2. rc, self.response = self.M.login(username, password
  3. tye,data = m.M.select()  
邮件搜索:
 
  1. ret, msgnums = m.M.search(None'BODY', datapath) 
获取邮件信息:
status, response = self.M.fetch(id,"(RFC822)")
mailText = response[0][1]
mail_message = email.message_from_string(mailText)
subject = unicode(email.Header.make_header(email.Header.decode_header(mail_message['subject'])))
#print "subject_________:" +subject
mail_from = email.utils.parseaddr(mail_message["from"])[1]
mail_to = email.utils.parseaddr(mail_message["to"])[1]
time = mail_message['Date']
print '['+mail_message['Date']+']'+'\n'+'From:'+mail_from+ ' To:'+mail_to+'\n'+'Subject:'+subject+'\n'
return self.get_first_text_block(mail_message), subject, mail_from, time
maintype = email_message_instance.get_content_maintype() 返回邮件里的内容是何种类型,若为text就比较好处理,如果是multipart,还得遍历email_message_instance去根据不同类型处理。
email.message_from_string(mailText)返回了一个结构体,里面包含了邮件的基本信息
邮件里比较蛋疼的是字符串编码的问题,毕竟大家的邮件格式都不一样,有些是unicode,有些是utf-8,有些是gb2312,还有附件,图片等多种格式,
当然这次也只处理了文本,暂时没有需求去处理附件和图片这些。我都是统一将字符转成unicode去处理的。
字符串处理的时候,可以使用chardet判断字符串类型,读写文件的时候可以用codecs指定读写的字符集类型
 
补充几个例子源码
 
Example 1
 
  1. From project georegistry, under directory georegistry/lib, in source file smtp.py. 
  2. Score: 13 
  3. vote 
  4. vote 
  5. def sendMessage(fromByValue, toByValue, subject, body, headerByName=None): 
  6.     'Send a message using SMTP' 
  7.     # Prepare 
  8.     message = email.message.Message() 
  9.     message.add_header('from', email.utils.formataddr((fromByValue['nickname'], fromByValue['email']))) 
  10.     message.add_header('to', email.utils.formataddr((toByValue['nickname'], toByValue['email']))) 
  11.     message.add_header('subject', subject) 
  12.     message.set_payload(body) 
  13.     if headerByName: 
  14.         for key, value in headerByName.iteritems(): 
  15.             message.add_header(key, value) 
  16.     # Connect to server 
  17.     if fromByValue['smtp'] == 'localhost'
  18.         server = smtplib.SMTP('localhost'
  19.     else
  20.         server = smtplib.SMTP_SSL(fromByValue['smtp'], 465
  21.         if len(fromByValue['username']): 
  22.             server.login(fromByValue['username'], fromByValue['password']) 
  23.     # Send mail 
  24.     try
  25.         server.sendmail(fromByValue['email'], toByValue['email'], message.as_string()) 
  26.     except socket.error, error: 
  27.         raise SMTPError(error) 
  28.     finally
  29.         server.quit() 
 
 
Example 2
 
  1. From project appengine-python3-master, under directory google/appengine/tools/devappserver2/admin, in source file mail_request_handler_test.py. 
  2. Score: 10 
  3. vote 
  4. vote 
  5. def test_send(self): 
  6.     self.mox.StubOutWithMock(mail_request_handler.MailRequestHandler, 
  7.                              'dispatcher'
  8.     handler = mail_request_handler.MailRequestHandler(NoneNone
  9.     handler.dispatcher = self.mox.CreateMock(dispatcher.Dispatcher) 
  10.     handler.dispatcher.add_request( 
  11.         method='POST'
  12.         relative_url='URL'
  13.         headers=[('Content-Type''message/rfc822')], 
  14.         body='mail message'
  15.         source_ip='0.1.0.20'
  16.     message = self.mox.CreateMock(email.message.Message) 
  17.     message.as_string().AndReturn('mail message'
  18.     self.mox.ReplayAll() 
  19.     handler._send('URL', message) 
  20.     self.mox.VerifyAll() 
  21.    
Example 3
 
  1. From project python-sipsimple-master, under directory sipsimple/streams/applications, in source file chat.py. 
  2. Score: 8 
  3. vote 
  4. vote 
  5. def __str__(self): 
  6.         headers = [] 
  7.         if self.sender: 
  8.             headers.append(u'From: %s' % self.sender) 
  9.         for recipient in self.recipients: 
  10.             headers.append(u'To: %s' % recipient) 
  11.         for recipient in self.courtesy_recipients: 
  12.             headers.append(u'cc: %s' % recipient) 
  13.         if self.subject: 
  14.             headers.append(u'Subject: %s' % self.subject) 
  15.         if self.subject is not None
  16.             for lang, translation in self.subject.translations.iteritems(): 
  17.                 headers.append(u'Subject:;lang=%s %s' % (lang, translation)) 
  18.         if self.timestamp: 
  19.             headers.append(u'DateTime: %s' % self.timestamp) 
  20.         if self.required: 
  21.             headers.append(u'Required: %s' % ','.join(self.required)) 
  22.         namespaces = {u''self.standard_namespace} 
  23.         for header in self.additional_headers: 
  24.             if namespaces.get(header.namespace.prefix, None) != header.namespace: 
  25.                 if header.namespace.prefix: 
  26.                     headers.append(u'NS: %s <%s>' % (header.namespace.prefix, header.namespace)) 
  27.                 else
  28.                     headers.append(u'NS: <%s>' % header.namespace) 
  29.                 namespaces[header.namespace.prefix] = header.namespace 
  30.             if header.namespace.prefix: 
  31.                 headers.append(u'%s.%s: %s' % (header.namespace.prefix, header.name, header.value)) 
  32.             else
  33.                 headers.append(u'%s: %s' % (header.name, header.value)) 
  34.         headers.append(u''
  35.         headers = '\r\n'.join(s.encode('cpim-headers'for s in headers) 
  36.         message = Message() 
  37.         message.set_type(self.content_type) 
  38.         if isinstance(self.body, unicode): 
  39.             message.set_param('charset''utf-8'
  40.             message.set_payload(self.body.encode('utf-8')) 
  41.         else
  42.             message.set_payload(self.body) 
  43.         return headers + '\r\n' + message.as_string() 
    
Example 4
 
  1. From project odoo, under directory addons/mail, in source file mail_thread.py. 
  2. Score: 8 
  3. vote 
  4. vote 
  5. def _message_extract_payload(self, message, save_original=False): 
  6.         """Extract body as HTML and attachments from the mail message""" 
  7.         attachments = [] 
  8.         body = u'' 
  9.         if save_original: 
  10.             attachments.append(('original_email.eml', message.as_string())) 
  11.         if not message.is_multipart() or 'text/' in message.get('content-type'''): 
  12.             encoding = message.get_content_charset() 
  13.             body = message.get_payload(decode=True
  14.             body = tools.ustr(body, encoding, errors='replace'
  15.             if message.get_content_type() == 'text/plain'
  16.                 # text/plain -> <pre/> 
  17.                 body = tools.append_content_to_html(u'', body, preserve=True
  18.         else
  19.             alternative = False 
  20.             for part in message.walk(): 
  21.                 if part.get_content_type() == 'multipart/alternative'
  22.                     alternative = True 
  23.                 if part.get_content_maintype() == 'multipart'
  24.                     continue  # skip container 
  25.                 # part.get_filename returns decoded value if able to decode, coded otherwise. 
  26.                 # original get_filename is not able to decode iso-8859-1 (for instance). 
  27.                 # therefore, iso encoded attachements are not able to be decoded properly with get_filename 
  28.                 # code here partially copy the original get_filename method, but handle more encoding 
  29.                 filename=part.get_param('filename'None'content-disposition'
  30.                 if not filename: 
  31.                     filename=part.get_param('name'None
  32.                 if filename: 
  33.                     if isinstance(filename, tuple): 
  34.                         # RFC2231 
  35.                         filename=email.utils.collapse_rfc2231_value(filename).strip() 
  36.                     else
  37.                         filename=decode(filename) 
  38.                 encoding = part.get_content_charset()  # None if attachment 
  39.                 # 1) Explicit Attachments -> attachments 
  40.                 if filename or part.get('content-disposition''').strip().startswith('attachment'): 
  41.                     attachments.append((filename or 'attachment', part.get_payload(decode=True))) 
  42.                     continue 
  43.                 # 2) text/plain -> <pre/> 
  44.                 if part.get_content_type() == 'text/plain' and (not alternative or not body): 
  45.                     body = tools.append_content_to_html(body, tools.ustr(part.get_payload(decode=True), 
  46.                                                                          encoding, errors='replace'), preserve=True
  47.                 # 3) text/html -> raw 
  48.                 elif part.get_content_type() == 'text/html'
  49.                     html = tools.ustr(part.get_payload(decode=True), encoding, errors='replace'
  50.                     if alternative: 
  51.                         body = html 
  52.                     else
  53.                         body = tools.append_content_to_html(body, html, plaintext=False
  54.                 # 4) Anything else -> attachment 
  55.                 else
  56.                     attachments.append((filename or 'attachment', part.get_payload(decode=True))) 
  57.         return body, attachments 
    
Example 5
 
  1. From project openerp-ktv, under directory openerp/addons/mail, in source file mail_message.py. 
  2. Score: 5 
  3. vote 
  4. vote 
  5. def parse_message(self, message, save_original=False): 
  6.         """Parses a string or email.message.Message representing an 
  7.            RFC-2822 email, and returns a generic dict holding the 
  8.            message details. 
  9.            :param message: the message to parse 
  10.            :type message: email.message.Message | string | unicode 
  11.            :param bool save_original: whether the returned dict 
  12.                should include an ``original`` entry with the base64 
  13.                encoded source of the message. 
  14.            :rtype: dict 
  15.            :return: A dict with the following structure, where each 
  16.                     field may not be present if missing in original 
  17.                     message:: 
  18.                     { 'message-id': msg_id, 
  19.                       'subject': subject, 
  20.                       'from': from, 
  21.                       'to': to, 
  22.                       'cc': cc, 
  23.                       'headers' : { 'X-Mailer': mailer, 
  24.                                     #.. all X- headers... 
  25.                                   }, 
  26.                       'subtype': msg_mime_subtype, 
  27.                       'body_text': plaintext_body 
  28.                       'body_html': html_body, 
  29.                       'attachments': [('file1', 'bytes'), 
  30.                                        ('file2', 'bytes') } 
  31.                        # ... 
  32.                        'original': source_of_email, 
  33.                     } 
  34.         """ 
  35.         msg_txt = message 
  36.         if isinstance(message, str): 
  37.             msg_txt = email.message_from_string(message) 
  38.         # Warning: message_from_string doesn't always work correctly on unicode, 
  39.         # we must use utf-8 strings here :-( 
  40.         if isinstance(message, unicode): 
  41.             message = message.encode('utf-8'
  42.             msg_txt = email.message_from_string(message) 
  43.         message_id = msg_txt.get('message-id'False
  44.         msg = {} 
  45.         if save_original: 
  46.             # save original, we need to be able to read the original email sometimes 
  47.             msg['original'] = message.as_string() if isinstance(message, Message) \ 
  48.                                                   else message 
  49.             msg['original'] = base64.b64encode(msg['original']) # binary fields are b64 
  50.         if not message_id: 
  51.             # Very unusual situation, be we should be fault-tolerant here 
  52.             message_id = time.time() 
  53.             msg_txt['message-id'] = message_id 
  54.             _logger.info('Parsing Message without message-id, generating a random one: %s', message_id) 
  55.         fields = msg_txt.keys() 
  56.         msg['id'] = message_id 
  57.         msg['message-id'] = message_id 
  58.         if 'Subject' in fields: 
  59.             msg['subject'] = decode(msg_txt.get('Subject')) 
  60.         if 'Content-Type' in fields: 
  61.             msg['content-type'] = msg_txt.get('Content-Type'
  62.         if 'From' in fields: 
  63.             msg['from'] = decode(msg_txt.get('From'or msg_txt.get_unixfrom()) 
  64.         if 'To' in fields: 
  65.             msg['to'] = decode(msg_txt.get('To')) 
  66.         if 'Delivered-To' in fields: 
  67.             msg['to'] = decode(msg_txt.get('Delivered-To')) 
  68.         if 'CC' in fields: 
  69.             msg['cc'] = decode(msg_txt.get('CC')) 
  70.         if 'Cc' in fields: 
  71.             msg['cc'] = decode(msg_txt.get('Cc')) 
  72.         if 'Reply-To' in fields: 
  73.             msg['reply'] = decode(msg_txt.get('Reply-To')) 
  74.         if 'Date' in fields: 
  75.             try
  76.                 date_hdr = decode(msg_txt.get('Date')) 
  77.                 parsed_date = dateutil.parser.parse(date_hdr, fuzzy=True
  78.                 if parsed_date.utcoffset() is None
  79.                     # naive datetime, so we arbitrarily decide to make it 
  80.                     # UTC, there's no better choice. Should not happen, 
  81.                     # as RFC2822 requires timezone offset in Date headers. 
  82.                     stored_date = parsed_date.replace(tzinfo=pytz.utc) 
  83.                 else
  84.                     stored_date = parsed_date.astimezone(pytz.utc) 
  85.             except Exception: 
  86.                 _logger.warning('Failed to parse Date header %r in incoming mail ' 
  87.                                 'with message-id %r, assuming current date/time.'
  88.                                 msg_txt.get('Date'), message_id) 
  89.                 stored_date = datetime.datetime.now() 
  90.                  
  91.             msg['date'] = stored_date.strftime("%Y-%m-%d %H:%M:%S"
  92.         if 'Content-Transfer-Encoding' in fields: 
  93.             msg['encoding'] = msg_txt.get('Content-Transfer-Encoding'
  94.         if 'References' in fields: 
  95.             msg['references'] = msg_txt.get('References'
  96.         if 'In-Reply-To' in fields: 
  97.             msg['in-reply-to'] = msg_txt.get('In-Reply-To'
  98.         msg['headers'] = {} 
  99.         msg['subtype'] = 'plain' 
  100.         for item in msg_txt.items(): 
  101.             if item[0].startswith('X-'): 
  102.                 msg['headers'].update({item[0]: item[1]}) 
  103.         if not msg_txt.is_multipart() or 'text/plain' in msg.get('content-type'''): 
  104.             encoding = msg_txt.get_content_charset() 
  105.             body = tools.ustr(msg_txt.get_payload(decode=True), encoding, errors='replace'
  106.             if 'text/html' in msg.get('content-type'''): 
  107.                 msg['body_html'] =  body 
  108.                 msg['subtype'] = 'html' 
  109.                 body = tools.html2plaintext(body) 
  110.             msg['body_text'] = tools.ustr(body, encoding, errors='replace'
  111.         attachments = [] 
  112.         if msg_txt.is_multipart() or 'multipart/alternative' in msg.get('content-type'''): 
  113.             body = "" 
  114.             if 'multipart/alternative' in msg.get('content-type'''): 
  115.                 msg['subtype'] = 'alternative' 
  116.             else
  117.                 msg['subtype'] = 'mixed' 
  118.             for part in msg_txt.walk(): 
  119.                 if part.get_content_maintype() == 'multipart'
  120.                     continue 
  121.                 encoding = part.get_content_charset() 
  122.                 filename = part.get_filename() 
  123.                 if part.get_content_maintype()=='text'
  124.                     content = part.get_payload(decode=True
  125.                     if filename: 
  126.                         attachments.append((filename, content)) 
  127.                     content = tools.ustr(content, encoding, errors='replace'
  128.                     if part.get_content_subtype() == 'html'
  129.                         msg['body_html'] = content 
  130.                         msg['subtype'] = 'html' # html version prevails 
  131.                         body = tools.ustr(tools.html2plaintext(content)) 
  132.                         body = body.replace('&#13;'''
  133.                     elif part.get_content_subtype() == 'plain'
  134.                         body = content 
  135.                 elif part.get_content_maintype() in ('application''image'): 
  136.                     if filename : 
  137.                         attachments.append((filename,part.get_payload(decode=True))) 
  138.                     else
  139.                         res = part.get_payload(decode=True
  140.                         body += tools.ustr(res, encoding, errors='replace'
  141.             msg['body_text'] = body 
  142.         msg['attachments'] = attachments 
  143.         # for backwards compatibility: 
  144.         msg['body'] = msg['body_text'
  145.         msg['sub_type'] = msg['subtype'or 'plain' 
  146.         return msg 

标签: Python
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告