Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблема с отправкой почты

3.6K
02 января 2008 года
dimas09
92 / / 17.06.2007
Здравствуйте
Вот пытаюсь написать класс для отправки почты на C#
Код:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;

namespace ConsoleApplication1
{
    public class SmtpException : System.Exception
    {
        private string message;
        public SmtpException(string str)
        {
            message = str;
        }
        public string What()
        {
            return message;
        }
    };
    public class Smtp : System.Net.Sockets.TcpClient
    {
        public string from = null;
        public ArrayList to;
        public ArrayList cc;
        public ArrayList bcc;
        public string subject = null;
        public string bodyText = null;
        public string bodyHtml = null;
        public string server = null;
        public Smtp()
        {
            bodyHtml= "";
            to = new ArrayList();
            cc = new ArrayList();
            bcc = new ArrayList();
        }
        public void Send()
{
string message;
string response;
Connect(server, 25);
response = Response();
if (response.Substring(0, 3) != "220")
{
throw new SmtpException(response);
};
message = "EHLO " + server + "\r\n";
Write(message);
response = Response();
if (response.Substring(0, 3) != "250")
{
throw new SmtpException(response);
}

message = "AUTH LOGIN\r\n";
Write(message);
message = "*******";
Write_base64(message);
response = Response();
if (response.Substring(0, 3) != "334")
{
    throw new SmtpException(response);
}
message = "********";
Write_base64(message);
response = Response(); response = Response();
if (response.Substring(0, 3) != "235")
{
    throw new SmtpException(response);
}
message = "MAIL FROM:<" + from + ">\r\n";
Write(message);
response = Response();
if (response.Substring(0, 3) != "250")
{
throw new SmtpException(response);
}

foreach ( string address in to )
{
try
{
    Console.WriteLine("1");
message = "RCPT TO:<" + address + ">\r\n";
Write(message);
response = Response();
if (response.Substring(0, 3) != "250")
{
throw new SmtpException(response);
}
}
catch( SmtpException e)
{
System.Console.WriteLine("{0}", e.What());
}
}

foreach ( string address in cc )
{
try
{
message = "RCPT TO:<" + address + ">\r\n";
Write(message);
response = Response();
if (response.Substring(0, 3) != "250")
{
throw new SmtpException(response);
}
}
catch( SmtpException e)
{
System.Console.WriteLine("{0}", e.What());
}
}
foreach ( string address in bcc )
{
try
{
message = "RCPT TO:<" + address + ">\r\n";
Write(message);
response = Response();
if (response.Substring(0, 3) != "250")
{
throw new SmtpException(response);
}
}
catch( SmtpException e)
{
System.Console.WriteLine("{0}", e.What());
}
}
message = "DATA\r\n";
Write(message);
response = Response();
if (response.Substring(0, 3) != "354")
{
throw new SmtpException(response);
}
message = ""; message += "From: " + from + "\r\n";
foreach (string address in to)
{
    message += "To: " + address + "\r\n";
}
foreach (string address in cc)
{
    message += "Cc: " + address + "\r\n";
}

message += "Subject: " + subject + "\r\n";

if (bodyHtml.Length > 0)
{
    message += "MIME-Version: 1.0\r\n"
    + "Content-Type: text/html;\r\n"
    + " charset=\"iso-8859-1\"\r\n";
    message += "\r\n" + bodyHtml;
}
else
{
    message += "\r\n" + bodyText;
};
message += "\r\n.\r\n";
Console.WriteLine(message);
Write(message);
response = Response();
if (response.Substring(0, 3) != "250")
{
    throw new SmtpException(response);
}
message = "QUIT\r\n";
Write(message);
response = Response();
if (response.IndexOf("221") == -1)
{
    throw new SmtpException(response);
}
}
        public void Write(string message)
        {
            System.Text.ASCIIEncoding en = new System.Text.ASCIIEncoding();
            byte[] WriteBuffer = new byte[1024];
            WriteBuffer = en.GetBytes(message);
            NetworkStream stream = GetStream();
            stream.Write(WriteBuffer, 0, WriteBuffer.Length);
        }
        public void Write_base64(string message)
        {
            System.Text.ASCIIEncoding en = new System.Text.ASCIIEncoding();
            byte[] WriteBuffer = new byte[1024];
            WriteBuffer = en.GetBytes(System.Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(message))+"\r\n");
            NetworkStream stream = GetStream();
            stream.Write(WriteBuffer, 0, WriteBuffer.Length);
        }
        public string Response()
        {
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
            byte[] serverbuff = new Byte[1024];
            NetworkStream stream = GetStream();
            int count = stream.Read(serverbuff, 0, 1024);
            if (count == 0)
            {
                return "";
            }
            return enc.GetString(serverbuff, 0, count);
        }
    };    
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Smtp smtpe = new Smtp();
                smtpe.server = "mail.domain.com";
                smtpe.from = "otkogoto@domain.com";
                smtpe.subject = "Hello World";
                smtpe.bodyText = "<HTML><BODY>Hello World</BODY></HTML>";
                smtpe.to.Add("komuto@domain.net");
                smtpe.Send();
                System.Console.WriteLine("OK");
            }
            catch (SmtpException e)
            {
                System.Console.WriteLine("{0}", e.What());
            }
            Console.ReadKey();
        }
    }
}

Авторизация на сервере проходит, да и ошибок не получаю никаких, но письма не получаю. Подскажите пожайлуста.


P.S. Да, знаю есть smtp класс, но условее создание самостоятельно.
370
02 января 2008 года
koval
443 / / 29.08.2005
Зачем столько сложностей? В .NET есть пространство имен System.Net.Mail. Там есть класс SmtpClient, вот с ним и работай.
3.6K
02 января 2008 года
dimas09
92 / / 17.06.2007
Да, я знаю про этот класс, но я делаю курсовую работу и у меня условие не использовать стандартные классы для работы с почтой
2
02 января 2008 года
squirL
5.6K / / 13.08.2003
http://www.ietf.org/rfc/rfc2821.txt
изучи и посмотри, насколько твоя программа соответствует. также - можно воспроизвести все, что она делает через telnet и посмотреть ответы сервера.
3.6K
02 января 2008 года
dimas09
92 / / 17.06.2007
Да, класс заработал.
Но вот на бесплатных серверах почты требуют аутентификацию "POP прежде SMTP", не подскажете как реализовать?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог