Отправка электронной почты через SMTP-сервер Gmail с C #


243

По какой-то причине ни принятый ответ, ни какие-либо другие не работают для меня на « Отправка электронной почты в .NET через Gmail ». Почему они не работают?

ОБНОВЛЕНИЕ: я попробовал все ответы (принятые и другие) в другом вопросе, но ни один из них не работает.

Я просто хотел бы знать, работает ли это для кого-то еще, иначе Google, возможно, изменил что-то (что случилось прежде).

Когда я пытаюсь использовать фрагмент кода SmtpDeliveryMethod.Network, я быстро получаю SmtpException при отправке (сообщение). Сообщение

SMTP-сервер требует безопасного соединения, или клиент не был аутентифицирован.

Ответ сервера был:

5.5.1 Требуется аутентификация. Узнайте больше на "<- серьезно, это заканчивается там.

ОБНОВИТЬ:

Это вопрос, который я задавал давным-давно, и принятым ответом является код, который я использовал много раз в разных проектах.

Я взял некоторые идеи из этого поста и других проектов EmailSender, чтобы создать проект EmailSender в Codeplex . Он предназначен для тестирования и поддерживает мои любимые SMTP-сервисы, такие как GoDaddy и Gmail.


Я пытался сделать это, используя похожие методы на другом языке. Столкнулся с тем же типом вещей: старые документированные методы, которые работали раньше, у меня не работали. Таким образом, вы задаетесь вопросом, изменил ли Google что-то, или вы сделали что-то не так.
AaronLS,

3
@aaronls единственное недавнее изменение, похоже, связано с портом 465. Я попробовал это, ища решение (я только работал над тем же самым), и время ожидания порта 465 все время. Если это ваш случай, попробуйте использовать порт 587.
eglasius

2
Эта проблема связана с «проверкой слова» (капча). Если вы войдете через веб-интерфейс вручную и введете код проверки, ваш SMTP начнет работать.
Роберт Коритник

4
FWIW, у меня работает. вам нужно использовать 587 и .EnableSSL true. c # 4 / .NET 4 в настоящее время не поддерживает альтернативный 465 / SSL. Gmail требует настройки других почтовых клиентов .
gerryLowry

1
Следуйте ответу @eglasius и убедитесь, что вы включили параметр «Разрешить менее безопасные приложения» в Gmail, чтобы разрешить gmail аутентифицировать вашу учетную запись.
user2713706

Ответы:


291

CVertex, обязательно просмотрите свой код и, если это ничего не раскрывает, опубликуйте его. Я просто включил это на тестовом сайте ASP.NET, над которым я работал, и это работает.

На самом деле, в какой-то момент у меня возникла проблема с моим кодом. Я не заметил его, пока не нашел более простую версию консольной программы и не увидел, что она работает (никаких изменений на стороне Gmail, как вы беспокоитесь). Приведенный ниже код работает так же, как примеры, на которые вы ссылались:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("myusername@gmail.com", "mypwd"),
                EnableSsl = true
            };
            client.Send("myusername@gmail.com", "myusername@gmail.com", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

Я также получил его, используя комбинацию web.config, http://msdn.microsoft.com/en-us/library/w355a94k.aspx и кода (потому что EnableSslв файле конфигурации нет совпадений :().


1
У меня блестяще работало в приложении C # winforms. Спасибо, Фредди.
Андрей

13
Просто помните, что такой код эффективно передает ваши учетные данные gmail в виде простого текста пользователю ...
Крис Марисик,

3
на самом деле есть соответствующий параметр для enableSsl в web.config, см. ответ ниже
Wiebe Tijsma

4
@Zidad, который был добавлен в 4.0.
eglasius

21
Вам также может потребоваться включить доступ к «менее защищенным приложениям» на странице настроек Gmail: google.com/settings/security/lesssecureapps . Это необходимо, если вы получаете исключение "` Ответ сервера: 5.5.1 Требуется аутентификация.
Равендаркский,

74

СЛЕДУЮЩАЯ ПОЧТИ ПОЧТИ БУДЕТ ОТВЕТИТЬ НА ВАШ ВОПРОС, ЕСЛИ ВСЕ ПРОЧЕЕ НЕ ПОЛУЧИЛОСЬ :

Я получил точно такую ​​же ошибку, оказалось, что новый алгоритм измерения надежности пароля Google изменил, посчитав мой текущий пароль слишком слабым, и не сказал мне ничего об этом (даже сообщение или предупреждение) ... Как я узнал об этом ? Ну, я решил изменить свой пароль, чтобы посмотреть, поможет ли он (пробовал все остальное безрезультатно), и когда я сменил пароль, это сработало!

Затем, для эксперимента, я попытался изменить свой пароль обратно на свой предыдущий пароль, чтобы посмотреть, что произойдет, и Gmail на самом деле не позволил мне сделать это, сославшись на причину: «Извините, мы не можем позволить вам сохранить это изменение в качестве выбранного пароль слишком слаб "и не позволил бы мне вернуться к моему старому паролю. Из этого я понял, что это ошибка, потому что либо а) вам нужно менять пароль один раз каждые x месяцев, либо б). как я уже говорил, их алгоритмы надежности паролей изменились, и поэтому слабый пароль, который я имел, не был принят, хотя они ничего не говорили об этом, когда пытались войти НИКОГДА! Это (номер 2) наиболее вероятный сценарий, поскольку моему слабому паролю было около 4 месяцев, и это позволило мне использовать его в Gmail.

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

Надеюсь, это поможет!


2
Спасибо, как вы говорите, смените пароль, чтобы он был надежным и все работало нормально.
Гэвин

1
Это была именно моя проблема - все другие предложения были о конфигурации, но моя конфигурация была правильной с самого начала, но я продолжал получать ошибку. Смена пароля имела огромное значение,
Андре Вермёлен

Спасибо, наконец-то я смог разобраться с этой проблемой, мой случай был на самом деле еще более сложным, я смог отправлять электронные письма с моей машины разработчика (которая находится в Грузии, на Кавказе), но электронные письма не работали с производственных серверов (Великобритания) После Смена пароля на сложный - теперь все работает :)
Кирилл Чилингарашвили

Спасибо. У меня была та же проблема с моей учетной записью Gmail, у которой не было надежности пароля. Я обновил его с сильным, и мои коды работают.
Thomas.Benz

Спасибо, да, наконец, это просто изменить пароль на надежный.
Миша Бескин

68

В дополнение к другим шагам по устранению неполадок, приведенным выше, я также хотел бы добавить, что если вы включили двухфакторную аутентификацию (также называемую двухэтапной проверкой ) в своей учетной записи GMail, вы должны сгенерировать пароль для конкретного приложения и использовать его заново. сгенерированный пароль для аутентификации через SMTP .

Чтобы создать его, перейдите на страницу https://www.google.com/settings/ и выберите Авторизация приложений и сайтов для генерации пароля.


1
У меня не была включена двухэтапная проверка, и не имело значения, насколько надежно я сделал пароль, это был единственный способ решить мою проблему. Я мог использовать другие учетные записи Gmail без двухэтапных и более слабых паролей без каких-либо проблем ... чтобы использовать ту учетную запись, которую я действительно хотел использовать, мне пришлось включить двухэтапный и использовать специальный пароль приложения.
Ян Робертсон

Именно то, что я делаю, но все еще та же ошибка: - / Он действует так, будто мой пароль недостаточно силен, но я использую пароль приложения, который мне дал Gmail !!!
Джерри Додж

55
Turn On Access For Less Secure Apps and it will work for all no need to change password.

Ссылка на настройки Gmail

введите описание изображения здесь


1
Это сработало для меня. Более того, когда я попытался отправить электронное письмо вышеуказанным способом, я получил письмо от Google, где они прямо сказали, что заблокировали эту попытку из менее безопасного приложения, и упомянули этот способ ее исправить
Demarsch

1
Это самый важный ключ в головоломке, так как у меня были настроены все остальные настройки, и казалось, что они не работают. Как только у меня была эта настройка, она работала как шарм.
Потерян

1
Это сработало для меня. Пароль приложения + SSL + NetworkCredentials. (VB.NET)
CrazyIvan1974

30

У меня были некоторые проблемы с отправкой электронных писем с моей учетной записи Gmail, что было связано с несколькими из вышеупомянутых ситуаций. Вот краткое изложение того, как я получил это, и в то же время сохраняя его гибким:

  • Прежде всего настройте учетную запись GMail:
    • Включите IMAP и подтвердите правильное максимальное количество сообщений (вы можете сделать это здесь)
    • Убедитесь, что ваш пароль не менее 7 символов и является надежным (согласно Google)
    • Убедитесь, что вам не нужно вводить код с картинки. Вы можете сделать это, отправив тестовое электронное письмо из браузера.
  • Внесите изменения в web.config (или app.config, я еще не пробовал, но я предполагаю, что так же легко заставить его работать в приложении для Windows):
<configuration>
    <appSettings>
        <add key="EnableSSLOnMail" value="True"/>   
    </appSettings>

    <!-- other settings --> 

    ...

    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="yourusername@gmail.com" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="yourusername@gmail.com"
                    />
                <!-- When using .Net 4.0 (or later) add attribute: enableSsl="true" and you're all set-->
            </smtp>
        </mailSettings>
    </system.net>
</configuration>
Add a Class to your project:

Imports System.Net.Mail

Public Class SSLMail

    Public Shared Sub SendMail(ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)

        GetSmtpClient.Send(e.Message)

        'Since the message is sent here, set cancel=true so the original SmtpClient will not try to send the message too:
        e.Cancel = True

    End Sub

    Public Shared Sub SendMail(ByVal Msg As MailMessage)
        GetSmtpClient.Send(Msg)
    End Sub

    Public Shared Function GetSmtpClient() As SmtpClient

        Dim smtp As New Net.Mail.SmtpClient
        'Read EnableSSL setting from web.config
        smtp.EnableSsl = CBool(ConfigurationManager.AppSettings("EnableSSLOnMail"))
        Return smtp
    End Function

End Class

И теперь, когда вы хотите отправить электронное письмо, все, что вам нужно сделать, это позвонить SSLMail.SendMail:

например, на странице с элементом управления PasswordRecovery:

Partial Class RecoverPassword
Inherits System.Web.UI.Page

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles RecoverPwd.SendingMail
    e.Message.Bcc.Add("webmaster@example.com")
    SSLMail.SendMail(e)
End Sub

End Class

Или в любом месте вашего кода вы можете позвонить:

SSLMail.SendMail(New system.Net.Mail.MailMessage("from@from.com","to@to.com", "Subject", "Body"})

Надеюсь, это поможет любому, кто сталкивается с этим постом! (Я использовал VB.NET, но я думаю, что легко преобразовать его в любой язык .NET.)


+1 "enableSsl =" true "- это работает для устаревшего приложения, которое специально не устанавливает свойство Smtp.enableSsl без перекомпиляции сборок. Отличный совет!
Metro Smurf

и не забывайте брандмауэр. Порт 587 не является обычным портом для открытия.
Гай Лоу

13
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("myusername@gmail.com", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("myusername@gmail.com","yourusername@gmail.com","test","testbody")

Если вы получаете сообщение об ошибке типа «SMTP-сервер требует безопасного соединения или клиент не прошел проверку подлинности. Ответ сервера был: 5.5.1 Требуется проверка подлинности. Узнайте больше на», как я получал до этого, убедитесь, что строка SMTPClientObj.UseDefaultCredentials = Falseвключена и эта строка должен доSMTPClientObj.Credentials .

Я попытался переключить эти две строки противоположным образом, и вернулась ошибка 5.5.1 Authentication Required .


Это именно то, что случилось со мной. Кто думал, что порядок установки свойства будет исправлять / разрушать вещи!
Билл Ян

Это было проблемой и для меня, я сменил порядок в соответствии с предложением, и он отлично работает - головные боли, тьфу!
eth0

13

Ох ... Это удивительно ... Сначала я не мог отправить электронное письмо по каким-либо причинам. Но после того, как я изменил последовательность этих двух строк, как показано ниже, она работает отлично.

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");

Надеюсь, это поможет! :)


1
Да, порядок имеет значение. Особенно, когда вы устанавливаете свойство Credentials и не хотите использовать учетные данные по умолчанию.
Стефан Цветановский,

1
Согласно документации, для использования учетных данных необходимо установить UseDefaultCredentials = false. Однако эти два параметра кажутся тайно взаимосвязанными. Если вы установите для UseDefaultCredentials значение true или false, это будет иметь побочный эффект от установки учетных данных на ноль. И кажется, что установка учетных данных может побочным эффектом установить UseDefaultCredentials = false. Хотя не указано, что это может быть ошибкой или просто неудачником.
Аарон

10

Проблема не в технической возможности отправки через gmail. Это работает для большинства ситуаций. Если вы не можете получить машину для отправки, это обычно происходит из-за того, что машина не была аутентифицирована с человеком на пульте управления хотя бы один раз.

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

То, что я сделал в моей нынешней системе, это отправка с задержкой в ​​1,5 секунды между каждым сообщением. Затем, если я получу какие-либо ошибки, остановитесь на 5 минут, а затем начните снова. Обычно это работает и позволяет вам отправлять аккаунты до предела (в последний раз я проверял, что это было 2000 для первичных входов клиентов в день).


1
Это была именно моя проблема! Когда я развернулся в Production, у меня возникла проблема, и после того, как я вошел в Gmail на самом сервере, он снова начал работать.
ThisGuy


9

У меня была та же проблема, но оказалось, что моя антивирусная защита блокировала исходящую «спам» электронную почту. Отключение позволило мне использовать порт 587 для отправки электронной почты SMTP через GMail


Я отключил Защитник Windows, и он тоже начал работать.
MorioBoncz

9

Если для вас здесь ничего не работает, вам может потребоваться разрешить доступ к вашей учетной записи Gmail из сторонних приложений. Это была моя проблема. Чтобы разрешить доступ, сделайте следующее:

  1. Войдите в свой аккаунт Gmail.
  2. Посетите эту страницу https://accounts.google.com/DisplayUnlockCaptcha и нажмите кнопку, чтобы разрешить доступ.
  3. Посетите эту страницу https://www.google.com/settings/security/lesssecureapps и включите доступ для менее безопасных приложений.

Это сработало для меня, надеюсь, что это работает для кого-то еще!


8

Я не уверен, какая версия .NET требуется для этого, потому что eglasius упомянул, что нет соответствующей enableSslнастройки (я использую .NET 4.0, но я подозреваю, что она работает в .NET 2.0 или более поздней версии), но эта конфигурация оправдана я (и не требует использования какой-либо программной конфигурации):

<system.net>
  <mailSettings>
    <smtp from="myusername@gmail.com" deliveryMethod="Network">
      <network defaultCredentials="false" enableSsl="true" host="smtp.gmail.com" port="587" password="password" userName="myusername@gmail.com"/>
    </smtp>
  </mailSettings>
</system.net>

Возможно, вам придется сначала включить POP или IMAP в своей учетной записи Gmail: https://mail.google.com/mail/?shva=1#settings/fwdandpop

Я рекомендую сначала попробовать это с обычным почтовым клиентом ...


2
это новинка для 4.0, сравните версии на -> msdn.microsoft.com/en-us/library/ms164242(v=VS.90).aspx
eglasius

Привет, Эгласиус ... Хорошо, спасибо за это! Странно, они имеют только программный подход в до-4.0. Я думаю, мы все время от времени забываем обо всем :)
Wiebe Tijsma

6

@Andres Pompiglio: Да, верно, вы должны изменить свой пароль хотя бы один раз ... эти коды работают просто отлично:

//Satrt Send Email Function
public string SendMail(string toList, string from, string ccList,
    string subject, string body)
{

    MailMessage message = new MailMessage();
    SmtpClient smtpClient = new SmtpClient();
    string msg = string.Empty;
    try
    {
        MailAddress fromAddress = new MailAddress(from);
        message.From = fromAddress;
        message.To.Add(toList);
        if (ccList != null && ccList != string.Empty)
            message.CC.Add(ccList);
        message.Subject = subject;
        message.IsBodyHtml = true;
        message.Body = body;
        // We use gmail as our smtp client
        smtpClient.Host = "smtp.gmail.com";   
        smtpClient.Port = 587;
        smtpClient.EnableSsl = true;
        smtpClient.UseDefaultCredentials = true;
        smtpClient.Credentials = new System.Net.NetworkCredential(
            "Your Gmail User Name", "Your Gmail Password");

        smtpClient.Send(message);
        msg = "Successful<BR>";
    }
    catch (Exception ex)
    {
        msg = ex.Message;
    }
    return msg;
}
//End Send Email Function

И вы можете сделать вызов функции, используя:

Response.Write(SendMail(recipient Address, "UserName@gmail.com", "ccList if any", "subject", "body"))

SMTP-сервер требует безопасного соединения, или клиент не был аутентифицирован. Ответ сервера: 5.5.1 Требуется аутентификация. Узнайте больше на
Savas Adar

6

Я использовал корпоративное VPN-соединение. Это была причина, почему я не мог отправить электронное письмо из своего заявления. Это работает, если я отключаюсь от VPN.


5

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


5

Я также пытался многие решения, но внести некоторые изменения, это будет работать

host = smtp.gmail.com
port = 587
username = email@gmail.com
password = password
enabledssl = true

с параметрами smtpclient выше работают в gmail


5

Я получил ту же ошибку, и ни одно из вышеперечисленных решений не помогло.

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

Я открыл браузер на удаленном сервере и зашел в gmail оттуда. Он задал секретный вопрос, чтобы убедиться, что это я, так как это новое место. После проверки безопасности я смог пройти проверку подлинности с помощью кода.



4

Я столкнулся с этой же ошибкой ( «SMTP-серверу требуется защищенное соединение, или клиент не был аутентифицирован. Ответ сервера был: 5.5.1 Требуется аутентификация. Подробнее на» ) и обнаружил, что я использовал неправильный пароль. Я установил учетные данные, и они были отправлены правильно.

Я знаю, что уже поздно, но, возможно, это поможет кому-то еще.


4

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


4

Еще одно возможное решение для вас. У меня были похожие проблемы с подключением к Gmail через IMAP. Попробовав все решения, с которыми я столкнулся, о которых вы и здесь и в других местах узнаете в SO (например, включите IMAP, включите менее безопасный доступ к своей почте, используя https://accounts.google.com/b/0/displayunlockcaptcha и и так далее), я фактически создал новую учетную запись Gmail еще раз.

В моем первоначальном тесте, первая созданная мной учетная запись Gmail, я подключился к моей основной учетной записи Gmail. Это приводило к ошибочному поведению, когда Google ссылался на неправильный аккаунт. Например, запуск https://accounts.google.com/b/0/displayunlockcaptcha открыл мой основной аккаунт, а не тот, который я создал для этой цели.

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

Я еще не подтвердил это (т.е. воспроизвел), но он, очевидно, сделал это для меня ... надеюсь, это поможет.


4
  1. Сначала проверьте настройки учетной записи Gmail и включите «Доступ к менее защищенным приложениям». введите описание изображения здесь

Мы настоятельно рекомендуем вам использовать безопасное приложение, такое как Gmail, для доступа к своей учетной записи. Все приложения, созданные Google, соответствуют этим стандартам безопасности. Использование менее защищенного приложения, с другой стороны, может сделать вашу учетную запись уязвимой. Выучить больше.

  1. Устанавливать

    smtp.UseDefaultCredentials = false;

    перед

    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);

4

Есть одна или несколько причин для этой ошибки.

  • Войдите в свой Gmail (или любой другой, если) в вашей локальной системе.

  • Также проверьте менее безопасное приложение и установите для него значение «Включить», вот ссылка для GMAIL. https://www.google.com/settings/security/lesssecureapps

  • проверьте наличие EnableSsl в своем коде электронной почты, а также установите для него значение true.

    smtp.EnableSsl = true;
  • Также проверьте, какой порт вы используете в настоящее время. 25 - Глобальный, но вы можете проверить это и для других, например 587. проверьте здесь. Все ли SMTP-коммуникации происходят за 25?

  • ЕСЛИ ВЫ УДАЛЕНЫ : проверьте ответ Влада Тамаса выше.


Что если я не хочу включать менее безопасные настройки приложения, как другие почтовые клиенты делают это, почему я не могу сделать то же самое с c #?
user734028

3

Вы также можете подключиться через порт 465, но из-за некоторых ограничений пространства имен System.Net.Mail вам, возможно, придется изменить свой код. Это связано с тем, что пространство имен не позволяет создавать неявные SSL-соединения. Это обсуждается на http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx , и я предоставили пример использования CDO (Collaborative Data Object) в другом обсуждении ( SMTP GMail через ошибки C # .Net на всех портах ).


3

Я решил эту проблему. По-видимому, это сообщение используется в нескольких типах ошибок. Моя проблема заключалась в том, что я набрал максимум 500 отправленных писем.

Войдите в учетную запись и вручную попробуйте отправить письмо. Если лимит был достигнут, он сообщит вам


2

Если у вас есть двухэтапная проверка в учетной записи Gmail, вам нужно будет сгенерировать пароль для приложения. https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=en&visit_id=636903322072234863-1319515789&rd=1 Выберите Как создать пароль приложения и следуйте приведенным инструкциям. Скопируйте и вставьте сгенерированный пароль приложения куда-нибудь, так как вы не сможете восстановить его после нажатия кнопки Готово.


2
smtp.Host = "smtp.gmail.com"; //host name
smtp.Port = 587; //port number
smtp.EnableSsl = true; //whether your smtp server requires SSL
smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
smtp.Timeout = 20000;

1

Измените свой пароль Gmail и попробуйте еще раз, после этого он должен работать.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.