首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Amazon-SES、芹菜任务从Django发送带有附件的电子邮件

使用Amazon-SES、芹菜任务从Django发送带有附件的电子邮件
EN

Stack Overflow用户
提问于 2013-05-04 03:51:43
回答 2查看 2.4K关注 0票数 1

我正在试着发送带有附件的电子邮件。我得到IOError: Errno 2没有这样的文件或目录。但是它说的URL并不存在?好吧,它确实存在。表单正在上传文件,当我在另一个窗口中调用它时,它生成的、末尾附加了Signature=...&Expires=...&AWSAccessKeyId=的FileField.url可以正常工作。

我的Django应用程序使用Amazon-SES。我用send_mail()很好地发送了它们,但是那个包装器不支持附件,所以我在我的tasks.py中切换到了这个:

代码语言:javascript
复制
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()上调用它

代码语言:javascript
复制
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))

日志是这样写的:

代码语言:javascript
复制
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:

任何

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-06 03:23:03

编辑#2 --如果要使用.read()函数,文件模式需要为'r‘。

原因是“没有这样的文件或目录”是因为我忘记使用default_storage.open()。该文件与应用程序不在同一台计算机上,静态文件存储在亚马逊网络服务S3上。

代码语言:javascript
复制
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()
票数 4
EN

Stack Overflow用户

发布于 2013-05-04 04:09:43

附件必须是文件系统上的文件,请在Django e-mail documentation中搜索attach_file。

因此,您可以链接到电子邮件中的文件(URL),也可以下载该文件,将其附加,然后在本地删除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16366537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档