В чем разница между sendmail через CGI и Perl?
Вопрос
Я использую sendmail в perl и заметил (после долгих ударов головой о стену), что когда скрипт запускается из командной строки, вам нужно пропустить \ n (s) после вашей электронной почты и письма получателя. адрес электронной почты для правильного форматирования почты, но при запуске через CGI, если эти \ n (s) отсутствуют, он возвращает ошибку, указывающую, что электронная почта получателя искажена. Р>
Кто-нибудь еще сталкивался с этим? Что они делают по-разному?
Решение
В нескольких ваших комментариях вы упоминаете, что запускаете скрипт из командной строки с параметром -l (perl -l foo.cgi).
Опция -l включает автоматическую обработку конца строки, и, поскольку ваша проблема связана с окончаниями строки, я предлагаю вам попробовать без -l.
Другие советы
Готов поспорить, что вы получаете данные из подсказок в командной строке, а не chomp а> их так:
my $send_to = <>;
Это означает, что $ send_to уже будет иметь " \ n " ;. Чтобы они оба работали одинаково, объедините переменные:
my $send_to = <>;
chomp($send_to);
или просто
chomp(my $send_to = <>);
Откуда поступают данные? Закодировано в скрипте или из веб-формы?
Кроме того, если вы получите адрес электронной почты получателя из веб-формы, ваша форма будет использоваться спаммерами. Это 100% гарантия.
Термин «CGI»; В широком смысле, если вы имеете в виду, что ваш Perl-скрипт запускается как CGI по сравнению с Perl-скриптом YUR в командной строке, я бы посмотрел на путь, который имеет скрипт, и его общую наследуемую среду. Особенно, если вы используете его как разные идентификаторы пользователей. Если веб-сервер находится в chroot и т. Д.
use Data::Dumper;
warn(Dumper(\%ENV));
Я предполагаю, что у вас есть что-то вроде этого для запуска через командную строку:
my $your_email = "you@foo.bar";
my $recipient_email = "them@foo.bar";
и это когда "работает через CGI":
my $your_email = "you@foo.bar\n";
my $recipient_email = "them@foo.bar\n";
Итак, вопрос, который я бы вам задал, заключается в том, как вы вызываете sendmail с указанными выше переменными, а также о том, что вы имеете в виду, когда говорите «работает через CGI». против запуска через командную строку? Вы просто добавляете код CGI и по-прежнему работаете через командную строку или посещаете его URL в веб-браузере?