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 视图可以显示附件,printmessage['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 并决定如何处理它。