Почему в коде Fortran следует использовать единицы измерения больше 10? [Дубликат]

В основном функция 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();
}
?>
2
задан Vladimir F 6 April 2016 в 13:17
поделиться

2 ответа

Fortran не имеет номеров магических единиц. В стандарте Fortran ничего не сказано о 5, 6 или любом другом действительном номере единицы, используемом для специального назначения. Таким образом, вы можете использовать оператор open для связывания любого действительного номера единицы с файлом. Как бы там ни было, традиционно по причинам, которые предшествовали мне 5 и 6, были предварительно связаны с клавиатурой и экраном. Теперь по-прежнему вы можете изменить ассоциацию с помощью открытого оператора, и это прекрасно, что может привести к путанице, поэтому большинство людей, которых я знаю, рекомендуют избегать этого и использовать номера единиц 10 и выше. Кроме того, поскольку 5 и 6 не гарантируется, что они связаны с устройствами ввода и вывода по умолчанию, которые я бы рекомендовал против их использования, предпочитая * или, в более современном коде, именованные константы input_unit, output_unit и error_unit из iso_fortran_env встроенный модуль.

Итак, в итоге у вас есть правильная идея, и я не удивлен, что вы в замешательстве.

4
ответ дан Ian Bush 21 August 2018 в 21:48
поделиться

Ничто в стандарте не говорит о том, что единицы 5 и 6 имеют какое-либо особое значение, хотя на практике стандартный вход и стандартный выход часто предварительно связаны с 5 и 6.

Модуль iso_fortran_env из Fortran 2008 содержит константы

INPUT_UNIT
OUTPUT_UNIT
ERROR_UNIT

с номерами устройств, в которых подключены стандартный вход, стандартный вывод и стандартная ошибка. Они могут быть разными, чем 5 и 6.

Открытие файла в используемом модуле заставляет устройство связываться с новым файлом.

Например, Руководство Cray Fortran говорит:

Номера устройств 100, 101 и 102 постоянно связаны со стандартным входом, стандартным выходом и стандартными файлами ошибок соответственно.

Это означает, что если вы открываете какой-либо другой файл, так как стандартный входной и стандартный выход 5 или 6 имеют еще один блок, где они предварительно подключены, и они не будут закрыты.

3
ответ дан francescalus 21 August 2018 в 21:48
поделиться
Другие вопросы по тегам:

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