1

添付ファイル付きのメールを送信しようとしています。IOError: [Errno 2] そのようなファイルまたはディレクトリはありません。しかし、それが言うURLは存在しませんか?いや、実際に存在します。フォームはファイルをアップロードしています。それが生成する FileField.url は、最後に Signature=...&Expires=...&AWSAccessKeyId= が追加されており、別のウィンドウで呼び出すと機能します。

私の Django アプリは Amazon-SES を使用しています。send_mail() で問題なく送信していましたが、そのラッパーは添付ファイルをサポートしていないため、tasks.py でこれに切り替えました。

from django.core.mail.message import EmailMessage
from celery import task
import logging
from apps.profiles.models import Client

@task(name='send-email')
def send_published_article(sender, subject, body, attachment):
    recipients = []
    for client in Client.objects.all():
        recipients.append(client.email)
    email = EmailMessage(subject, body, sender, [recipients])
    email.attach_file(attachment)
    email.send()

そして、これを form.save() のビューで呼び出します

from story.tasks import send_published_article
def add_article(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST, request.FILES or None)
        if form.is_valid():
            article = form.save(commit=False)
            article.author = request.user
            article.save()
            if article.is_published:
                subject = article.title
                body = article.text
                attachment = article.docfile.url
                send_published_article.delay(request.user.email,
                                             subject,
                                             body,
                                             attachment)
            return redirect(article)
    else:
        form = ArticleForm()
    return render_to_response('story/article_form.html', 
                              { 'form': form },
                              context_instance=RequestContext(request))

ログの内容は次のとおりです。

app/celeryd.1: File "/app/.heroku/python/lib/python2.7/site-packages/django/core/mail/message.py", line 268, in attach_file 
app/celeryd.1: content = open(path, 'rb').read() 
app/celeryd.1: IOError: [Errno 2] No such file or directory:

どれでも

4

2 に答える 2

4

編集 #2 - .read() 関数を使用する場合は、ファイル モードを「r」にする必要があります。

その理由は、「そのようなファイルやディレクトリはありません」と言われているのは、default_storage.open() を使用するのを忘れたためです。ファイルはアプリと同じマシン上になく、静的ファイルは AWS S3 に保存されます。

from celery import task
from django.core.mail.message import EmailMessage
from django.core.files.storage import default_storage
from apps.account.models import UserProfile

@task(name='send-email')
def send_published_article(sender, subject, body, attachment=None):
    recipients = []
    for profile in UserProfile.objects.all():
        if profile.user_type == 'Client':
            recipients.append(profile.user.email)
    email = EmailMessage(subject, body, sender, recipients)
    try:
        docfile = default_storage.open(attachment.name, 'r')
        if docfile:
            email.attach(docfile.name, docfile.read())
        else:
            pass
    except:
        pass
    email.send()
于 2013-06-05T19:23:03.090 に答える