Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Email SMTP валидатор
Мне нужно отправить сотни информационных бюллетеней, но сначала я хотел бы проверить, существует ли email на сервере. Это называется SMTP валидация, по крайней мере, я так думаю, основываясь на моих исследованиях в Интернете.
Есть несколько библиотек, которые могут это сделать, а также страница с открытым исходным кодом в ASP Classic (http://www.coveryourasp.com/ValidateEmail.asp#Result3), но мне трудно читать ASP Classic, и кажется, что он использует какую-то стороннюю библиотеку...
Есть ли какой-то код для проверки SMTP в C#, и / или общее объяснение того, как это работает?
Имейте в виду, что у большинства MTAs (Mail Transfer Agent) команда VRFY будет отключена по причинам защиты от спама, они, вероятно, даже заблокируют вас, если вы попробуете несколько RCPT подряд (см. http://www.spamresource.com/2007/01/whatever-happened-to-vrfy.html ). Так что даже если вы найдете библиотеку, чтобы сделать эту проверку, она не будет стоить много. Измаил прав, единственный способ действительно выяснить это-послать email и посмотреть, отскочит ли он или нет.
@Hrvoje: Да, я предлагаю вам следить за отклоненными письмами. BUT: не все отскочившие письма должны автоматически попадать в ваш список "не существует", вы также должны различать временные (например, полный почтовый ящик) и постоянные ошибки.
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
Хотя это правда, что многие домены будут возвращать ложные срабатывания из-за злоупотребления, все же есть некоторые отличные компоненты, которые будут выполнять несколько уровней проверки, помимо проверки SMTP. Например, стоит сначала проверить, существует ли хотя бы домен. Я нахожусь в процессе составления своего собственного списка ресурсов, связанных с этим вопросом, который вы можете отслеживать здесь:
http://delicious.com/dworthley/email.validation
Для тех, кто, возможно, захочет добавить в этот список, я также включу то, что у меня сейчас есть здесь:
Для пуленепробиваемой формы и отличного пользовательского опыта полезно проверить как можно больше аспектов адреса email. Я вижу по валидатору aspNetMX , что они проверяют:
- синтаксис
- email против списка плохих email адресов
- домен против списка плохих доменов
- список доменов почтовых ящиков
- существует ли домен или нет
- есть ли записи MX для домена
- и, наконец, через SMTP, существует ли почтовый ящик или нет
Это последний шаг, который может быть обойден администраторами, возвращая true практически для всех запросов на проверку учетной записи, но в большинстве случаев, если пользователь намеренно ввел неверный адрес, он уже был пойман. И если это была ошибка пользователя в доменной части адреса, то она тоже будет поймана.
Конечно, наилучшей практикой для использования такого рода сервиса для экрана регистрации или формы было бы объединить этот вид проверки с процессом проверки, чтобы убедиться, что адрес email является действительным. Самое замечательное в использовании валидатора email перед процессом проверки - это то, что он позволит улучшить общий пользовательский опыт.
Вы можете попробовать приведенный ниже код, он отлично работает для меня :
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;
}
}
Спасибо & С Уважением Рахул Сарасват
Не поймите меня неправильно, но рассылка информационных бюллетеней более чем горстке людей в наши дни является довольно серьезным делом. Да, вы должны отслеживать отскоки (отклоненные электронные письма), которые могут происходить синхронно во время отправки SMTP (как правило, если сервер SMTP, к которому вы подключены, является авторитетным), или асинхронно как системное сообщение email, которое происходит через некоторое время после успешной отправки SMTP.
Кроме того, помните о законе CAN-SPAM и соблюдайте закон при отправке этих писем; вы должны предоставить ссылку субъекта, а также физический адрес (чтобы идентифицировать вас и t0 разрешить пользователям отправлять запросы субъекта по электронной почте, если они этого захотят).
Неспособность сделать эти вещи может привести к тому, что ваш IP null-routed в лучшем случае и судится в худшем.
Вам может понадобиться этот компонент 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);
}