Ruby on Rails 如何将帖子中的图片作为附件添加到发送邮件中
解决方法
1. 调整邮件发送逻辑添加附件
直接在new_post方法中补充附件添加逻辑即可,可根据你实际使用的图片存储方案选择对应代码,修改后的完整代码如下:
class NotifierMailer < ApplicationMailer default from: ENV['ADMIN_MAIL'] layout 'mailer' def new_post(post) @post = post # --------------- 新增附件逻辑开始 --------------- # 场景1:使用Active Storage存储单张图片(Post模型配置了has_one_attached :image) if @post.image.attached? attachments[@post.image.filename.to_s] = @post.image.download end # 场景2:使用CarrierWave存储单张图片(Post模型配置了mount_uploader :image, ImageUploader) # if @post.image.present? # attachments[File.basename(@post.image.path)] = File.read(@post.image.path) # end # 场景3:多图上传的情况(以Active Storage多图为例) # @post.images.each do |image| # attachments[image.filename.to_s] = image.download # end # --------------- 新增附件逻辑结束 --------------- mail(to: @post.email, bcc: ENV['ADMIN_MAIL'], subject: " New Post.") end end
2. 可选:在邮件正文内联显示图片
如果不想仅让图片作为可下载附件,需要直接显示在邮件内容里,将附件声明修改为inline类型即可:
# 单图内联示例 if @post.image.attached? attachments.inline[@post.image.filename.to_s] = @post.image.download end
之后在对应的邮件视图文件(路径为app/views/notifier_mailer/new_post.html.erb)中添加图片渲染代码:
<%= image_tag attachments[@post.image.filename.to_s].url, alt: "帖子配图" %>
注意事项
- 生产环境如果使用云存储(如OSS、S3),要确保服务端有读取图片资源的权限,避免读取失败报错
- 过大的图片附件容易被邮件服务商拦截,建议先在上传逻辑里限制图片大小,或者在添加附件前做压缩处理
- 多图场景注意总附件大小不要超出邮件服务商的限制,一般单封邮件总附件不要超过20M
内容的提问来源于stack exchange,提问作者Rasdi Ishak
相关产品推荐
相关产品推荐

