django 模板无法显示 values.X-MS-Has-Attach
django template not able to display values.X-MS-Has-Attach
我制作了一个 class 来获取电子邮件,这很有效。
import logging
import poplib
from email import parser
class email(object):
'''
this class checks an email address and returns the messages in that email
'''
def __init__(self, url, user, pw):
'''
Constructor
'''
self.url = url
self.user = user
self.pw = pw
def getEmail(self):
try:
pop_conn = poplib.POP3_SSL(self.url)
pop_conn.user(self.user)
pop_conn.pass_(self.pw)
except Exception, e:
logging.warning('was not able to connect to email server')
logging.info('%s', e )
raise RuntimeError('was not able to connect: %s', e)
try:
#Get messages from server:
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#Parse message into an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
print type(messages), "type is list"
headers = { key.replace('-', '_'): value for (key, value) in messages.iteritems() }
setattr(messages, 'headers_underscore', headers)
return messages
except Exception, e:
logging.warning('was not able to get emails')
logging.info('%s', e )
raise RuntimeError('was not able to get Emails: %s', e)
if __name__ == "__main__":
url = 'url.com'
user = 'foo'
pw = "bar"
t=email(url, user, pw)
message = t.getEmail()
for message in message:
print type(message), "message type is instance"
print message['subject'], message['from'], message['to']
print message['X_MS_Has_Attach']
然后我的 django 视图调用 class 来获取消息,然后我将这些消息发送到我的模板。这也行。
t=email(accounts[0]['url'].replace('http://', "")[:-1],
accounts[0]['user'], accounts[0]['pw'])
message = t.getEmail()
context = {'messages': message}
return render(request, 'email/emails.html', context )
然后在我的模板中,我在 table
中显示相关字段
{% for values in messages %}
<tr>
<td>{{values.from}}</td>
<td>{{values.to}}</td>
<td>{{values.subject}}</td>
<td>{{values.body}}</td>
<td>{{values.X-MS-Has-Attach}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
除了最后一部分“{{values.X-MS-Has-Attach}}
”,我得到了 Could not parse the remainder: '-MS-Has-Attach' from 'values.X-MS-Has-Attach
。为什么我的 class 和 django 视图可以显示附件,print
message['X-MS-Has-Attach'] 可以,但模板不行。
我希望能够查看或 link 附件,但实际上我只需要知道它是否有附件(以及附件的名称)。
Django 将连字符(减号)理解为减号 :)
所以你不能在模板变量名中使用它。
我查看了 email.Message class 的文档,其中显示您可以使用 items() 方法获取所有 header 及其值。
因此,简单的解决方案是将所有 header 名称从连字符转换为下划线。
这应该有效:
for message in messages:
headers = { key.replace('-', '_'): value for (key, value) in message.items() }
setattr(message, 'headers_underscore', headers)
现在,如果您在模板中访问 message.headers_underscore
,您将获得 header 的下划线版本。例如:
{{ message.headers_underscore.X_MS_Has_Attach }}
但我还要指出,X-MS-Has-Attach 并不是在电子邮件中查找附件的最佳方式,因为它是一个 Microsoft-specific 扩展,并不是每个人都使用 Microsoft 电子邮件产品。方法是检查电子邮件的 MIME 结构。我认为 python 电子邮件 classes 有一些助手可以使这变得容易..看看我上面链接的文档。
基本上您需要调用 message.is_multipart()
,如果是,则调用 message.get_payload()
,其中 returns 是 Message objects 的可迭代对象。然后你必须查看每一个的 headers/content-type 并决定如何处理它。
我制作了一个 class 来获取电子邮件,这很有效。
import logging
import poplib
from email import parser
class email(object):
'''
this class checks an email address and returns the messages in that email
'''
def __init__(self, url, user, pw):
'''
Constructor
'''
self.url = url
self.user = user
self.pw = pw
def getEmail(self):
try:
pop_conn = poplib.POP3_SSL(self.url)
pop_conn.user(self.user)
pop_conn.pass_(self.pw)
except Exception, e:
logging.warning('was not able to connect to email server')
logging.info('%s', e )
raise RuntimeError('was not able to connect: %s', e)
try:
#Get messages from server:
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#Parse message into an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
print type(messages), "type is list"
headers = { key.replace('-', '_'): value for (key, value) in messages.iteritems() }
setattr(messages, 'headers_underscore', headers)
return messages
except Exception, e:
logging.warning('was not able to get emails')
logging.info('%s', e )
raise RuntimeError('was not able to get Emails: %s', e)
if __name__ == "__main__":
url = 'url.com'
user = 'foo'
pw = "bar"
t=email(url, user, pw)
message = t.getEmail()
for message in message:
print type(message), "message type is instance"
print message['subject'], message['from'], message['to']
print message['X_MS_Has_Attach']
然后我的 django 视图调用 class 来获取消息,然后我将这些消息发送到我的模板。这也行。
t=email(accounts[0]['url'].replace('http://', "")[:-1],
accounts[0]['user'], accounts[0]['pw'])
message = t.getEmail()
context = {'messages': message}
return render(request, 'email/emails.html', context )
然后在我的模板中,我在 table
中显示相关字段 {% for values in messages %}
<tr>
<td>{{values.from}}</td>
<td>{{values.to}}</td>
<td>{{values.subject}}</td>
<td>{{values.body}}</td>
<td>{{values.X-MS-Has-Attach}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
除了最后一部分“{{values.X-MS-Has-Attach}}
”,我得到了 Could not parse the remainder: '-MS-Has-Attach' from 'values.X-MS-Has-Attach
。为什么我的 class 和 django 视图可以显示附件,print
message['X-MS-Has-Attach'] 可以,但模板不行。
我希望能够查看或 link 附件,但实际上我只需要知道它是否有附件(以及附件的名称)。
Django 将连字符(减号)理解为减号 :) 所以你不能在模板变量名中使用它。
我查看了 email.Message class 的文档,其中显示您可以使用 items() 方法获取所有 header 及其值。
因此,简单的解决方案是将所有 header 名称从连字符转换为下划线。
这应该有效:
for message in messages:
headers = { key.replace('-', '_'): value for (key, value) in message.items() }
setattr(message, 'headers_underscore', headers)
现在,如果您在模板中访问 message.headers_underscore
,您将获得 header 的下划线版本。例如:
{{ message.headers_underscore.X_MS_Has_Attach }}
但我还要指出,X-MS-Has-Attach 并不是在电子邮件中查找附件的最佳方式,因为它是一个 Microsoft-specific 扩展,并不是每个人都使用 Microsoft 电子邮件产品。方法是检查电子邮件的 MIME 结构。我认为 python 电子邮件 classes 有一些助手可以使这变得容易..看看我上面链接的文档。
基本上您需要调用 message.is_multipart()
,如果是,则调用 message.get_payload()
,其中 returns 是 Message objects 的可迭代对象。然后你必须查看每一个的 headers/content-type 并决定如何处理它。