当前位置: 首页 > news >正文

pyhon使用http代理服务器和POP3、SMTP邮件服务器

python标准库已包含对http的支持,通过很简单的办法就可以直接使用http代理服务器获取网页数据:

import httplib
host,port = "192.168.131.54" , "8086" #http proxy server ip and port
url = " http://blog.csdn.net "
conn = httplib.HTTPConnection(host, port)
conn.request(method,url)
print(r.status,r.reason)
printr.read()
python自带的库文件python/lib/poplib.py支持通过pop3接收邮件
该文件末尾自带测试函数,可以直接运行poplib.py:
poplib pop.126.com yourname yourpassword
值得学习的是,在python的库文件中,很多都是自带测试程序,一般在文件末尾,形式如下:
if __name__ == "__main__":
a = POP3("10.3.4.3","3128")
print ="this is a test"
这样,直接运行库文件就可以看到测试效果,同时也不干扰正常的import使用。
如果需要通过代理来访问pop,则需要做一点额外的工作,简单起见,直接在poplib.py上面修改,首先复制一份到自己的工作目录,然后修改 class POP3 的 __init__函数:
def __init__(self, host, port = POP3_PORT):
self.host ="10.3.4.3"
self.port ="3128"
msg = "getaddrinfo returns an empty list"
self.sock = None

for res in socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
self.sock = socket.socket(af, socktype, proto)
self.sock.connect(sa)
except socket.error, msg:
if self.sock:
self.sock.close()
self.sock = None
continue
break
if not self.sock:
raise socket.error, msg
self.file = self.sock.makefile('rb')
self._debugging = 0
self._putline("CONNECT 220.181.15.121:110 HTTP/1.0\r\n") #pop.126.com的ip地址
msg_proxy = self._getline()
msg_proxy = self._getline()
self.welcome = self._getresp()
简单起见,上面的代理服务器和pop服务器的ip地址是直接添上去的,实际使用用时需要适当修改成方便应用的形式。
python通过smtp认证服务器发邮件的操作也是相当简单:
(如需要支持中文,注意指明编码,并保持所有编码一致)
# -*- coding: GB2312 -*-
import smtplib

addr_from = "测试邮件发送地址"< mymail@gmail.com >"
addr_to = "测试邮件接收地址"< mymail@gmail.com >"
smtp = "smtp.gamil.com"
head_format = """To: %s\nFrom: %s\nContent-Type: text/plain;\ncharset="gb2312"\nSubject: Test mail from python\n\n"""
body= "This is a test mail.\nSecond line.\n3rd line."

server = smtplib.SMTP('smtp.changhong.com')
server.login("name","password")
head = head_format%(addr_to,self.addr_from)
msg = head + body
server.sendmail(self.addr_from,addr_to ,msg)
server.quit()
另外如果需要发送html格式的邮件则又要额外多费一点功夫了,一下是一个简单的发送html格式邮件的py文件,我已经把编码固定成了GB2312:
# -*- coding: GB2312 -*-
class smtp_server:
server = None
subject = "Python mail sender"
addr_from = """PythonMail<
abc@126.com >"""
addr_to = """PythonMail<
abc@126.com >"""

charset = 'GB2312'

def __init__(self):
import smtplib
self.server = smtplib.SMTP("smtp.126.com")
self.server.login("user_name","mypass")
return

def __del__(self):
if(self.server != ""):
self.server.quit()
return

def send(self, addr_from , addr_to ,msg):
self.server.sendmail(addr_from , addr_to , msg)
return

def send_html(self, addr_from , addr_to ,html , subject):
msg = self.create_html_mail(html,None,subject,addr_from,addr_to)
self.send(addr_from,addr_to,msg)
return

def create_html_mail(self,html, text=None ,subject=None, addr_from=None , addr_to=None):

"Create a mime-message that will render as HTML or text, as appropriate"
import MimeWriter
import mimetools
import cStringIO
import base64

charset = self.charset
if subject is None:
subject=self.subject
if addr_from is None:
addr_from=self.addr_from
if addr_to is None:
addr_to=self.addr_to

if text is None:
# Produce an approximate textual rendering of the HTML string,
# unless you have been given a better version as an argument
import htmllib, formatter
textout = cStringIO.StringIO( )
formtext = formatter.AbstractFormatter(formatter.DumbWriter(textout))
parser = htmllib.HTMLParser(formtext)
parser.feed(html)
parser.close( )
text = textout.getvalue( )
del textout, formtext, parser

out = cStringIO.StringIO( ) # output buffer for our message
htmlin = cStringIO.StringIO(html)
txtin = cStringIO.StringIO(text)

writer = MimeWriter.MimeWriter(out)

# Set up some basic headers. Place subject here
# because smtplib.sendmail expects it to be in the
# message body, as relevant RFCs prescribe.
writer.addheader("From",addr_from)
writer.addheader("To",addr_to)
writer.addheader("Subject", subject)
writer.addheader("MIME-Version", "1.0")

# Start the multipart section of the message.
# Multipart/alternative seems to work better
# on some MUAs than multipart/mixed.
writer.startmultipartbody("alternative")
writer.flushheaders( )

# the plain-text section: just copied through, assuming iso-8859-1
subpart = writer.nextpart( )
pout = subpart.startbody("text/plain", [("charset", charset)])
pout.write(txtin.read( ))
txtin.close( )

# the HTML subpart of the message: quoted-printable, just in case
subpart = writer.nextpart( )
subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
pout = subpart.startbody("text/html", [("charset", charset)])
mimetools.encode(htmlin, pout, 'quoted-printable')
htmlin.close( )

# You're done; close your writer and return the message body
writer.lastpart( )
msg = out.getvalue( )
out.close( )
return msg
if __name__=="__main__":
f = open("test.html", 'r')
html = f.read( )
f.close( )
fromAddr = """PythonMail<
abc@126.com >"""
toAddr = """PythonMail<
abc@126.com >"""
server = smtp_server()
#message = server.create_html_mail(html)
#server.send(fromAddr, toAddr, message)
server.send_html(fromAddr, toAddr,html,"subject")

相应修改smtp服务器的地址和认证信息,保存为"html_smtp.py"文件,直接运行即可发送内容为当前目录下名为:“test.html”的html格式邮件


相关文章:

  • ubuntu server安装php mysql_Ubuntu杂记——Apache+PHP+MySQL的安装
  • 基于TCP/IP的手机聊天游戏(附带源码和解释)之共享类
  • java杰森_杰森 - BlogJava
  • 基于TCP/IP的手机聊天游戏(附带源码和解释)之服务器端类
  • java显示图片缩略图_java中生成图片的缩略图
  • 基于TCP/IP的手机聊天游戏(附带源码和解释)之客户端类
  • 在DataGrid等控件中添加自动编号的列
  • java 循环队列实现_Java实现循环队列
  • 长期用电脑人士要多吃樱桃
  • [软工]此EUP非彼EUP
  • java 加减乘除是原子操作吗_Go并发编程之传统同步—(3)原子操作
  • 毕业了
  • mysql innodb 删除_MySQL InnoDB 删除资料后释放硬盘空间
  • request变量java jsp_JSP里request变量列表
  • transition java_Transition 过渡
  • 07.Android之多媒体问题
  • CSS 专业技巧
  • Django 博客开发教程 16 - 统计文章阅读量
  • gcc介绍及安装
  • Hexo+码云+git快速搭建免费的静态Blog
  • js面向对象
  • mongodb--安装和初步使用教程
  • mysql 5.6 原生Online DDL解析
  • MySQL数据库运维之数据恢复
  • PHP变量
  • Python实现BT种子转化为磁力链接【实战】
  • Redis字符串类型内部编码剖析
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Tornado学习笔记(1)
  • 编写高质量JavaScript代码之并发
  • 不上全站https的网站你们就等着被恶心死吧
  • 从零搭建Koa2 Server
  • 力扣(LeetCode)357
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 那些被忽略的 JavaScript 数组方法细节
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)linux使用docker容器运行mysql
  • (二十四)Flask之flask-session组件
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (三) diretfbrc详解
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)Neo4j下载安装以及初次使用
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .NET 8.0 发布到 IIS
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值