×
Техническая документация: Хостинг

Авторизованная отправка почты с серверов виртуального хостинга

Поскольку отправка анонимных сообщений с серверов виртуального Windows-хостинга запрещена, отправку писем следует производить через SMTP-сервер, для чего так же возможно использовать и нашу почтовую систему.

Как отправлять письма, используя PHP?

С помощью любого класса PHP, поддерживающего авторизацию на smtp-сервере. Например, можно использовать набор классов PHPMailer.

Так же, вы можете воспользоваться нашим примером, в котором реализована отправка писем с использованием smtp-сервера, для которого требуется авторизация. Поэтому не забудьте добавить в скрипт соответствующие реквизиты доступа, например:

<?php

// Если нужно показать лог SMTP-сессии, то можно раскомментировать следующую строчку.
//$_SERVER['debug'] = true;

function MailSmtp($reciever$subject$content$headers$debug 0) {

  $smtp_server 'smtp.masterhost.ru'// адрес SMTP-сервера
  $smtp_port 25// порт SMTP-сервера
  $smtp_user 'user@domen.ru'// Имя пользователя для авторизации на SMTP-сервере
  $smtp_password 'pAsSwORd'// Пароль для авторизации на SMTP-сервере
  $mail_from 'frommailbox@domen.ru'// Ящик, с которого отправляется письмо

  $sock fsockopen($smtp_server,$smtp_port,$errno,$errstr,30);

  $str fgets($sock,512);
  if (!$sock) {
    printf("Socket is not created\n");
    exit(1);
  }

  smtp_msg($sock"HELO " $_SERVER['SERVER_NAME']);
  smtp_msg($sock"AUTH LOGIN");
  smtp_msg($sockbase64_encode($smtp_user));
  smtp_msg($sockbase64_encode($smtp_password));
  smtp_msg($sock"MAIL FROM: <" $mail_from ">");
  smtp_msg($sock"RCPT TO: <" $reciever ">");
  smtp_msg($sock"DATA");

  $headers "Subject: " $subject "\r\n" $headers;

  $data $headers "\r\n\r\n" $content "\r\n.";

  smtp_msg($sock$data);
  smtp_msg($sock"QUIT");

  fclose($sock);
}


function smtp_msg($sock$msg) {

  if (!$sock) {
    printf("Broken socket!\n");
    exit(1);
  }

  if (isset($_SERVER['debug']) && $_SERVER['debug']) {
    printf("Send from us: %s<BR>"nl2br(htmlspecialchars($msg)));
  }
  fputs($sock"$msg\r\n");
  $str fgets($sock512);
  if (!$sock) {
    printf("Socket is down\n");
    exit(1);
  }
  else {
    if (isset($_SERVER['debug']) && $_SERVER['debug']) {
      printf("Got from server: %s<BR>"nl2br(htmlspecialchars($str)));
    }

    $e explode(" "$str);
    $code array_shift($e);
    $str implode(" "$e);

    if ($code 499) {
      printf("Problems with SMTP conversation.<BR><BR>Code %d.<BR>Message %s<BR>"$code$str);
      exit(1);
    }
  }
}

?>

Скачать пример готового скрипта с функцией MailSmtp(): smtpauth.php.sample

Использовать описанную выше функцию MailSmtp() можно для прямой замены функции mail(), рассмотрим пример самой простой формы на PHP:

<?php

if (isset($_POST['submit'])) {

  $to      $_POST['to'];
  $subject $_POST['subj'];
  $message $_POST['msg'];
  
  // Заголовки сообщения, в них определяется кодировка сообщения, поля From, To и т.д.
  $headers "MIME-Version: 1.0\r\n";
  $headers .= "Content-type: text/html; charset=windows-1251\r\n";
  $headers .= "To: $to\r\n";
  $headers .= "From: Имя отправителя <from@domen.ru>";
  
  // mail ($to, $subject, $message, $headers);
 
  require_once "smtpauth.php";
  MailSmtp ($to$subject$message$headers);

} 

?>

<form action="" method="post">
  <pre>
    Кому:   <input type="text" name="to">
    Тема:   <input type="text" name="subj">
    Текст:  <input type="text" name="msg">
    <input type="submit" value="Отправить!" name="submit">
  </pre>
</form>

Для того, что бы данная форма заработала без функции mail() мы включили файл smtpauth.php через require_once и вызвали функцию MailSmtp(), описанную в нем, с аналогичными для mail() аргументами. При этом сам вызов mail() мы закомментировали в коде, что бы избежать ошибки при выполнении скрипта.

Как отправлять письма, используя ASP.NET?

Если вы используете версию 2.0, то используя класс MailMessage (используется пространство имен System.Net.Mail), хорошо описанный здесь.

Ниже приведены примеры его использования для языков «C#» и «VisualBasic»:

Пример для языка «C#»:

<% @Page Language="c#" %>
<% @Import Namespace="System.Net.Mail" %>
<% @Import Namespace="System.Net" %>
<%

MailMessage message = new MailMessage(); // создание нового письма
message.To.Add ("user@tomail.tld"); // добавление адреса получателя
message.From = new MailAddress("from@domain.tld", "Имя_отправителя"); // указание имени и адреса отправителя
message.Subject = "Тема письма"; // указание темы письма 
message.BodyEncoding = System.Text.Encoding.UTF8; // указание кодировки письма
message.IsBodyHtml = false; // указание формата письма (true - HTML, false - не HTML)
message.Body = "Текст письма"; // указание текста (тела) письма

SmtpClient client = new SmtpClient("smtp.domain.tld",25); // создание нового подключения к серверу "smtp.domain.tld"
client.DeliveryMethod = SmtpDeliveryMethod.Network; // определяет метод отправки сообщений
client.EnableSsl = false; // отключает необходимость использования защищенного соединения с сервером
client.UseDefaultCredentials = false; // отключение использования реквизитов авторизации "по-умолчанию"
client.Credentials = new NetworkCredential("postmaster@domain.tld", "***password***"); // указание нужных реквизитов (имени пользователя и пароля) для авторизации на SMTP-сервере
client.Send(message); // отправка сообщения

%>

Скачать пример готовой формы, демонстрирующей использование данного метода: MailForm.aspx.

Пример для языка «VisualBasic»:

<% @Page Language="VB" Debug="true"  %>
<% @Import Namespace="System.Net.Mail" %>
<% @Import Namespace="System.Net" %>
<%

    Dim smtpMssg AS new MailMessage ' объявление нового объекта типа "MailMessage"
    smtpMssg.From = New MailAddress ("admin@domain.tld", "Имя_отправителя") ' указание имени и адреса отправителя
    smtpMssg.To.Add ("user@tomail.tld") ' добавление адреса получателя
    smtpMssg.Subject = "Тема письма" ' указание темы письма
    smtpMssg.Body = "Текст письма" ' указание текста (тела) письма
    smtpMssg.BodyEncoding = System.Text.Encoding.UTF8 ' указание кодировки письма
    smtpMssg.IsBodyHtml = false  ' указание формата письма (true - HTML, false - не HTML)
    
    Dim SmtpMail As New SmtpClient("smtp.domain.tld", 25)' объявление нового объекта типа "SmtpClient" 
    SmtpMail.DeliveryMethod = SmtpDeliveryMethod.Network ' указание метода доставки письма
    SmtpMail.UseDefaultCredentials = False ' отключение использования реквизитов авторизации "по-умолчанию" 
    SmtpMail.EnableSsl = False ' отключает необходимость использования защищенного соединения с сервером
    SmtpMail.Credentials = new NetworkCredential("postmaster@domain.tld", "***password***") ' указание нужных реквизитов (имени пользователя и пароля) для авторизации на SMTP-сервере
    SmtpMail.Send(smtpMssg) ' отправка сообщения

%>

Так же, существует устаревший (и не рекомендуется к использованию) класс SmtpMail (используется пространство имен System.Web.Mail). Ниже приведен пример его использования для языка «VisualBasic»:

<% @Page Language="VB" Debug="true"  %>
<% @Import Namespace="System.Web" %>
<% @Import Namespace="System.Web.Mail" %>
<%

Dim smtpMssg = new MailMessage ' объявление нового объекта типа "MailMessage"

smtpMssg.From = "Имя_отправителя <admin@domain.tld>" ' указание имени и адреса отправителя
smtpMssg.To = "admin@domain.tld' указание адреса получателя
smtpMssg.BodyFormat = MailFormat.Text ' указание формата письма
smtpMssg.BodyEncoding = Encoding.UTF8 'указание кодировки письма
smtpMssg.Subject = "Тема письма" ' указание темы письма
smtpMssg.Body = "Текст письма" ' указание текста письма
smtpMssg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate",1) ' указание необходимости SMTP-авторизации на сервере
smtpMssg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "admin@domain.tld") ' имя пользователя для авторизации
smtpMssg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "***password***") ' пароль для авторизации
SmtpMail.SmtpServer = "smtp.domain.tld' указание адреса SMTP-сервера
SmtpMail.Send(smtpMssg) ' отправка сообщения

%>

Как отправлять письма, используя ASP?

С помощью Collaboration Data Objects.

Обратите внимание, что при использовании нашего smtp-сервера требуется авторизация, поэтому не забудьте добавить в скрипт соответствующие реквизиты доступа, например:

<%
  iConfig = Server.CreateObject("CDO.Configuration")
  Set iConfig = Server.CreateObject("CDO.Configuration")
  With iConfig.Fields
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.domain.tld"
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    .Item("http://schemas.microsoft.com/cdo/configuration/languagecode") = "ru"
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "postmaster@domain.tld"
    .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
    .Update
  End With

  Set cdoMessage = CreateObject("CDO.Message")

  With cdoMessage
      Set .Configuration = iConfig
      .From = "Test user <postmaster@domain.tld>"
      .To = "User <user@somedomain.com>"
      .Subject = "Hello, User"
      .TextBody = "I write this message from ASP script."
      .Send
  End With

Set cdoMessage = Nothing
Set iConfig = Nothing
%>

Некоторые CMS уже имеют встроенные средства для отправки корреспонденции или соответствующие модули, рассмотрим самые популярные из них.

Wordpress

Для данной CMS существует специальный модуль «WP Mail SMTP», пример его конфигурации описан на странице модуля.

Обратите внимание на иллюстрацию в примере, в условиях нашей почтовой системы требуется использовать 25-й порт и SSL-шифрование не требуется.

Joomla

В панели администрирования перейдите в раздел «Общие настройки», выберете вкладку «Сервер». В поле «Почта» требуется выбрать способ отправки как «SMTP-сервер», в полях «Адрес SMTP-сервера» и «SMTP-логин» и «SMTP-пароль» укажите соответствующие реквизиты почтовой системы, например: smtp.ваш_домен, ящик@ваш_домен и соответствующий пароль.

Подробнее вы можете прочитать в документации к данной CMS.

Drupal

Эта CMS так же имеет собственный модуль для работы с SMTP-сервером, основанный на базе PHPMailer. Загрузить данный модуль можно на его странице на сайте CMS Drupal, описание установки модуля доступно в архиве с ним.

NetCat

Данная CMS не имеет встроенных функций для работы с SMTP-сервером. Для отправки почты скриптами сайта мы можем предложить использовать наше решение, для его подключения необходимо выполнить следующие действия:

  • Скачать с нашего сайта архив с необходимыми файлами (send_auth_mail.php и mail.inc.php) и распаковать его на компьютере;
  • Отредактировать файл send_auth_mail.php из архива, указав в нём реквизиты подключения к нужному SMTP-серверу:

    • $mail_smtpServer = "smtp.domain.tld"; (адрес SMTP-сервера)
    • $mail_port = "25"; (порт для подключения)
    • $mail_username = "mail@domain.tld"; (имя пользователя для авторизации на SMTP-сервере)
    • $mail_password = "Password"; (пароль для авторизации на SMTP-сервере)
  • Создать резервную копию файла domain.tld/www/netcat/admin/mail.inc.php;
  • Загрузить файлы send_auth_mail.php и mail.inc.php на виртуальную площадку в директорию domain.tld/www/netcat/admin/

domain.tld следует заменить на имя вашего домена.

Предлагаемое решение работает со всеми модулями NetCat, которые используют стандартные функции данной CMS для отправки почты.