2017-08-16 170 views
0

我試圖使用Django EmailMessage的Django發送電子郵件與attachement

中的文件附件,我想送都在DB,註冊到我的網站中每個用戶提供發送郵件的一些文件。

I'have試過,但它不工作

的myapp/views.py:

from django.core.mail import EmailMessage 

def contactUber(request,id): 
    user = User.objects.get(id=id) 
    msg = EmailMessage(
     'Hello', #subject 
     'Body goes here', #content 
     '[email protected]', #from 
     ['[email protected]'] #to 
     ) 
    msg.attach_file(user.profile.id_card.url) #the file that i want to attach 
    msg.send() 
    messages.success(request, "Email envoyé avec succes") #success msg 
    return redirect(user_detail, id=str(id)) 

的myapp /型號:

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    birth_date = models.DateField(('Date de naissance'), null=True, blank=True) 
    #DOCUMENTS TO UPLOAD 
    id_card = models.FileField(('Carte Nationale d\'Identité'), upload_to='documents/CNI') 
    drive_licence = models.FileField(('Permis de conduire'), upload_to='documents/RIB') 
    uploaded_at = models.DateTimeField(('Ajouté le'), auto_now=True) 
    docs_are_checked = models.BooleanField(('Documents validés'), default=False) 

回溯:

Traceback (most recent call last): 
    File "C:\venvs\env1\lib\site-packages\django\core\handlers\exception.py", line 41, in inner 
response = get_response(request) 
    File "C:\venvs\env1\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
response = self.process_exception_by_middleware(e, request) 
    File "C:\venvs\env1\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\djangoprojects\mysite\mysite\core\views.py", line 272, in contactUber 
msg.attach_file(user.profile.id_card.url) #the file that i want to attach 
    File "C:\venvs\env1\lib\site-packages\django\core\mail\message.py", line 394, in attach_file 
with open(path, 'rb') as file: 
FileNotFoundError: [Errno 2] No such file or directory: '/media/documents/CNI/1847635-2524541_FZLHlIr.jpg' 
[16/Aug/2017 12:10:27] "GET /core/send_mail_uber/16/ HTTP/1.1" 500 73307 

我的問題是:如何解決這個問題

+0

和你有什麼問題嗎?它是如何解決這個問題的?爲什麼會發生?或者是什麼?請在SO上發佈時清楚。 –

+0

@ N.Ivanov編輯完成 –

回答

0

由於文件存儲在您的數據庫,它可能不會在這個位置保存/media/documents/CNI/1847635-2524541_FZLHlIr.jpg。所以你需要做的是使用attach()方法指定文件名,數據和MIME類型。這裏是它應該如何工作的一個例子:

msg.attach(user.profile.id_card.name, user.profile.id_card.read(), user.profile.id_card.content_type) 

你可以在Django Docs瞭解更多。尋找attach(),並知道它是不同於attach_file()

編輯1

既然你在評論中提到id_card拋出一個錯誤,我假設你沒有獲取正確的模型。從我所看到的情況來看,我不確定你是否正確地做了這件事。你應該通過以下方式獲取Profile模型實例:

someVar = Profile.objects.get(user=request.user) # assuming the current user is the one that you would like to be 

,然後以附加的文件使用:

msg.attach(someVar.id_card.name, someVar.id_card.read(), 'image/png') # assuming you will be attaching png's only 

希望這有助於!

+0

id_card沒有定義(NameError) –

+0

@VITALYSWEB我已經更新了我的答案,應該是'user.profile.id_card',如果這不起作用,那麼你可能沒有獲取正確的模型。 –

+0

@VITALYSWEB我在**編輯1 **下更新了我的答案。希望這可以幫助! –