web2py发送上传的文件,如电子邮件附件

时间:2017-06-23 09:57:08

标签: python email web2py

我 我已经在web2py中创建了一个用于存储常见问题解答的应用程序,这使我有可能通过EMAIL发送这些常见问题解答,我想发送(当我得到的时候)也是我在我创建的常见问题解答中上传的附件。 / p>

我在我的数据库中得到了这个:

db.define_table('faq',
   Field('tipo',db.tipo_faq),
   Field('sotto_categoria',db.sotto_categoria_faq),
   Field('oggetto', requires = (IS_UPPER(), IS_NOT_EMPTY())),
   Field('testo_faq',type='text',requires = (IS_UPPER(), IS_NOT_EMPTY())),
   Field('note',type='text',requires = IS_UPPER()),
   Field('faq_ok', type= 'boolean', default = False),
   Field('faq_verifica', type= 'boolean', default = False),
   Field('data_caricamento',type='datetime', writable = False, readable = False, default=request.now, requires=IS_DATETIME(timezone=pytz.timezone("Europe/Gibraltar"))),
   Field('allegato',type='upload', uploadfield = 'nome_file', uploadfolder= allegati),
   Field('nome_file','blob'),
   Field('firma',type='text',readable = False, writable = False,
         default = '<p align="right" style = "font-size:12px">Sistema automatizzato F.A.Q si prega di non rispondere al presente messaggio.<br />Grazie.<br /> </p> <p align="right" style = "font-size:12px"> Per richiedere assistenza <a  href="https://gestionale.porsennasrl.it:81/ASSISTENZA-PA ">CLICCARE QUI</a> </p><p align="right" style = "font-size:12px">HELP DESK PORSENNA SRL</p>'),
    format='%(oggetto)s')

这在我的控制器中:

@auth.requires_login()
def prova_invio():
    mail = Mail()
    mail = auth.settings.mailer
    mail.settings.server = 'logging' if request.is_local else myconf.get('smtp.server')
    mail.settings.sender = myconf.get('smtp.sender')
    mail.settings.login = myconf.get('smtp.login')
    mail.settings.tls = myconf.get('smtp.tls') or False
    mail.settings.ssl = myconf.get('smtp.ssl') or False
    faq= db.faq(request.vars.id)
    testo= "<html>"+(faq.testo_faq)+"</html>" + "<html>"+(faq.firma)+"</html>"

    if mail.send(to=request.vars.email,
                subject= faq.oggetto,
                message= testo,
                attachments = mail.Attachment("/home/www-data/web2py/applications/DBurbi/allegati/"+faq.allegato)):
                status = 'RIUSCITO'

    else:
                status = 'FALLITO'
    return dict(status=status,indirizzo=request.vars.email,oggetto=faq.oggetto)

当我发送电子邮件时,我收到了这个错误:

  

[Errno 2]没有这样的文件或目录:   '/home/www-data/web2py/applications/DBurbi/static/faq.allegato.abb2396f642c3279.706172746e65722e6a7067.jpg'

我说该文件的名称不是那个,所以如何存储附件的真实姓名,以便我可以发送它? 如果“有一个”,我怎么才能发送附件,如果没有任何附件,我怎么发送电子邮件?

谢谢你们

1 个答案:

答案 0 :(得分:0)

首先,您不会同时指定uploadfielduploadfolder - 第一个用于将文件存储在数据库中的blob字段中,第二个用于指定要存储的文件系统文件夹文件。选择一个或另一个(因为您指定了uploadfield,这是优先的,因此文件存储在数据库中,而不是文件系统中。)

注意,您可以将开放文件对象作为第一个参数与“filename”参数一起传递,而不是将文件路径传递给mail.Attachement。要获取文件对象和文件名,您可以执行以下操作:

if faq.allegato:
    filename, stream = db.faq.allegato.retrieve(faq.allegato)
    attachment = mail.Attachment(stream, filename=filename)
else:
    attachment = None

然后做:

mail.send(..., attachments=attachment)

注意,无论文件是存储在数据库中还是存储在文件系统上,上述内容都将起作用。