Django 收到 e-mails 及其附件
Django receive e-mails and their attachments
在我正在工作的应用程序中,我想从我的 gmail 帐户中获取我的 e-mails。所以我设置了一个 class 来存储 e-mail 地址、端口、服务器和密码。
我创建了一个函数,可以从 gmail 帐户 e-mails 获取主题、Body 和发件人部分,并且我将邮件备份到扩展名为“.eml”的备份文件夹中.另外,我有一个 "mail-list.html" 模板,其中显示了一个包含上述 headers 和内容的列表。到这里为止一切都很好。
现在我怎样才能得到附件,如果有任何消息,那么如果有的话,我可以在我的 "mail-list.html" 模板中显示。
这个带有 e-mail 的东西对我来说是全新的,所以任何示例代码甚至指向我的方向都会很棒!
我已经检查了一些插件,例如 django 邮箱,但我希望它是我最后的选择。
在我正在工作的应用程序中,我想从我的 gmail 帐户中获取我的 e-mails。所以我设置了一个 class 来存储 e-mail 地址、端口、服务器和密码。
我创建了一个函数,可以从 gmail 帐户 e-mails 获取主题、Body 和发件人部分,并且我将邮件备份到扩展名为“.eml”的备份文件夹中.另外,我有一个 "mail-list.html" 模板,其中显示了一个包含上述 headers 和内容的列表。到这里为止一切都很好。
现在我怎样才能得到附件,如果有任何消息,那么如果有的话,我可以在我的 "mail-list.html" 模板中显示。
这个带有 e-mail 的东西对我来说是全新的,所以任何示例代码甚至指向我的方向都会很棒!
我已经检查了一些插件,例如 django 邮箱,但我希望它是我最后的选择。
更新:
我已经设法得到这样的附件...
#previous code here to get subject,body etc in my function
if message.get_content_maintype() == 'multipart':
filenames_list = []
for part in message.walk():
print("part.get_content_maintype ",part.get_content_maintype())
#find the attachment part - so skip all the other parts
if part.get_content_maintype() == 'multipart': continue
if part.get_content_maintype() == 'text': continue
if part.get('Content-Disposition') == 'inline': continue
if part.get('Content-Disposition') is None: continue
#put attachments in list
filenames_list.append(filename)
print ("filenames_list",filenames_list)
#create context for template
mail_list['attachment'] = filenames_list
所以现在,我将我的文件名放在列表中,为了在我的模板中使用它们,我将它们放在 mail_list['attachment'] 上下文中。
当文件名是英文时,我得到这个:
['myessay.pdf', 'test.odt']
但是当附件使用不同的语言(例如希腊语)时,我得到:['=?UTF-8?B?zrXOs86zz4HOsc+Gzr8xLmRvYw==?=', '=?UTF- 8?B?zrXOs86zz4HOsc+Gzr8yLmRvYw==?=', '=?UTF-8?B?zrXOs86zz4HOsc+Gzr8xMi5kb2M=?=']
如您所见,列表中有三个附件,用“,”分隔。
如何对它们进行解码或编码?我不知道什么是合适的。
所以我已经弄明白了....我希望这对其他人有帮助..
我指的是获取附件的代码部分。
#some code before to require the server variable from the model where
#I store all the required fields for the connction(port,e-mail address etc)
...
...
...
pop3 = poplib.POP3_SSL(server) # or "POP3" if SSL is not supported
msg_list = pop3.list()
pop3.list()
#Get messages from server:
messages = [pop3.retr(i) for i in range(1, len(pop3.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(m[1]) for m in messages]
#Parse message intom an email object:
messages = [parser.Parser().parsestr(m) for m in messages]
for message in messages:
mail_list = {}
for item in message.items():
#code to get subject,from,date
...
...
#and now to get the attachments of each message
for part in message.walk():
#find the attachment part - so skip all the other parts
if part.get_content_maintype() == 'multipart': continue
if part.get_content_maintype() == 'text': continue
if part.get('Content-Disposition') == 'inline': continue
if part.get('Content-Disposition') is None: continue
#get filename
filename = part.get_filename()
#this is for encoding other than latin-letter-languages
if decode_header(filename)[0][1] is not None:
filename = str(decode_header(filename[0][0]).decode(decode_header(filename)[0][1])
filenames_list.append(filename)
mail_list['attachment'] = filenames_list
context['messages'] = mail_list
在我的模板中,为了使文件正确显示,我还必须像这样遍历 'attachment':
{% for d in messages %}
/*subject,from,date = parts of the message I have got inside the function before the code I am displaying*/
{{ d.subject }}
{{ d.from }}
{{ d.date }}
{% for t in d.attachment %}{{ t }}{% endfor %}
{% endfor %}
在我正在工作的应用程序中,我想从我的 gmail 帐户中获取我的 e-mails。所以我设置了一个 class 来存储 e-mail 地址、端口、服务器和密码。
我创建了一个函数,可以从 gmail 帐户 e-mails 获取主题、Body 和发件人部分,并且我将邮件备份到扩展名为“.eml”的备份文件夹中.另外,我有一个 "mail-list.html" 模板,其中显示了一个包含上述 headers 和内容的列表。到这里为止一切都很好。
现在我怎样才能得到附件,如果有任何消息,那么如果有的话,我可以在我的 "mail-list.html" 模板中显示。 这个带有 e-mail 的东西对我来说是全新的,所以任何示例代码甚至指向我的方向都会很棒!
我已经检查了一些插件,例如 django 邮箱,但我希望它是我最后的选择。
在我正在工作的应用程序中,我想从我的 gmail 帐户中获取我的 e-mails。所以我设置了一个 class 来存储 e-mail 地址、端口、服务器和密码。
我创建了一个函数,可以从 gmail 帐户 e-mails 获取主题、Body 和发件人部分,并且我将邮件备份到扩展名为“.eml”的备份文件夹中.另外,我有一个 "mail-list.html" 模板,其中显示了一个包含上述 headers 和内容的列表。到这里为止一切都很好。
现在我怎样才能得到附件,如果有任何消息,那么如果有的话,我可以在我的 "mail-list.html" 模板中显示。 这个带有 e-mail 的东西对我来说是全新的,所以任何示例代码甚至指向我的方向都会很棒!
我已经检查了一些插件,例如 django 邮箱,但我希望它是我最后的选择。
更新:
我已经设法得到这样的附件...
#previous code here to get subject,body etc in my function
if message.get_content_maintype() == 'multipart':
filenames_list = []
for part in message.walk():
print("part.get_content_maintype ",part.get_content_maintype())
#find the attachment part - so skip all the other parts
if part.get_content_maintype() == 'multipart': continue
if part.get_content_maintype() == 'text': continue
if part.get('Content-Disposition') == 'inline': continue
if part.get('Content-Disposition') is None: continue
#put attachments in list
filenames_list.append(filename)
print ("filenames_list",filenames_list)
#create context for template
mail_list['attachment'] = filenames_list
所以现在,我将我的文件名放在列表中,为了在我的模板中使用它们,我将它们放在 mail_list['attachment'] 上下文中。
当文件名是英文时,我得到这个: ['myessay.pdf', 'test.odt']
但是当附件使用不同的语言(例如希腊语)时,我得到:['=?UTF-8?B?zrXOs86zz4HOsc+Gzr8xLmRvYw==?=', '=?UTF- 8?B?zrXOs86zz4HOsc+Gzr8yLmRvYw==?=', '=?UTF-8?B?zrXOs86zz4HOsc+Gzr8xMi5kb2M=?=']
如您所见,列表中有三个附件,用“,”分隔。
如何对它们进行解码或编码?我不知道什么是合适的。
所以我已经弄明白了....我希望这对其他人有帮助.. 我指的是获取附件的代码部分。
#some code before to require the server variable from the model where
#I store all the required fields for the connction(port,e-mail address etc)
...
...
...
pop3 = poplib.POP3_SSL(server) # or "POP3" if SSL is not supported
msg_list = pop3.list()
pop3.list()
#Get messages from server:
messages = [pop3.retr(i) for i in range(1, len(pop3.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(m[1]) for m in messages]
#Parse message intom an email object:
messages = [parser.Parser().parsestr(m) for m in messages]
for message in messages:
mail_list = {}
for item in message.items():
#code to get subject,from,date
...
...
#and now to get the attachments of each message
for part in message.walk():
#find the attachment part - so skip all the other parts
if part.get_content_maintype() == 'multipart': continue
if part.get_content_maintype() == 'text': continue
if part.get('Content-Disposition') == 'inline': continue
if part.get('Content-Disposition') is None: continue
#get filename
filename = part.get_filename()
#this is for encoding other than latin-letter-languages
if decode_header(filename)[0][1] is not None:
filename = str(decode_header(filename[0][0]).decode(decode_header(filename)[0][1])
filenames_list.append(filename)
mail_list['attachment'] = filenames_list
context['messages'] = mail_list
在我的模板中,为了使文件正确显示,我还必须像这样遍历 'attachment':
{% for d in messages %}
/*subject,from,date = parts of the message I have got inside the function before the code I am displaying*/
{{ d.subject }}
{{ d.from }}
{{ d.date }}
{% for t in d.attachment %}{{ t }}{% endfor %}
{% endfor %}