Python twisted SMTP服务器限制传入电子邮件的大小
这是我使用twisted创建SMTP服务器时使用的非常基本的代码:Python twisted SMTP服务器限制传入电子邮件的大小,python,email,python-2.7,smtp,twisted,Python,Email,Python 2.7,Smtp,Twisted,这是我使用twisted创建SMTP服务器时使用的非常基本的代码: 来自电子邮件。标题导入标题 来自twisted.internet导入协议、延迟、反应器 从twisted.mail导入smtp 从zope.interface导入实现 类ConsoleMessageDelivery(对象): 实现(smtp.IMessageDelivery) def接收负责人(自身、直升机、来源、接收人): myHostname,clientIP=helo headerValue=“由%s从%s开始,使用ESM
来自电子邮件。标题导入标题
来自twisted.internet导入协议、延迟、反应器
从twisted.mail导入smtp
从zope.interface导入实现
类ConsoleMessageDelivery(对象):
实现(smtp.IMessageDelivery)
def接收负责人(自身、直升机、来源、接收人):
myHostname,clientIP=helo
headerValue=“由%s从%s开始,使用ESMTP;%s”%(myHostname,
客户,
smtp.rfc822date())
返回“已接收:%s”%Header(headerValue)
def validateFrom(自身、直升机、原点):
#所有地址均接受
返回原点
def validateTo(自身、用户):
#仅指向“”的消息console@domain“用户已被接受。
如果user.dest.local==“控制台”:
返回lambda:ConsoleMessage()
提升smtp.SMTPBadRcpt(用户)
类控制台消息(对象):
实现(smtp.IMessage)
定义初始化(自):
self.lines=[]
def行已接收(自身,行):
self.lines.append(行)
接收到的def EOM(自身):
打印“收到新邮件:”
打印“\n”.join(self.line)
self.lines=无
返回defer.success(无)
def connectionLost(自):
#出现错误,请扔掉存储的行
self.lines=无
类LocalSMTPFactory(smtp.SMTPFactory):
def构建协议(自身、地址):
smtpProtocol=smtp.ESMTP()
smtpProtocol.delivery=ConsoleMessageDelivery()
返回SMTPP协议
reactor.listenTCP(2025,LocalSMTPFactory())
反应堆运行()
我可以接收电子邮件,但如果我想拒绝接收大小为1MB或更大的传入邮件,我该如何做?请注意,
ConsoleMessage.lineReceived
会随邮件的每一行调用。每条线都有一个大小(毫无疑问,与它的长度相似)。您可以在收到所有行时统计它们的大小,并根据结果采取行动
此外,您还可以浏览SIZE
ESMTP扩展,该扩展允许服务器声明将接受的最大消息大小。这并不能取代代码处理消息行中的检查,因为不能保证客户端将遵守声明的最大值,但对于智能、协作的客户端,它将保存一些无意义的数据传输
SIZE
是一个非常简单的扩展,您可以通过子类化Twisted.mail.smtp.ESMTP
并重写extensions
方法来添加它,从而将其添加到Twisted的ESMTP服务器中。知道如何使用/声明扩展吗?我正在尝试使用def extensions(self)定义大小扩展:ext={'SIZE':1048576}return ext
但由于-->r.append(“%s%s”“(c)”,.join(v)),出现了一个类型错误。添加扩展名的正确方法是什么,这样我就可以得到类似于'250-SIZE 1048576'的内容?也许您可以想到一种数据结构,当应用“”。join(it)
时,它将生成“1048576”
?我最后使用ext['SIZE']=['1048576'],最后一个问题,250后面的“-”是否也不需要用于扩展?一般SMTP语法与响应终止有关。