Проблема с отправкой почты при запуске сайта - vorst.ru

Email


Как отправить письмо с сайта, чтобы оно не попало в спам

Размещая заказ сайта заказчик часто подразумевает наличие формы обратной связи. Отправить почту с созданного сайта не проблема. Но если домен отправителя не совпадает с доменом нового сайта, почта не уйдет.

Email

Как отправить письмо с сайта, чтобы оно не попало в спам

При создании сайта почти всегда предусматривают форму обратной связи.

Допустим у вас на сайте есть форма обратной связи и посетитель заполнил в ней поле Name и поле Email. Логично отправить сообщение с сайта от имени посетителя на адрес администратора сайта или, например, адрес отдела маркетинга.

Но так отправить сообщение не получится. При отправке сообщения с сайта, нужно чтобы отправитель имел тот-же домен, что и сайт.


Как указать отправителя, чтобы письмо не попало в спам

В лучшем случае, при отправке от имени посетителя (если в поле From вы укажите данные посетителя) сообщение попадет в спам. Скорее всего сообщение просто не дойдет до адресата. Еще хуже - может выскочить ошибка. Например SwiftMailer точно выкинет исключение. Именно этот пакет и будем использовать в примерах.

class ContactForm extends Model
{
  public $name;
  public $email;
  public $subject;
  public $body;
  public $agree;
  public $verifyCode;
  ...  
  public function sendEmail()
  {
    return Yii::$app->mailer->compose()
      ->setTo(Yii::$app->params['adminEmail'])
      ->setFrom([$this->mail => $this->name])
      ->setSubject($this->subject)
      ->setTextBody($this->body)
      ->send();
  }

Можно указать в качестве отправителя email администратора сайта, а в теме сообщения указать реальный адрес отправителя. Но тогда, прежде чем ответить на такое письмо, придется копировать email из темы сообщения.

public function sendEmail()
{
  return Yii::$app->mailer->compose()
    ->setTo(Yii::$app->params['adminEmail'])
    ->setFrom(Yii::$app->params['adminEmail'])
    ->setSubject('<' . $this->name . '>' . $this->email . ': ' . $this->subject)
    ->setTextBody($this->body)
    ->send();
}

Но выход есть. Оказывается, поле From может состоять из нескольких адресов. И если первый адрес имеет тот-же домен, что и сайт, то второй вовсе не обязан принадлежать тому-же домену. И на такое письмо можно написать ответ без копирования адреса.

Допустим, в параметрах задана почта администратора.

<?php
return [
  'responsible' => [
    'admin' => ['admin@your-domain.ru' => 'NoName'],
    'marketing' => ['marketing@your-domain.ru' => 'Marketing Department'],
  ],
  ...

Тогда отправка письма может выглядеть следующим образом.

public function sendEmail()
{
  // first email address should be admin@your-domain.com because
  // from other email address mail can't be sent
  $from = Yii::$app->params['responsible']['admin'];
  // add real sender
  $from[$this->email] = $this->name;
  $contact = Yii::$app->params['responsible']['marketing'];
  return Yii::$app->mailer->compose()
    ->setTo($contact)
    ->setFrom($from)
    ->setSubject($this->subject)
    ->setTextBody($this->body)
    ->send();
}

Заключение

Если вы владеете доменом your-domain.ru, то, при отправке почты с сайта, обязаны указать в качестве отправителя адрес address@your-domain.ru. Иначе письмо не уйдет. Но отправителей можно указать пару и проблема решена.

Оставьте комментарий