1

Тема: Розсилка повідомлень на e-mail <C#, MS SQL Server>

Доброго вечора!
Потрібно написати  модуль по надсиланню на електронну адресу клієнтів повідомлень.
клієнти і електронні адреси маю в базі.
цікавить питання.
1. якщо розсилка на велику кількість e-mails (500 - 1000) в день чи не буде проблем?
наприклад заблокують електронну адресу з якої йде розсилка чи добавлять в спам. Як тут правильно поступити.
(Подібне писав на PowerBuilder. правда там в день відправлялося 1-5 повідомлень)
2. які класи тут використати.

3. чи можливо є сервіс яким би можна було скористатися.
Дякую.
Прошу вибачення якщо питання сформульовано не коректно.

2

Re: Розсилка повідомлень на e-mail <C#, MS SQL Server>

vasyliv написав:

чи не буде проблем?

Якщо знайдуть - битимуть.

Подякували: leofun011

3

Re: Розсилка повідомлень на e-mail <C#, MS SQL Server>

Ну не думаю, що є такі безплатні сервіси. Це ж мрія спамера :)
так що ставте в своєму домені власний поштовий сервер і буде вам щастя, якщо звичайно ваші клієнти не почнуть скаржитися

4

Re: Розсилка повідомлень на e-mail <C#, MS SQL Server>

А по коду, ось приклад. Правда він видертий з проекту, тому для використання треба творчо підрихтувати напильником :)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Common.Services;
using System.Net.Mail;
using Common.AppLog;
using System.Net;

namespace FileSender
{
    public class EmailClient
    {
        EmailSettings m_settings;

        public EmailClient()
        {
            LoadSettings();
        }

        public bool SendSmtpEmail(string _email, string _subj, string _emailBody="", List<string> _attachedFiles=null, string _CCemail=null)
        {
            bool _sendOk = false;
            MailMessage _message = new MailMessage();
            try
            {
                SmtpClient _client = new SmtpClient(m_settings.SmtpServer, m_settings.ServerPort);
                _client.EnableSsl = m_settings.EnableSSL;
                _client.DeliveryMethod = SmtpDeliveryMethod.Network;
                _client.Credentials = new NetworkCredential(m_settings.Login, m_settings.Password);
                
                if (!String.IsNullOrEmpty(m_settings.EmailSender))
                    _message.From = new MailAddress(m_settings.EmailSender);

                FillMailAddresses(_message.To, _email);
                if (!String.IsNullOrEmpty(_CCemail))
                    FillMailAddresses(_message.CC, _CCemail);

                _message.Subject = _subj;

                _message.Body = _emailBody;
                if (!String.IsNullOrEmpty(m_settings.AutoMessageBody))
                    _message.Body += " \r\n"+m_settings.AutoMessageBody;

                if (_attachedFiles != null)
                    foreach (string _attFile in _attachedFiles)
                        _message.Attachments.Add(new Attachment(_attFile));

                _client.Send(_message);                

                _sendOk = true;
            }
            catch (Exception _ex)
            {
                SysLog.SaveToLog("Sending SMTP email <" + _email + ">\n Error: " + _ex.Message);
            }
            finally
            {
                foreach (Attachment _att in _message.Attachments)
                    _att.Dispose();
                _message.Attachments.Clear();
                _message.Dispose();
            }

            return _sendOk;
        }

        private void LoadSettings()
        {
            string _fileName = "EmailSettings.xml";
            XMLDataContext<EmailSettings> _ems = new XMLDataContext<EmailSettings>(_fileName);
            m_settings = _ems.GetObject();
            if (m_settings == null)
            {
                m_settings = new EmailSettings() { ServerPort = 25 };
                _ems.SaveObject(m_settings);
            }
        }

        private void FillMailAddresses(MailAddressCollection _AddrCollection, string _addresses)
        {
            char[] _separators = { ',', ';' };
            int _p;
            string _mail;
            _addresses = _addresses.Trim();
            do
            {
                _p = _addresses.IndexOfAny(_separators);
                _mail = _addresses.Substring(0, _p >= 0 ? _p : _addresses.Length);
                _addresses = _p >= 0 ? _addresses.Substring(_p + 1, _addresses.Length - (_p + 1)) : String.Empty;

                if (!String.IsNullOrEmpty(_mail))
                    _AddrCollection.Add(new MailAddress(_mail));
            }
            while (!String.IsNullOrEmpty(_addresses));
        }
   
    }

    public class EmailSettings
    {
        public string SmtpServer { get; set; }
        public int ServerPort { get; set; }

        public string Login { get; set; }
        public string Password { get; set; }

        public bool EnableSSL { get; set; }

        public string EmailSender { get; set; }

        public string AutoMessageBody { get; set; }
    }
}
Подякували: leofun011

5

Re: Розсилка повідомлень на e-mail <C#, MS SQL Server>

дякую

6

Re: Розсилка повідомлень на e-mail <C#, MS SQL Server>

Engineer дозвольте питання.
так що ставте в своєму домені власний поштовий сервер - який порадите?

7

Re: Розсилка повідомлень на e-mail <C#, MS SQL Server>

vasyliv написав:

Engineer дозвольте питання.
так що ставте в своєму домені власний поштовий сервер - який порадите?

Соррі, я програмер і про поштові сервери знаю тільки, що в них є адреса, порт та протокол :)

А ще згадав, колись, як я ще працював на роботі, то адмін там при встановленні поштового сервера щось там погоджував з провайдером і конфігурувував якусь взаємодією з поштовим сервером провайдера ну і по DNS вони там ще щось налаштовували.
Це я веду до того, що поштовий сервер так просто не встановиш і він запрацює. Я би шукав адміна, який в тому розбирається, ну або читав купу мануалів, якщо є багато часу.

8

Re: Розсилка повідомлень на e-mail <C#, MS SQL Server>

Схоже, що мова йде щоб ставити поштовий сервер на Windows, рекомендую https://www.hmailserver.com/
В минулому житті я ставив без проблем, дуже простий в налаштуванні, є базовий мінімум, працює якраз із MS SQL (хоча, здається, якась там полегшена версія, але можна стравити йому й "ентерпрайз")

Стосовно сервісів, то є такі безкоштовні, які до 100 тис./місяць обіцяють обслуговувати: https://www.sparkpost.com/pricing

Ось ще один варіант https://www.mailjet.com/pricing_v3 - обіцяють до 6 тис./місяць

Подякували: leofun011

9

Re: Розсилка повідомлень на e-mail <C#, MS SQL Server>

Дякую.