菜谱 4:发送带图片的邮件

我们平时需要使用 Python 发送各类邮件,这个需求怎么来实现?答案其实很简单,smtplib 和email 库可以帮忙实现这个需求。smtplib 和 email 的组合可以用来发送各类邮件:普通文本,HTML 形式,带附件,群发邮件,带图片的邮件等等。我们这里将会分几节把发送邮件功能解释完成。

smtplib 是 Python 用来发送邮件的模块,email 是用来处理邮件消息。

发送带图片的邮件是利用 email.mime.multipart 的 MIMEMultipart 以及 email.mime.image 的 MIMEImage:

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

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'

msgRoot = MIMEMultipart('related')
msgRoot['Subject'] = 'test message'

msgText = MIMEText(
    ''' Some  HTML  text  and an image.good!''', 'html', 'utf-8')
msgRoot.attach(msgText)

fp = open('/Users/1.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()

msgImage.add_header('Content-ID', '')
msgRoot.attach(msgImage)

smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msgRoot.as_string())
smtp.quit()

注意:这里的代码并没有把异常处理加入,需要读者自己处理异常。

阅读全文 »

菜谱 3:发送 HTML 形式的邮件

我们平时需要使用 Python 发送各类邮件,这个需求怎么来实现?答案其实很简单,smtplib 和email 库可以帮忙实现这个需求。smtplib 和 email 的组合可以用来发送各类邮件:普通文本,HTML 形式,带附件,群发邮件,带图片的邮件等等。我们这里将会分几节把发送邮件功能解释完成。

smtplib 是 Python 用来发送邮件的模块,email 是用来处理邮件消息。

发送 HTML 形式的邮件,需要 email.mime.text 中的 MIMEText 的 _subtype 设置为 html,并且 _text 的内容应该为 HTML 形式。其它的就和 菜谱 2:发送普通文本邮件 一样:

import smtplib
from email.mime.text import MIMEText

sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'

msg = MIMEText(u"""
               

你好

""", 'html', 'utf - 8') msg['Subject'] = subject smtp = smtplib.SMTP() smtp.connect(smtpserver) smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()

注意:这里的代码并没有把异常处理加入,需要读者自己处理异常。

阅读全文 »

菜谱 2:发送普通文本邮件

我们平时需要使用 Python 发送各类邮件,这个需求怎么来实现?答案其实很简单,smtplib 和email 库可以帮忙实现这个需求。smtplib 和 email 的组合可以用来发送各类邮件:普通文本,HTML 形式,带附件,群发邮件,带图片的邮件等等。我们这里将会分几节把发送邮件功能解释完成。

smtplib 是 Python 用来发送邮件的模块,email 是用来处理邮件消息。

发送普通文本的邮件,只需要 email.mime.text 中的 MIMEText 的 _subtype 设置为 plain。首先导入 smtplib 和 mimetext。创建 smtplib.smtp 实例,connect 邮件 smtp 服务器,login 后发送:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'

msg = MIMEText(u'你好','plain','utf-8')#中文需参数‘utf-8',单字节字符不需要
msg['Subject'] = Header(subject, 'utf-8')

smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()

注意:这里的代码并没有把异常处理加入,需要读者自己处理异常。

阅读全文 »

菜谱 1:创建一个唯一的 session ID

在网站开发的时候,常常需要生成一个唯一的的会话(session)id,这个会话 id 存储在 cookie 中或者在其它安全的地方。


	# create a unique session id
	# input - string to use as part of the data used to create the session key.
	#         Although not required, it is best if this includes some unique 
	#         data from the site, such as it's IP address or other environment 
	#         information.  For ZOPE applications, pass in the entire ZOPE "REQUEST"
	#         object.
	def makeSessionId(st):
		import md5, time, base64, string
		m = md5.new()
		m.update('this is a test of the emergency broadcasting system')
		m.update(str(time.time()))
		m.update(str(st))
		return string.replace(base64.encodestring(m.digest())[:-3], '/', '$')

	def makeSessionId_nostring(st):
		import md5, time, base64
		m = md5.new()
		m.update('this is a test of the emergency broadcasting system')
		m.update(str(time.time()))
		m.update(str(st))
		return base64.encodestring(m.digest())[:-3].replace('/', '$')
        


输入参数:st,不限制 st 唯一,但是建议传入的 st 是唯一的,可以是 IP 或者一些环境信息。

输出:唯一的 session id 字符串。

阅读全文 »

python 菜谱(python cookbook) 1.8 判断一个字符集是否在另一个字符集中

挑战任务1:判断一个字符串是否在另外一个字符串中

对于处理一个字符串时候在另外一个字符串中,使用in是最简单的解决方案。

ast='a in b'

bst='this a in b only'

ast is in bst

挑战任务2:判断一个字符集是否在另一个字符集中

  • 简单的处理方法是判断每个出现在一个字符串的字符是否出现在一个字符串中

          for c in ast:

              if c in bst

                  ......

  • 另外set(集合)能很好的处理这个问题。

              set(ast).issubset(set(bst))

 

阅读全文 »

python 菜谱(python cookbook) 1.7 反转字符或者按照单词反转

 

挑战任务1:反转单个字符

切片方法是最好解决这个问题的办法,步长为-1的切片方法就能解决,但是需要注意的是字符串是不能修改,所以通过赋值(拷贝):

value=astring[::-1]

挑战任务2:按照单词反转

列表有内置的反转函数,所以首先能把,接着反转列表,接着拼接列表中的元素就能解决问题:

words=astring.split()         #一段字符串放入列表

words.reverse()                 #反转列表

' '.split(words)                    #拼接列表中的元素

挑战任务3:按照单词反转,但是还需要保持原来的空格符原样  “this  a top”->"top a  this"

上面这种方法虽然能实现反转,但是无法保持原来空格符原样,如果需要保持原来空格符原样的话,需要记住空格符的个数,正则能很好的实现这个目的。
import re
words=re.split('\s+',astring)     #切割
words.reverse()                        #反转列表
''.split(words)                            #拼接列表中的元素
 
上面的解决方案都是最基本的,各位可以通过更简洁的方式去实现,这个挑战就交给各位自己了!

阅读全文 »

python 菜谱(python cookbook) 1.4 字符串对齐

任务:实现字符串对齐:左对齐,居中对齐,或者右对齐 这就是字符串内置函数ljust,rjust,center所能实现的功能。函数类似于S.ljust(width[, fillchar]),默认的fillchar是空格,如果想指定填充字符的话,需要给出指定字符。 x=' hej ' print '|', 'hej'.ljust(20), '|', 'hej'.center(20), 'hej'.rjust(20)

阅读全文 »

python 菜谱(python cookbook) 1.3 测试一个对象是否是字符串

任务:测试一个对象是否是字符串

对于这个问题,很多人会考虑使用type来解决:type(obj) is type('')。

但是问题是type('')得到的返回是<type'str'>,而在python里面字符串是包括string和unicode(其实还有userstring,不过目前不推荐使用,这个可以称为类string对象),显然unicode对象无法通过这个解决方案。

内置函数instance和basestring就能很好的解决这个问题(不过对于userstring也是无能为力):

def isString(anbj): return isinstance(anbj,basestring)

实际上上面的方案能使用绝大部分场景(对于UserString),但是严格意义上来说,我们只是从所谓的“属性”来检查是否属于字符串对象,还需要从“行为”上来对对象进行检验。比如通过一些字符串操作。

阅读全文 »