有时我需要向我的网站用户发送带有附件的电子邮件。我使用SendGrid和python SendGrid 0.1.4来完成发送。电子邮件发送通过Redis排队。
问题是——我应该把附件放在哪里,它目前是作为web过程的一部分生成的?我试着把它放在/tmp上,但没有用——大概是因为该文件在web进程关闭时被删除了,而在工作进程到来时不再可用?我尝试了/app/media,但也不起作用——我想是因为/app/media是只读的(尽管奇怪的是,我在尝试写入该目录时没有遇到任何错误)?
我认为答案可能是,我必须在发送电子邮件的同一过程中重构代码以生成附件,但由于这是一个非常重要的重构,我想我应该先询问社区。谢谢
Heroku的/tmp
目录对每个dyno都是唯一的。因此,您的Web Dyno将文件保存在其/tmp
目录中,然后您的工作人员在其/tmp
目录中查找,但找不到它。
最好的选择可能是重构你的代码(这样你就不会阻塞你的Web Dyno的资源——创建和向磁盘写入文件)。然而,如果您真的想避免它,您可以将文件临时存储在S3[教程]或其他一些外部存储机制上。
您总是需要使用外部存储,例如S3,来存储每个服务器实例/dyno都需要使用的文件。有趣的是,如果你不想永远保存这些附件。您可以将一个生命周期事件附加到S3存储桶,如果文件早于x天,它将自动删除该文件。