link_to помощник для частичного запуска URL-адресов неожиданного поведения [duplicate]

В основном функция mail() отключена на общем хостинге. Лучше использовать SMTP. Лучшим вариантом будет Gmail или SendGrid.


SMTPconfig.php

<?php 
    $SmtpServer="smtp.*.*";
    $SmtpPort="2525"; //default
    $SmtpUser="***";
    $SmtpPass="***";
?>

SMTPmail.php

<?php
class SMTPClient
{

    function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
    {

        $this->SmtpServer = $SmtpServer;
        $this->SmtpUser = base64_encode ($SmtpUser);
        $this->SmtpPass = base64_encode ($SmtpPass);
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;

        if ($SmtpPort == "") 
        {
            $this->PortSMTP = 25;
        }
        else
        {
            $this->PortSMTP = $SmtpPort;
        }
    }

    function SendMail ()
    {
        $newLine = "\r\n";
        $headers = "MIME-Version: 1.0" . $newLine;  
        $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  

        if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
        {
            fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n"); 
            $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
            fputs($SMTPIN, "auth login\r\n");
            $talk["res"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpUser."\r\n");
            $talk["user"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpPass."\r\n");
            $talk["pass"]=fgets($SMTPIN,256);
            fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
            $talk["From"] = fgets ( $SMTPIN, 1024 ); 
            fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
            $talk["To"] = fgets ($SMTPIN, 1024); 
            fputs($SMTPIN, "DATA\r\n");
            $talk["data"]=fgets( $SMTPIN,1024 );
            fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
            $talk["send"]=fgets($SMTPIN,256);
            //CLOSE CONNECTION AND EXIT ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

<?php 
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    $to = "";
    $from = $_POST['email'];
    $subject = "Enquiry";
    $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>
0
задан Martin Tournoij 16 March 2016 в 15:34
поделиться

3 ответа

Я предпочитаю санировать вход пользователя один раз (когда пользователь вводит эти данные), а не каждый раз, когда данные визуализируются. Для этого добавьте в свою модель следующее:

# in app/models/user.rb
def portfolio=(url)
  if url.present?
    url = url.match(/https?:\/\//) ? url : "http://#{url}"
    write_attribute(:portfolio, url)
  end
end

Затем используйте его в своем представлении следующим образом:

<%= link_to truncate(@user.portfolio_title, length: 17), 
            @user.portfolio, rel: 'noopener', target: '_blank' %> 

Примечание. Для соображений безопасности вы можете использовать target: '_blank' всегда вместе с rel: 'noopener'.

1
ответ дан spickermann 21 August 2018 в 07:52
поделиться
  • 1
    Огромное спасибо. мне нужно снова мигрировать после реализации этого или чего-то еще? – rs19 16 March 2016 в 15:50
  • 2
    Санируйте существующие записи, запустив: User.find_each { |u| u.update(portfolio: u.portfolio) } в консоли Rails. – spickermann 16 March 2016 в 15:52
  • 3
    ОК классный. поэтому все работает, за исключением того, что оно не открывается в ссылке в новом окне. – rs19 16 March 2016 в 15:57
  • 4
    @ rs19: Извините, вы должны использовать оба (target и rel). Я обновил свой ответ. – spickermann 16 March 2016 в 16:00
  • 5
    еще раз спасибо. действительно ценю вашу помощь. – rs19 16 March 2016 в 16:06

Возможно, вы можете поместить этот пример кода в помощник и получить то, что вам нужно

    def link_helper link

        if link[0..3] == "http" or link[0..4] == "https"
            link
        else
            "//#{link}"
        end
    end
0
ответ дан Sudipta Mondal 21 August 2018 в 07:52
поделиться
  • 1
    Что случилось с link.start_with?('http')? ;-) – Martin Tournoij 16 March 2016 в 15:49
  • 2
    Одинаково ли предположить, что страница портфолио всегда поддерживает тот же протокол, что и родительская страница? – spickermann 16 March 2016 в 15:56

Полоса http:// с начала:

<%= link_to truncate(@user.portfolio_title, :length => 17), 
"http://#{@user.portfolio.sub(%r!^http://!i, '')}", :target => "_blank"  %> 
0
ответ дан vitas 21 August 2018 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: