如何在 rails 中使用 actionmailer 发送自己生成的 csv 附件

how to send self generated csv attachmnet using action mailer in rails

在我的 Rails 应用程序中,我在预订模型中创建了一个 CSV 文件。

def self.to_excel
  attributes = %w{ name email mobile address transaction_id price deposit paid booked_by date}
  CSV.generate(headers: true) do |csv|
    csv << attributes
    where('date(created_at) = ?', Date.today).each do |booking|
      csv << attributes.map{ |attr| booking.send(attr) }
    end
  end
end

预订控制器

def index
  respond_to do |format|
    format.html
    format.csv { send_data @bookings.to_excel, filename: "Booking-#{Date.today}.csv" }
  end
end

邮寄者

class CsvMailer < ApplicationMailer
  default from: "xyz@gmail.com"
  def send_csv(booking)
     @booking = booking
     attachments['Booking.csv'] = {mime_type: 'text/csv', content: csv}
     mail(to: "xyz@gmail.com", subject:   "Booking Details-#{Date.today}.csv")
  end
end

我需要每 24 小时发送一次自动生成的 csv 文件,其中包含当天预订的详细信息。这应该只生成 csv 并通过邮件程序将其邮寄。我该如何进行。哪位大神能帮帮忙

如果您想每 24 小时发送一次电子邮件,您需要执行 cron 作业。

请检查 gem whenever ,它用于 rails

中的 cron 作业

在schedule.rb

every :day, at: '12:00am' do
  runner "Booking.send_csv"
end

在 send_csv 方法中,生成 CSV 文件然后将其发送到邮件,如下所示

class Booking

  def generate_csv
    bookings = create query for fetching today's bookings
    csv = bookings.to_excel
    CsvMailer.send_csv(user, csv).deliver 
  end

end

您可以使用 Arask 进行最少的设置。安装 gem 并初始化文件并将其放入 config/initializers/arask.rb

arask.create script: 'Booking.send_csv', cron: '0 0 * * *'

并重用@vishal 代码:

class Booking

  def generate_csv
    bookings = create query for fetching todays bookings
    csv = bookings.to_excel
    CsvMailer.send_csv(user, csv).deliver 
  end

end