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

gordy

Мастер
Регистрация
25 Авг 2015
Сообщения
228
Реакции
32
использую старую версию движка 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'        => '********',
            ),
        ),
    ),
),
 
Последнее редактирование:
Путаница с названием переменных и используемых методов.

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

да спасибо, уже с этим разобрался все работает, но есть одно но, в 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> подскажите как это исправить
 
Почта по умолчанию это чисто текстовый формат, но современные клиенты достаточно умные чтобы понимать и html. Для это помимо текста письма добавьте вложение в HTML кодом
 
так делал, на почту приходит в таком ввиде, <b> Имя <b> <b> Отчество <b>
А покажите тело письмо, точнее исходный код письма, можно без заголовков.
Для того что бы у Вас отображались теги, в теле письма должно присутствовать, не в base64, следующие строки:
Код:
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: base64
 
вот я тоже об этом, а сделать это можно лишь если прописать <html><head>cpntent-type.....</head><body>тело письма</body></html>
так должно работать. типа полная структура страницы в теле письма....
Вы не правы.
Код
Код:
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>
 
Вы не правы.
Код
Код:
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>
не совсем понимаю смысл шифровать тело письма, когда в этом нет надобности..

а еще вот здесь
контроллер

PHP:
/**
                $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);
может не считывать html из-за Content-Type: text/plain;....
 
Назад
Сверху