2013-07-30 1 views
1

У меня есть установка nms formmail недавно в моем блоге, и я сделал по электронной почте необязательным, однако я хотел бы убедиться, что когда он будет заполнен, проверка проверки подлинности электронной почты будет запущена , Похоже, что nms formmail предлагает эту проверку только в том случае, если требуется поле электронной почты.nms formmail - не проверять электронную почту, если не требуется + отдельная страница переадресации

Я хотел бы изменить скрипт cgi, используя собственную функцию validate_email, и перенаправить на страницу «Недействительный адрес электронной почты», если поле электронной почты не пустое, а поле недействительно.

Обратите внимание, что я добавил следующий код уже который заботится о добавлении стандартной электронной почты в случае, если поле пусто, поэтому проверка должна, вероятно, придет после этой линии где-то: $email = '[email protected]' unless $email;

внутри этого фрагмента кода:

sub send_main_email { 
    my ($self, $date, $email, $realname) = @_; 

    my $mailer = $self->mailer; 
    $mailer->newmail($self->name_and_version, $self->{CFG}{postmaster}, @{ $self->{Recipients} }); 

    $email = '[email protected]' unless $email; 

    $self->send_main_email_header($email, $realname); 
    $mailer->print("\n"); 

    $self->send_main_email_body_header($date); 

    $self->send_main_email_print_config; 

    $self->send_main_email_fields; 

    $self->send_main_email_footer; 

    $mailer->endmail; 
} 

Я попытался сделать следующее под [email protected]' unless $email;:

if (validate_email($email) = 0) { 
    print $self->cgi_object->redirect($self->{FormConfig}{'bad_email'}); 
} 

... но он вернулся эту ошибку : Can't modify non-lvalue subroutine call at (eval 8) line 1062.

это HTML я использую:

<form method=post action="http://mydomain.com/formmail.cgi"> 
<label for="realname">name (optional)</label><br /> 
<input type=text name="realname" /><br /> 
<label for="email">e-mail (optional)</label><br /> 
<input type=text name="email"/><br /> 
<label for="text">text (required)</label><br /> 
<textarea name=text></textarea><br /> 
<input type=submit value="send"> 

<input type=hidden name="redirect" value="http://mydomain.com/thank-you.html"> 
<input type=hidden name="subject" value="Email form submitted"> 
<input type=hidden name="required" value="text"> 
<input type=hidden name="missing_fields_redirect" value="http://mydomain.com/missing-field.html"> 
<input type=hidden name="bad_email" value="http://www.google.com/"> 
<input type=hidden name="env_report" value="REMOTE_HOST,REMOTE_ADDR,HTTP_USER_AGENT"> 
<input type=hidden name="sort" value="order:contact,text"> 
</form> 

Обратите внимание, что у меня нет специальных знаний в Perl, но я довольно быстро в подбирая новый язык кода, поэтому, пожалуйста, медведь со мной , и постарайтесь быть как можно более подробными (желательно с примером кода вместо описания того, что вы думаете, если только это не имеет больше смысла).

ответ

2

if (validate_email($email) = 0) должен быть if (not validate_email($email)) { или if (!validate_email($email)) { или if (0 == validate_email($email)) { потому, что = является оператором присваивания и == является оператором

числовая равенства, которое охватывает синтаксическую ошибку, все у меня есть время для :) также «VALID_EMAIL» звучит лучше читать (if not valid_email [email protected], затем перенаправить на badmailpage

+0

попробовал '(! validate_email ($ email))', но получил еще одну ошибку (это только показано в файлах журналов): 'Undefined subroutine & CGI :: NMS :: Script :: FormMail :: validate_email, вызываемый по (eval 8) строке 1062', хотя validate_email определен намного раньше в скрипте. Я не вызываю подпрограмму внутри другой подпрограммы ...? – webeno

+0

Добавьте 'die __PACKAGE __;' перед 'sub send_main_email', чтобы вы знали, как его называть (полное имя). Подробнее об этом в [Простом модульном учебнике] (http://perlmonks.org/?node_id=102347). Или назовите его 'sub Webeno :: valid_email' и назовите его' Webeno :: valid_email() ' – optional

+0

Я добавил' die __PACKAGE __; 'перед' sub send_main_email' и получил эту ошибку в журнале: 'AH01215: CGI :: NMS: : Script :: FormMail at (eval 8) line 1055' ... 'AH01215: BEGIN failed - компиляция прервана в [name_of_file] .cgi line 3285', где' [name_of_file] '- это имя файла CGI на сервере , Я не знаю, как назвать подпрограмму, и я действительно хочу использовать существующую, поэтому как мне это сделать? – webeno