как можно вообще отправить письмо на почту?

Тема в разделе "Как сделать...", создана пользователем gordy, 26 ноя 2018.

  1. gordy

    gordy

    Регистр.:
    25 авг 2015
    Сообщения:
    211
    Симпатии:
    23
    использую старую версию движка yii v1.1.14

    написал модель

    PHP:
    <?php

    /**
    * ContactForm class.
    * ContactForm is the data structure for keeping
    * contact form data. It is used by the 'contact' action of 'SiteController'.
    */
    class ContactForm extends CFormModel
    {
        public 
    $name;
        public 
    $secondName;
        public 
    $phone;
        public 
    $email;
        public 
    $subject;
        public 
    $body;
        public 
    $verifyCode;

      
    /**
         * @return array the validation rules.
         */
        
    public function rules()
        {
            return [
                
    // name, email, subject and body are required
                
    [['name''email''secondName''phone''subject''body'], 'required'],
                
    // email has to be a valid email address
                
    ['email''email'],
                
    // verifyCode needs to be entered correctly
               /* ['verifyCode', 'captcha'],*/
            
    ];
        }

        
    /**
         * @return array customized attribute labels
         */
        
    public function attributeLabels()
        {
            return [
                
    'verifyCode' => 'Подтвердите код',
                
    'name' => 'Имя',
                
    'secondName' => 'отчество',
                
    'phone' => 'номер телефона',
                
    'email' => 'E-mail',
                
    'subject' => 'Тема',
                
    'body' => 'Сообщение',
            ];
        }

        
    /**
         * Sends an email to the specified email address using the information collected by this model.
         * @param string $email the target email address
         * @return bool whether the model passes validation
         */
                 
           /* функция отправки письма на почту */
        
    public function contact()
        {
             
    $content .= "<p><b>Имя пользователя: </b>" $this->name "</p>";
             
    $content .= "<p><b>Отчество: </b>" $this->secondName "</p>";
             
    $content .= "<p><b>E-mail:</b> " $this->email "</p>";
             
    $content .= "<p><b>Номер телефона:</b> " $this->phone "</p>";
             
    $content .= "<p>" $this->body "</p>";

            
    /* Проверяем форму на валидацию */
            
    if ($this->validate()) {
                
    Yii::$app->mailer->compose("@app/mail/layouts/html", ["content" => $content])
                    ->
    setFrom([Yii::$app->params['adminEmail'] => 'Колледж СРМК']) /* от кого */
                    
    ->setTo(Yii::$app->params['adminEmail']) /* куда */
                    
    ->setSubject($this->subject/* имя отправителя */
                    
    ->setTextBody($this->body)->setCharset('UTF-8'/* текст сообщения */
                    
    ->mail(); /* функция отправки письма */

                
    return true;
            }
            return 
    false;
        }
    }
    контроллер

    PHP:
    /**
         * Displays the contact page
         */
     
        
    public function actionContact()
        {
            
    $model=new ContactForm;

            if(isset(
    $_POST['ContactForm']))
            {
                
    $model->attributes=$_POST['ContactForm'];
                if(
    $model->validate())
                {
                    
    $name='=?UTF-8?B?'.base64_encode($model->name).'?=';
                    
    $subject='=?UTF-8?B?'.base64_encode($model->subject).'?=';
                    
    $headers="From: $name <{$model->email}>\r\n".
                        
    "Reply-To: {$model->email}\r\n".
                        
    "MIME-Version: 1.0\r\n".
                        
    "Content-Type: text/plain; charset=UTF-8";

                    
    mail(Yii::app()->params['adminEmail'],$subject,$model->body,$headers);



                    
    Yii::app()->user->setFlash('contact','Благодарим Вас за обращение к нам. Мы ответим Вам как можно скорее.');
                    
    $this->refresh();
                }
            }
            
    $this->render('contact',array('model'=>$model));
        }
        
    представление

    PHP:
    <?php
    /* @var $this SiteController */
    /* @var $model ContactForm */
    /* @var $form CActiveForm */

    $this->pageTitle=Yii::app()->name ' - Contact Us';
    $this->breadcrumbs=array(
        
    'Contact',
    );
    ?>

    <h1>Contact Us</h1>

    <?php if(Yii::app()->user->hasFlash('contact')): ?>

    <div class="flash-success">
        <?php echo Yii::app()->user->getFlash('contact'); ?>
    </div>

    <?php else: ?>

    <p>
    If you have business inquiries or other questions, please fill out the following form to contact us. Thank you.
    </p>

    <div class="form">

    <?php $form=$this->beginWidget('CActiveForm', array(
        
    'id'=>'contact-form',
        
    'enableClientValidation'=>true,
        
    'clientOptions'=>array(
            
    'validateOnSubmit'=>true,
        ),
    )); 
    ?>

        <p class="note">Fields with <span class="required">*</span> are required.</p>

        <?php echo $form->errorSummary($model); ?>

        <div class="row">
            <?php echo $form->labelEx($model,'name'); ?>
            <?php echo $form->textField($model,'name'); ?>
            <?php echo $form->error($model,'name'); ?>
        </div>

        <div class="row">
            <?php echo $form->labelEx($model,'secondName'); ?>
            <?php echo $form->textField($model,'secondName'); ?>
            <?php echo $form->error($model,'secondName'); ?>
        </div>
     
        <div class="row">
            <?php echo $form->labelEx($model,'phone'); ?>
            <?php echo $form->textField($model,'phone'); ?>
            <?php echo $form->error($model,'phone'); ?>
        </div>
     
        <div class="row">
            <?php echo $form->labelEx($model,'email'); ?>
            <?php echo $form->textField($model,'email'); ?>
            <?php echo $form->error($model,'email'); ?>
        </div>

        <div class="row">
            <?php echo $form->labelEx($model,'subject'); ?>
            <?php echo $form->textField($model,'subject',array('size'=>60,'maxlength'=>128)); ?>
            <?php echo $form->error($model,'subject'); ?>
        </div>

        <div class="row">
            <?php echo $form->labelEx($model,'body'); ?>
            <?php echo $form->textArea($model,'body',array('rows'=>6'cols'=>50)); ?>
            <?php echo $form->error($model,'body'); ?>
        </div>

        <?php if(CCaptcha::checkRequirements()): ?>
        <div class="row">
            <?php echo $form->labelEx($model,'verifyCode'); ?>
            <div>
            <?php $this->widget('CCaptcha'); ?>
            <?php echo $form->textField($model,'verifyCode'); ?>
            </div>
            <div class="hint">Please enter the letters as they are shown in the image above.
            <br/>Letters are not case-sensitive.</div>
            <?php echo $form->error($model,'verifyCode'); ?>
        </div>
        <?php endif; ?>

        <div class="row buttons">
            <?php echo CHtml::submitButton('Submit'); ?>
        </div>

    <?php $this->endWidget(); ?>

    </div><!-- form -->

    <?php endif; ?>

    подскажите пожалуйста очень срочно нужно, не отправляет почему то письма...

    в конфиг прописал так

    PHP:
     'dpsMailer' => array(
        
    'class' => 'ext.dpsmailer.components.dpsMailer',
        
    'sViewPath' => '[/path/to/mail/views]',
        
    'aFrom' => array( '[***@bk.ru]' => '[from]' ),
        
    'aBehaviors' => array(
            
    'swift' => array(
                
    'class' => 'ext.dpsmailer.behaviors.dpsSwiftMailerBehavior',
                
    'sLibPath'=> '[/path/to/Swift/Swift-5.0.0/lib]',
                
    'sTransport' => 'Swift_SmtpTransport',
                
    'aOptions' => array(
                    
    'Host'            => 'smtp.mail.ru',
                    
    'Port'            => 587,
                    
    'Encryption'    => 'ssl',
                    
    'Username'        => '***@bk.ru',
                    
    'Password'        => '********',
                ),
            ),
        ),
    ),
     
    Последнее редактирование: 26 ноя 2018
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.596
    Симпатии:
    1.508
    Путаница с названием переменных и используемых методов.

    В конфиге у тебя подключается компонент с названием 'dpsMailer', а в модельке вызываешь Yii::$app->mailer, так же в контролере ты вообще забил на этот метод в модели и вызываешь нативную - mail()
     
  3. gordy

    gordy

    Регистр.:
    25 авг 2015
    Сообщения:
    211
    Симпатии:
    23
    да спасибо, уже с этим разобрался все работает, но есть одно но, в action проблема, подскажите как исправить?

    вот суть проблемы, мой экшен

    PHP:
        public function actionContact()
        {
            
    $model=new ContactForm;

            if(isset(
    $_POST['ContactForm']))
            {
                
    $model->attributes=$_POST['ContactForm'];
                if(
    $model->validate())
                {
                   
                    
    $subject $model->subject;
                   
        
    /*     $content .= "<p><b>Имя пользователя: </b>" . $model->name . "</p>";
             $content .= "<p><b>Отчество: </b>" . $model->secondName . "</p>";
             $content .= "<p><b>E-mail:</b> " . $model->email . "</p>";
             $content .= "<p><b>Номер телефона:</b> " . $model->phone . "</p>";
             $content .= "<p>" . $model->body . "</p>";
            */                     
           
                    
    $content "
                    От: 
    {$model->name} {$model->secondName}\r\n".
                    
    "Номер телефона: {$model->phone}\r\n".
                    
    "E-mail: {$model->email}\r\n".
                    
    "Тема сообщения: {$model->subject}\r\n".
                    
    "Описание: {$model->body}\r\n";
                       
            
    mail(Yii::app()->params['adminEmail'],$subject,$content);

            
    Yii::app()->user->setFlash('contact','Благодарим Вас за обращение к нам. Мы ответим Вам как можно скорее.');
            
    $this->refresh();
                }
            }
            
    $this->render('contact',array('model'=>$model));
        }
    если сюда добавить теги

    PHP:
      $content "
                    От: <b> 
    {$model->name} {$model->secondName} <b>\r\n".
                    
    "Номер телефона: <b>{$model->phone} <b>\r\n".
                    
    "E-mail: <b> {$model->email} <b>\r\n".
                    
    "Тема сообщения:  <b> {$model->subject} <b>\r\n".
                    
    "Описание: <b> {$model->body} <b>\r\n";
    то в почтовике mail они не выделяются жирным, а просто выводится на экран <b><b> подскажите как это исправить
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.596
    Симпатии:
    1.508
    Почта по умолчанию это чисто текстовый формат, но современные клиенты достаточно умные чтобы понимать и html. Для это помимо текста письма добавьте вложение в HTML кодом
     
  5. gordy

    gordy

    Регистр.:
    25 авг 2015
    Сообщения:
    211
    Симпатии:
    23
    а можно примерчик, что Вы подразумеваете под вложением html
     
  6. pautina

    pautina Постоялец

    Регистр.:
    15 фев 2010
    Сообщения:
    106
    Симпатии:
    34
    А покажите тело письмо, точнее исходный код письма, можно без заголовков.
    Для того что бы у Вас отображались теги, в теле письма должно присутствовать, не в base64, следующие строки:
    Код:
    Content-Type: text/html; charset="UTF-8"
    Content-Transfer-Encoding: base64
     
  7. pautina

    pautina Постоялец

    Регистр.:
    15 фев 2010
    Сообщения:
    106
    Симпатии:
    34
    Вы не правы.
    Код
    Код:
    Content-Type: text/html; charset="UTF-8"
    Content-Transfer-Encoding: base64
    должен находится перед закодированным html кодом. Вот пример:

    Код:
    Content-Type: text/html; charset="UTF-8"
    Content-Transfer-Encoding: base64
    PGI+INCY0LzRjyA8Yj4gPGI+INCe0YLRh9C10YHRgtCy0L4gPGI+
    А если расшифровать, то это будет так:
    Код:
    Content-Type: text/html; charset="UTF-8"
    Content-Transfer-Encoding: base64
    <b> Имя <b> <b> Отчество <b>
     
  8. TimeOutDesign

    TimeOutDesign Создатель

    Регистр.:
    26 ноя 2018
    Сообщения:
    12
    Симпатии:
    1
    не совсем понимаю смысл шифровать тело письма, когда в этом нет надобности..

    а еще вот здесь
    может не считывать html из-за Content-Type: text/plain;....