Отправка сообщения на почту C#

200
11 сентября 2018, 09:40

Нашёл образец кода на форуме, сделал всё по шаблону, вроде и отправляет сообщения, а как только другу отправил приложение потестить так приходят сообщения будь-то я их себе отправляю. Как сделать отправку от введенного адреса:

private void button1_Click_1(object sender, EventArgs e)
    {
        string fromUser = richTextBox1.Text;
        int mark = trackBar1.Value;
        string uemail = textBox1.Text;
        try
        {
            MailAddress from = new MailAddress (uemail);
            MailAddress to = new MailAddress ("Мой маил");
            MailMessage m = new MailMessage (from,to);
            m.Subject = "Твое приложение оценили!";
            m.IsBodyHtml = false;
            m.Body = "Your mark is " + mark + "\n" + fromUser;
            SmtpClient smtp = new SmtpClient ("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential ("Мой маил", "пароль приложения"),
                EnableSsl = true
            };
            smtp.Send (m);
            MessageBox.Show ("Сообщение успешно отправлено. Спасибо!");
            Close ( );
        }
        catch (FormatException)
        {
            MessageBox.Show ("Неверный формат электронной почты. Почта должна иметь окончания - @gmail/yandex/mail/bk/list и другие");
            textBox1.Text = "";
        }
        catch (ArgumentException)
        {
            MessageBox.Show ("Строка с адресом не должна быть пуста");
        }
        catch (Exception ex)
        {
            MessageBox.Show (ex.HelpLink);
        }
    }

Answer 1

Ваш код необходимо переписать следующим образом:

string fromUser = richTextBox1.Text;    // Получим комментарий пользователя
int mark = trackBar1.Value;             // Получим оценку приложения
string uemail = textBox1.Text;          // Получим Email пользователя
string upassword = *.Text;              // Нам понадобится и пароль от Email пользователя
                                        // Как Вы понимаете, рассылать что-то от имени
                                        // чужого аккаунта просто так не получится,
                                        // Так что без авторизации никуда!
try
{
    MailAddress from = new MailAddress(uemail);
    MailAddress to = new MailAddress(myEmail);
    MailMessage message = new MailMessage(from, to) // Формируем сообщение с нужными заголовками
                                                    // Заголовок "от кого" ныне часто игнорируется,
                                                    // и на его место ставится реальный адрес отправителя,
                                                    // так что подписаться миллионером дядей Петей не получится
    {
        Subject = "Твое приложение оценили!",
        IsBodyHtml = false,
        Body = $"Your mark is {mark}{Environment.NewLine}{fromUser}"
    }; 
    SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587)
    {
        Credentials = new NetworkCredential(uemail, upassword),
        EnableSsl = true
    };
    smtp.Send(message);                             // Отправляем наше письмо
    MessageBox.Show("Сообщение успешно отправлено. Спасибо!");
    Close();
}
catch (FormatException)
{
    MessageBox.Show("Неверный формат электронной почты. Почта должна иметь окончания - @gmail/yandex/mail/bk/list и другие");
    textBox1.Clear();
}
catch (ArgumentException)
{
    MessageBox.Show("Строка с адресом не должна быть пуста");
}
catch (Exception ex)
{
    MessageBox.Show(ex.HelpLink);
}

Почему так:

Проблема в том, что в Вашем коде Вы проводили авторизацию на SMTP-сервере через свой аккаунт!
Тем самым, сформировав письмо, где Вы указали:

Кому (to) = Мне
От кого (from) = От Пользователя

Вы получили следующий результат: SMTP-клиент, переправляя заданное сообщение, учитывает только заголовок, указывающий, кому нужно отправить письмо, полностью игнорируя заголовок от кого, так как вместо него используется реальный адрес отправителя (то есть опять же Ваш email)

Что делать:

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

Да и стоит учесть, что не всякий пользователь будет доверять какой-то программе данные от своей учетной записи. Кто же знает, вдруг Вы потом будете использовать их в своих корыстных целях? Так что я считаю, что необходимо полностью поменять подход к данной задаче

Если Ваша программа использует какую-либо удаленную базу знаний, то почему не отправлять запрос сразу к ней? Это было бы самым простым решением. В противном случае Вам придется дорабатывать свой код для аутентификации пользователей от ЯндексПочты до самого iCloud Mail, что является достаточно объемной задачей


UPD:
Я тут подумал, если у Вас нет удаленной БД, и Вам хотелось бы получать именно Email-письма, то чем плох вариант отправки писем самому себе? А в заголовке или в теле письма Вы бы уже могли указать, от кого именно получено данное письмо. Вариант, конечно, кривой (к примеру, полностью отсутствует валидация введенного пользователем почтового адреса. Валидность-то можно проверить с помощью regex, а вот правда ли данная почта принадлежит пользователю...), однако в рамках Вашей задачи, возможно, Вам этого и хватит)

Надеюсь, мой ответ хоть немного прояснил Вашу проблему. Желаю Вам удачно ее разрешить)

READ ALSO
C#: Запуск Tasks в цикле [дубликат]

C#: Запуск Tasks в цикле [дубликат]

На данный вопрос уже ответили:

217
Чем плох перехват всех исключений разом?

Чем плох перехват всех исключений разом?

Является ли антипаттерном перехват всех исключений разом?

184
Добавление данных в БД Entity Framework

Добавление данных в БД Entity Framework

Проблема с добавление данных в БД с ипользованием Entity Framework, никак не могу понять причину, почему после добавления в БД записи с неуникальным...

214
Лишний Insert уже существующего объекта в БД (Postgresql)

Лишний Insert уже существующего объекта в БД (Postgresql)

Есть приложение WPF (паттерн MVVM) с двумя окнами (Авторизация и главное окно

171