Как записать содержимое CSV-файла в электронное письмо с использованием Ruby? - PullRequest
0 голосов
/ 04 января 2019

У меня есть код, который вычисляет набор значений и записывает их в CSV-файл. Я отправляю этот CSV-файл в виде вложения в электронное письмо.

Теперь я хочу записать содержимое файла csv в тело письма, а не отправлять его как вложение.

CSV-файл выглядит так:

Region,Count
Asia,5
America,3
Europe,4

Код, который я использовал для отправки электронного письма, выглядит следующим образом:

require 'mail'
def mailsender
  Mail.defaults do
    delivery_method :smtp,{ address: "smtp.xyz.com",openssl_verify_mode: "none" }
  end

  Mail.deliver do
    from     'abc@xyz.com'
    to       'admins@xyz.com'
    subject  'Status Report'
    body     'Please find attached the status report'
    add_file 'C:\Users\abc\Desktop\Ruby\Summary.csv'
  end
end

Так что вместо того, чтобы иметь прикрепленный CSV-файл с информацией в нем, я бы хотел, чтобы мое почтовое тело выглядело так:

Пожалуйста, найдите резюме ниже:

Азия 5
Америка 3
Европа 4

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Для достижения ожидаемого результата достаточно, если вы объедините текущее тело с данными CSV:

def formatted_body
  title + data.join("\n")
end

где title - ваше текущее тело и значения данных, использованные для создания файла CSV

def title
  "Please find attached the status report:\n"
end

def data
  # code which returns your structure 
  ["Asia 5", "America 3", "Europe 4"]  

  # alternatively reuse existing .csv
  read_csv
end

В случае, если вы хотите повторно использовать существующий файл .csv

def read_csv
  content = CSV.read("data.csv")
  content.shift  # to exclude headers
  content.map {|row| row.join(' ') }
end

Возможно, вы захотите включить его в класс:

require 'mail'

class MailSender
  attr_accessor :data

  def initialize(data)
    @data = data
  end

  def mailsender
    Mail.defaults do
      delivery_method :smtp,{ address: "smtp.xyz.com",openssl_verify_mode: "none" }
    end

    Mail.deliver do
      from     'abc@xyz.com'
      to       'admins@xyz.com'
      subject  'Status Report'
      body     formatted_body
      add_file 'C:\Users\abc\Desktop\Ruby\Summary.csv'
    end
  end

  private 
  def formatted_body
    title + data.join("\n")
  end

  def title 
    "Please find attached the status report:\n"
  end

end
0 голосов
/ 04 января 2019

Вы можете использовать stdlib's CSV, чтобы прочитать файл:

require 'csv'

contents = CSV.read('file.csv')

, который даст вам массив массивов, где первое значение - это заголовки. Вы также можете передать headers: true, чтобы получить значения в виде хэшей:

> contents = CSV.read('file.csv', headers: true)
> contents.first

 {
  "Region" => "Asia",
  "Count" => "5"
 }

Эта опция полезна, если вы имеете дело с большими наборами данных и вам нужен доступ к значениям по имени:

> contents.map{|i| "#{i["Region"]} #{i["Count"]}"}

[
    [0] "Asia 5",
    [1] "America 3",
    [2] "Europe 4"
]

Затем вы можете .join("\n") это получить желаемое форматирование строки.

Будьте осторожны с CSV#read, поскольку он вытягивает весь файл в память. Если это огромный файл, вы можете перебирать его построчно с помощью CSV#foreach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...