gpt4 book ai didi

Django 电子邮件附件发送为 "noname"

转载 作者:行者123 更新时间:2023-12-04 17:51:23 30 4
gpt4 key购买 nike

from django.template import loader, Context
from django.core.mail import EmailMultiAlternatives, EmailMessage
from settings import ADBOARD_SETTINGS
import settings


def send_mail(mail_to, subj, message_dict, template_dict=False, mail_from=ADBOARD_SETTINGS['mail_from'], attach=False):

if not isinstance(mail_to, list):
mail_to = [mail_to]

if template_dict:
txt = loader.get_template(template_dict['txt'])
html = loader.get_template(template_dict['html'])
c = Context(message_dict or None)
message_txt = txt.render(c)
message_html = html.render(c)
msg = EmailMultiAlternatives(subj, message_txt, mail_from, mail_to)
msg.attach_alternative(message_html, "text/html")
else:
msg = EmailMessage(subj, message_dict, mail_from, mail_to)
if attach:
for one in attach:
msg.attach(one[0], one[1], one[2])
msg.send()

def contacts(request):
from choices import ContactCategoryChoices

if request.method == 'POST':
form = ContactForm(request.POST, request.FILES)
if form.is_valid():
data = {
'email': form.cleaned_data.get('email'),
'subject': form.cleaned_data.get('subject'),
'message': form.cleaned_data.get('message'),
'category': int(form.cleaned_data.get('category'))
}

recievers = (
(#recievers)

emailList = list(dict(recievers)[data.get('category')])

attaches = [(upload.name, upload.read(), upload.content_type) for upload in
[form.cleaned_data[attach] for attach in request.FILES]]
send_mail(emailList, u'Письмо со страницы контактов', data, {
'txt': 'home/contacts/txt.html',
'html': 'home/contacts/html.html',
}, mail_from=settings.SENDER_EMAIL, attach=attaches)
messages.add_message(request, messages.SUCCESS, u'Сообщение отправлено')
form = ContactForm()
else:
form = ContactForm()
return render_to_response('home/contacts/index.html', {'form': form}, context_instance=RequestContext(request))

如果我添加一些文件 - 它们在附件中显示为“noname”……不仅仅是 gmail。
Django 1.3.1,utf-8 命名文件。
有没有机会让它工作而不转换为ascii?只要由于保存原始文件名而无法转换它就非常重要。

Imgur

更新:
同时标题似乎是合法的:

Headers

最佳答案

好的。用以下代码弄清楚了:

import mimetypes
from email import encoders
from email.header import Header
from email.mime.base import MIMEBase
from django.core.mail.message import DEFAULT_ATTACHMENT_MIME_TYPE

class EmailMultiAlternativesWithEncoding(EmailMultiAlternatives):
def _create_attachment(self, filename, content, mimetype=None):
"""
Converts the filename, content, mimetype triple into a MIME attachment
object. Use self.encoding when handling text attachments.
"""
if mimetype is None:
mimetype, _ = mimetypes.guess_type(filename)
if mimetype is None:
mimetype = DEFAULT_ATTACHMENT_MIME_TYPE
basetype, subtype = mimetype.split('/', 1)
if basetype == 'text':
encoding = self.encoding or settings.DEFAULT_CHARSET
attachment = SafeMIMEText(smart_str(content,
settings.DEFAULT_CHARSET), subtype, encoding)
else:
# Encode non-text attachments with base64.
attachment = MIMEBase(basetype, subtype)
attachment.set_payload(content)
encoders.encode_base64(attachment)
if filename:
try:
filename = filename.encode('ascii')
except UnicodeEncodeError:
filename = Header(filename, 'utf-8').encode() # This is the important line
attachment.add_header('Content-Disposition', 'attachment',
filename=filename)
return attachment

关于Django 电子邮件附件发送为 "noname",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15496689/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com