You need to enable JavaScript to run this app. Ruby on Rails 如何将帖子中的图片作为附件添加到发送邮件中
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 16:36:00