Хорошо, я объясню это с оговоркой, что я не думаю, что это лучший способ выполнить эту задачу (см. Комментарии к вашему вопросу).
open()
с трубой / вертикальной чертойтак как первый персонаж будет порождать оболочку, выполнить команду и передать свой ввод в команду через канал в стиле Unix.Например, команда unix cat file.txt | sort
отправит содержимое файла команде sort.Точно так же open("| sort", 'w') {|cmd| cmd << file}
возьмет содержимое переменной файла и отправит его на сортировку.(«W» означает, что он открыт для записи).
% Q () - альтернативный способ заключить в кавычки строку Ruby.Таким образом, это не мешает буквальным символам кавычек в строке, что может привести к ужасному экранированию.Таким образом, команда mail -s
выполняется с темой и получателем.
Кавычки необходимы вокруг темы, потому что команда mail будет интерпретироваться оболочкой, а аргументы разделяются пробелами, поэтому, если вам нужен пробел в аргументе, вы окружаете егоцитаты.Поскольку аргумент -s
предназначен для субъекта, он должен быть в кавычках, поскольку он, вероятно, будет содержать пробелы.С другой стороны, получатель является адресом электронной почты, а адреса электронной почты не содержат пробелов, поэтому в них нет необходимости.
Блок обеспечивает ввод команды по трубопроводу.Все, что вы добавляете в переменную блока (в данном случае msg
), отправляется в канал.Таким образом, тело письма добавляется (через оператор <<) к сообщению и, следовательно, передается в команду mail.Unix-эквивалент выглядит примерно так: <code>cat body.txt | mail -s "subject" recipient@a.com