转自:http://www.360doc.com/content/14/0103/13/11789990_342303735.shtml

参考了一些网络上的资料,做了个简单程序,使用python接收邮件并保存到mysql中。

#-------------------------------------------------------------------------------
# Name: 接收邮件模块
# Purpose:
#
# Author: garfield
#
# Created: 15-02-2011
# Copyright: (c) garfield 2011
# Licence: <your licence>
#-------------------------------------------------------------------------------
#_*_encoding:utf-8_*_
####源代码用来接收邮件
import MySQLdb
import time
import poplib
import pickle
import email,string,sys,os
from email.Header import Header
from email.Header import decode_header
from time import strptime, strftime ISOTIMEFORMAT="%Y-%m-%d %X" #定义数据库常量
MySQL_Server="localhost"
MySQL_User="root"
MySQL_Password="****"
MySQL_Database="Python" #定义邮件服务器常量
POP3Sever='pop3.sina.com'
POP3User='mailuser'
POP3Password='*****' CurMailID=-1 #取信息编码
def get_charset(message, default="ascii"):
#Get the message charset
return message.get_charset()
return default def SaveMail(Sender,Receiver,Subject,SendDate,ReceiveDate,TextContent,HTMLContent,OriginalMailinfo):
#save mail info to mysql
Sender=MySQLdb.escape_string(Sender)
Receiver=MySQLdb.escape_string(Receiver)
Subject=MySQLdb.escape_string(Subject)
TextContent=MySQLdb.escape_string(TextContent)
HTMLContent=MySQLdb.escape_string(HTMLContent)
OriginalMailinfo=MySQLdb.escape_string(OriginalMailinfo)
conn = MySQLdb.connect(MySQL_Server,MySQL_User,MySQL_Password,MySQL_Database,port=3306,connect_timeout=10,compress=True,charset='utf8',use_unicode=True)
cursor=conn.cursor()
vsql="insert into mail(Sender,Receiver,Subject,SendDate,ReceiveDate,TextContent,HTMLContent,OriginalMailinfo) values('%s','%s','%s','%s','%s','%s','%s','%s')" % (Sender,Receiver,Subject,SendDate,ReceiveDate,TextContent,HTMLContent,OriginalMailinfo) ;
vsql = vsql.encode('utf8')
cursor.execute(vsql)#一条SQL语句 vsql = "SELECT max(id) from mail"
cursor.execute(vsql)
CurMailID=cursor.fetchone()[0] conn.commit()
cursor.close()
conn.close() def SaveMailAtta(vMailID,vFileName,Content,IsInline):
vFileName=MySQLdb.escape_string(vFileName)
Content=MySQLdb.escape_string(Content)
conn = MySQLdb.connect(MySQL_Server,MySQL_User,MySQL_Password,MySQL_Database,port=3306,connect_timeout=10,compress=True,charset='utf8',use_unicode=True)
cursor=conn.cursor()
vsql="insert into mailatta(mailid,filename,content,isinline) values('%s','%s','%s','%s')" % (vMailID,vFileName,Content,IsInline) ;
vsql = vsql.encode('utf8')
cursor.execute(vsql)#一条SQL语句 conn.commit()
cursor.close()
conn.close() #解析邮件
def ParseMail(mail):
textplain=''
texthtml=''
atta={}
if mail.is_multipart():
for par in mail.walk():
if not par.is_multipart(): # 这里要判断是否是multipart,是的话,里面的数据是无用的,至于为什么可以了解mime相关知识。
name = par.get_param("name") #如果是附件,这里就会取出附件的文件名 if name:
#有附件
# 下面的三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC.rar?=这样的文件名
h = email.Header.Header(name)
dh = email.Header.decode_header(h)
fname = dh[0][0] #print '有附件'+fname
data = par.get_payload(decode=True) # 解码出附件数据,然后存储到文件中
atta[fname]=data
"""
try:
f = open(fname, 'wb') #注意一定要用wb来打开文件,因为附件一般都是二进制文件
except:
print '附件名有非法字符,自动换一个'
f = open('aaaa', 'wb')
f.write(data)
f.close()
"""
else:
#不是附件,是文本内容
content_type=par.get_content_type()
charset = get_charset(par)
if content_type in ['text/plain']:
if charset==None:
textplain=par.get_payload(decode=True)
else:
textplain=par.get_payload(decode=True).decode(charset)
if content_type in ['text/html']:
if charset==None:
texthtml=par.get_payload(decode=True)
else:
texthtml=par.get_payload(decode=True).decode(charset)
else:
type=mail.get_content_charset()
if type==None:
textplain=mail.get_payload()
else:
try:
textplain=unicode(mail.get_payload('base64'),type)
except UnicodeDecodeError:
textplain='Error' return (textplain,texthtml,atta) def main():
t=time.strftime( ISOTIMEFORMAT, time.localtime()) popClient=poplib.POP3(POP3Sever)
popClient.set_debuglevel(1)
popClient.user(POP3User)
popClient.pass_(POP3Password) numMsgs,mboxSize=popClient.stat() for id in range (numMsgs):
hdr,message,octet=popClient.retr(id+1)
mail=email.message_from_string(string.join(message, '\n'))
subject=mail.get("subject")
h = email.Header.Header(subject)
dh = email.Header.decode_header(h)
subject = dh[0][0] FromAddr=email.utils.parseaddr(mail['from'])[1]
ToAddr=email.utils.parseaddr(mail['To'])[1]
mdate=mail.get('date') #'Wed, 16 Feb 2011 14:34:44 +0800'
mdate=mdate[0:len(mdate)-6]
#:取邮件中的时间进行处理
md= mktime(strptime(mdate,"%a, %d %b %Y %H:%M:%S"))
MailDate=time.strftime(ISOTIMEFORMAT,time.localtime(md))
originalmailinfo=mail.as_string()
TextContent,HTMLContent,MailAtta=ParseMail(mail)
#保存邮件
SaveMail(FromAddr,ToAddr,subject,MailDate,MailDate,TextContent,HTMLContent,originalmailinfo)
#保存邮件附件
#for fk in MailAtta.keys():
# SaveMailAtta(CurMailID,fk,MailAtta[fk],False)
popClient.quit() if __name__=='__main__':
main() 但附件因为是二进制文件,所以保存到数据库中时需要序列化或进行其他处理,所以以上程序中的附件还不能这么简单地进行保存,需要进一步修改。 MySQL数据库脚本: --
-- 表的结构 `mail`
-- CREATE TABLE IF NOT EXISTS `mail` (
`ID` int(10) NOT NULL auto_increment,
`Sender` text,
`Receiver` text,
`SendDate` datetime default NULL,
`ReceiveDate` datetime default NULL,
`Subject` varchar(500) default NULL,
`TextContent` text,
`HTMLContent` text,
`OriginalMailInfo` text,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=546 ; -- --
-- 表的结构 `mailatta`
-- CREATE TABLE IF NOT EXISTS `mailatta` (
`ID` int(11) NOT NULL auto_increment,
`MailID` int(11) NOT NULL,
`filename` varchar(200) NOT NULL,
`isinline` tinyint(1) NOT NULL,
`conent` blob NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Python接收邮件并保存至MySQL的更多相关文章

  1. python接收邮件

    # -*- coding: utf-8 -*- import poplib import email from email.parser import Parser from email.header ...

  2. python 利用pop3接收邮件并保存附件

    def SaveAttach():# login the pop3 server ,retrive the new mails ,and download the attachments dstdir ...

  3. 使用python发送和接收邮件

    关于电子邮件 大学之前,基本不用邮箱,所以基本感觉不到它的存在,也不知道有什么用:然而大学之后,随着认识的人越来越多,知识越来越广泛,邮箱已然成为很重要的通讯工具,大学一些课程作业需要有邮箱发给老师, ...

  4. Python 用IMAP接收邮件

    一.简介IMAP(Internet Message Access Protocol),这个协议与POP一样,也是从邮件服务器上下载邮件到本机,不过IMAP比POP的功能要更加强大些,IMAP除支持PO ...

  5. 转--python -- 收发邮件

    官方 import smtplib from email.mime.text import MIMEText from email.header import Header # 发送邮箱服务器 smt ...

  6. outlook 2016 for windows 每次刷新发送接收邮件会弹出登陆界面

    Q: outlook2016 for windows 每次刷新发送接收邮件会弹出登陆界面,office365 ProPlus 都是正常激活了,Word 和Excel都不存在此类问题 A: 排除用户的o ...

  7. Android pop3与imap方式接收邮件(javamail)

    需要下载3个jar包:mail.jar/    activation.jar/    additionnal.jar 1.pop3 /** * 以pop3方式读取邮件,此方法不能读取邮件是否为已读,已 ...

  8. python SMTP邮件发送(转载)

    Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...

  9. Python收发邮件

    发送邮件使用SMTP协议,接受POP3或IMAP: 创建邮件内容email模块,发送邮件smtplib模块.发送邮件比较简单,只需先创建SMTP对象,登录服务器后根据发收邮箱地址发送即可: POP3接 ...

随机推荐

  1. 详细解读Volley(三)—— ImageLoader & NetworkImageView

    ImageLoader是一个加载网络图片的封装类,其内部还是由ImageRequest来实现的.但因为源码中没有提供磁盘缓存的设置,所以咱们还需要去源码中进行修改,让我们可以更加自如的设定是否进行磁盘 ...

  2. [Android Pro] AndroidStudio IDE界面插件开发(Hello World篇)

    转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53856916] 工欲善其事必先利其器,自打从Ecl ...

  3. 将Linux默认的OpenJDK替换为Oracle JDK

    在使用Logstash安装插件的时候,发生了一个错误,如下: ERROR: Something went wrong when installing logstash-input-jdbc, mess ...

  4. [转]专访企业QQ SaaS团队,谈企业级LNMP架构设计

    FROM : http://www.csdn.net/article/2014-08-20/2821302-interview-tencent-b-qq-shuai-wang 对比IaaS和PaaS, ...

  5. @ZooKeeper注册中心安装(单节点)

    1.下载zookeeper 下载地址:https://archive.apache.org/dist/zookeeper/,这里我们使用3.4.6版本. [winner-0715@localhost ...

  6. 【虚拟化实战】Cluster设计之一资源池

    作者:范军 (Frank Fan) 新浪微博:@frankfan7 资源池是Cluster设计中的一个重要概念,本文介绍了为什么用资源池,怎么用好资源池,以及澄清了一些常见的误区. 一概念 每个ESX ...

  7. go语言之进阶篇方法表达式

    1.方法表达式 示例: package main import "fmt" type Person struct { name string //名字 sex byte //性别, ...

  8. Java系列: 关于虚引用及其测试代码

    “虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期.如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收.虚引用主要用来跟踪对象被 ...

  9. Sublime Text 3中SublimeLinter的使用

    关于Sublime  Text 2中的SublimeLinter的使用网上多如牛毛,基本上不会遇到什么问题,简单的讲一下关于Sublime Text 3中遇到的问题: 1.通过package cont ...

  10. vue-自定义组件传值

    项目中,我们经常会遇到自定义组件传值的问题,方法很多种,但是原理很简单,下述文档总结实际项目中使用的传值方式. 父组件传递给子组件某一值,子组件内会修改该值,然后父组件需要获取新值 ​ 在 Vue 中 ...