Сведения о вопросе

SOON

04:27, 16th August, 2020

Теги

validation   email    

Email SMTP валидатор

Просмотров: 402   Ответов: 7

Мне нужно отправить сотни информационных бюллетеней, но сначала я хотел бы проверить, существует ли email на сервере. Это называется SMTP валидация, по крайней мере, я так думаю, основываясь на моих исследованиях в Интернете.

Есть несколько библиотек, которые могут это сделать, а также страница с открытым исходным кодом в ASP Classic (http://www.coveryourasp.com/ValidateEmail.asp#Result3), но мне трудно читать ASP Classic, и кажется, что он использует какую-то стороннюю библиотеку...

Есть ли какой-то код для проверки SMTP в C#, и / или общее объяснение того, как это работает?



  Сведения об ответе

SILA

05:44, 17th August, 2020

Имейте в виду, что у большинства MTAs (Mail Transfer Agent) команда VRFY будет отключена по причинам защиты от спама, они, вероятно, даже заблокируют вас, если вы попробуете несколько RCPT подряд (см. http://www.spamresource.com/2007/01/whatever-happened-to-vrfy.html ). Так что даже если вы найдете библиотеку, чтобы сделать эту проверку, она не будет стоить много. Измаил прав, единственный способ действительно выяснить это-послать email и посмотреть, отскочит ли он или нет.

@Hrvoje: Да, я предлагаю вам следить за отклоненными письмами. BUT: не все отскочившие письма должны автоматически попадать в ваш список "не существует", вы также должны различать временные (например, полный почтовый ящик) и постоянные ошибки.


  Сведения об ответе

darknet

20:57, 27th August, 2020

SMTP-это текстовый протокол, переносимый через TCP/IP.

Ваша программа проверки должна открыть соединение TCP/IP с портом 25 сервера (SMTP), написать несколько строк и прочитать ответ. Проверка выполняется (но не всегда) в строках "RCTP TO" и "VFRY".

SMTP RFC описывает, как это работает (см. Green@Beta.ARPA ниже, S-строки, отправленные клиентом, R-строки, полученные от сервера):

Example of the SMTP Procedure

         This SMTP example shows mail sent by Smith at host Alpha.ARPA,
         to Jones, Green, and Brown at host Beta.ARPA.  Here we assume
         that host Alpha contacts host Beta directly.

            S: MAIL FROM:
            R: 250 OK

            S: RCPT TO:
            R: 250 OK

            S: RCPT TO:
            R: 550 No such user here


  Сведения об ответе

PIRLO

13:30, 22nd August, 2020

Хотя это правда, что многие домены будут возвращать ложные срабатывания из-за злоупотребления, все же есть некоторые отличные компоненты, которые будут выполнять несколько уровней проверки, помимо проверки SMTP. Например, стоит сначала проверить, существует ли хотя бы домен. Я нахожусь в процессе составления своего собственного списка ресурсов, связанных с этим вопросом, который вы можете отслеживать здесь:

http://delicious.com/dworthley/email.validation

Для тех, кто, возможно, захочет добавить в этот список, я также включу то, что у меня сейчас есть здесь:

Для пуленепробиваемой формы и отличного пользовательского опыта полезно проверить как можно больше аспектов адреса email. Я вижу по валидатору aspNetMX , что они проверяют:

  • синтаксис
  • email против списка плохих email адресов
  • домен против списка плохих доменов
  • список доменов почтовых ящиков
  • существует ли домен или нет
  • есть ли записи MX для домена
  • и, наконец, через SMTP, существует ли почтовый ящик или нет

Это последний шаг, который может быть обойден администраторами, возвращая true практически для всех запросов на проверку учетной записи, но в большинстве случаев, если пользователь намеренно ввел неверный адрес, он уже был пойман. И если это была ошибка пользователя в доменной части адреса, то она тоже будет поймана.

Конечно, наилучшей практикой для использования такого рода сервиса для экрана регистрации или формы было бы объединить этот вид проверки с процессом проверки, чтобы убедиться, что адрес email является действительным. Самое замечательное в использовании валидатора email перед процессом проверки - это то, что он позволит улучшить общий пользовательский опыт.


  Сведения об ответе

crush

21:50, 1st August, 2020

Вы можете попробовать приведенный ниже код, он отлично работает для меня :

public class EmailTest {
    private static int hear(BufferedReader in) throws IOException {
        String line = null;
        int res = 0;

        while ((line = in.readLine()) != null) {
            String pfx = line.substring(0, 3);
            try {
                res = Integer.parseInt(pfx);
            } catch (Exception ex) {
                res = -1;
            }
            if (line.charAt(3) != '-')
                break;
        }

        return res;
    }

    private static void say(BufferedWriter wr, String text) throws IOException {
        wr.write(text + "\r\n");
        wr.flush();

        return;
    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    private static ArrayList getMX(String hostName) throws NamingException {
        // Perform a DNS lookup for MX records in the domain
        Hashtable env = new Hashtable();
        env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
        DirContext ictx = new InitialDirContext(env);
        Attributes attrs = ictx.getAttributes(hostName, new String[] { "MX" });
        Attribute attr = attrs.get("MX");

        // if we don't have an MX record, try the machine itself
        if ((attr == null) || (attr.size() == 0)) {
            attrs = ictx.getAttributes(hostName, new String[] { "A" });
            attr = attrs.get("A");
            if (attr == null)
                throw new NamingException("No match for name '" + hostName + "'");
        }
        /*
         Huzzah! we have machines to try. Return them as an array list
         NOTE: We SHOULD take the preference into account to be absolutely
         correct. This is left as an exercise for anyone who cares.
         */
        ArrayList res = new ArrayList();
        NamingEnumeration en = attr.getAll();

        while (en.hasMore()) {
            String mailhost;
            String x = (String) en.next();
            String f[] = x.split(" ");
            // THE fix *************
            if (f.length == 1)
                mailhost = f[0];
            else if (f[1].endsWith("."))
                mailhost = f[1].substring(0, (f[1].length() - 1));
            else
                mailhost = f[1];
            // THE fix *************
            res.add(mailhost);
        }
        return res;
    }

    @SuppressWarnings("rawtypes")
    public static boolean isAddressValid(String address) {
        // Find the separator for the domain name
        int pos = address.indexOf('@');

        // If the address does not contain an '@', it's not valid
        if (pos == -1)
            return false;

        // Isolate the domain/machine name and get a list of mail exchangers
        String domain = address.substring(++pos);
        ArrayList mxList = null;
        try {
            mxList = getMX(domain);
        } catch (NamingException ex) {
            return false;
        }

        /*
        Just because we can send mail to the domain, doesn't mean that the
        address is valid, but if we can't, it's a sure sign that it isn't
        */
        if (mxList.size() == 0)
            return false;

        /* 
        Now, do the SMTP validation, try each mail exchanger until we get
        a positive acceptance. It *MAY* be possible for one MX to allow
        a message [store and forwarder for example] and another [like
        the actual mail server] to reject it. This is why we REALLY ought
        to take the preference into account.
        */
        for (int mx = 0; mx < mxList.size(); mx++) {
            boolean valid = false;
            try {
                int res;
                //
                Socket skt = new Socket((String) mxList.get(mx), 25);
                BufferedReader rdr = new BufferedReader(new InputStreamReader(skt.getInputStream()));
                BufferedWriter wtr = new BufferedWriter(new OutputStreamWriter(skt.getOutputStream()));

                res = hear(rdr);
                if (res != 220)
                    throw new Exception("Invalid header");
                say(wtr, "EHLO rgagnon.com");

                res = hear(rdr);
                if (res != 250)
                    throw new Exception("Not ESMTP");

                // validate the sender address
                say(wtr, "MAIL FROM: <tim@orbaker.com>");
                res = hear(rdr);
                if (res != 250)
                    throw new Exception("Sender rejected");

                say(wtr, "RCPT TO: <" + address + ">");
                res = hear(rdr);

                // be polite
                say(wtr, "RSET");
                hear(rdr);
                say(wtr, "QUIT");
                hear(rdr);
                if (res != 250)
                    throw new Exception("Address is not valid!");

                valid = true;
                rdr.close();
                wtr.close();
                skt.close();
            } catch (Exception ex) {
                // Do nothing but try next host
                ex.printStackTrace();
            } finally {
                if (valid)
                    return true;
            }
        }
        return false;
    }

    public static void main(String args[]) {
        String testData[] = { "rahul.saraswat@techblue.com", "rahul.saraswat@techblue.co.uk", "srswt.rahul12345@gmail.com",
        "srswt.rahul@gmail.com" };
        System.out.println(testData.length);
        for (int ctr = 0; ctr < testData.length; ctr++) {
            System.out.println(testData[ctr] + " is valid? " + isAddressValid(testData[ctr]));
        }
        return;
    }
}

Спасибо & С Уважением Рахул Сарасват


  Сведения об ответе

SILA

12:24, 19th August, 2020

Настоящая проверка электронной почты (TM) пытается отправить что-то на адрес, и, увидев, что это rejected/bounced. так, вам просто нужно будет отправить их и удалить адреса, которые не удаляются из вашего списка рассылки.


  Сведения об ответе

VCe znayu

14:31, 5th August, 2020

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

Кроме того, помните о законе CAN-SPAM и соблюдайте закон при отправке этих писем; вы должны предоставить ссылку субъекта, а также физический адрес (чтобы идентифицировать вас и t0 разрешить пользователям отправлять запросы субъекта по электронной почте, если они этого захотят).

Неспособность сделать эти вещи может привести к тому, что ваш IP null-routed в лучшем случае и судится в худшем.


  Сведения об ответе

DAAA

05:03, 26th August, 2020

Вам может понадобиться этот компонент Email Validator для .NET

Вот пример кода:


   // Create a new instance of the EmailValidator class.
   EmailValidator em = new EmailValidator();
   em.MessageLogging += em_MessageLogging;
   em.EmailValidated += em_EmailValidationCompleted;
   try
   {
       string[] list = new string[3] { "test1@testdomain.com", "test2@testdomain.com", "test3@testdomain.com" };
       em.ValidateEmails(list);
   }
   catch (EmailValidatorException exc2)
   {
       Console.WriteLine("EmailValidatorException: " + exc2.Message);
   }


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться