تحقق من اتصال خادم البريد برمجيًا في ColdFusion
-
01-10-2019 - |
سؤال
أنا أستخدم خوادم SMTP المخصصة وأرغب في التحقق من الاتصال عندما يدخل المستخدم بيانات اعتماد الخادم الخاصة به.
بالضبط نفس النوع من التحقق مثل Adobe CF و Railo يسمح بالقيام به عند إضافة خادم البريد.
بالتأكيد ، هذا لا يضمن ذلك توصيل ستعمل ، ولكن على الأقل للتحقق من أن الخادم/اسم المستخدم/التمرير الذي تم إدخاله صالح.
أستطيع أن أرى طريقة واحدة صعبة: حاول إرسال البريد الإلكتروني مع cfmail وتحقق من سجل البريد. لكنني أعتقد أنه يمكن القيام به أكثر أناقة.
هل هناك أي مكتبة Java متوفرة مع توزيعات ACF/Railo القياسية لمساعدتي؟ كيف يمكنني استخدامها؟ أمثلة موضع تقدير كبير.
شكرا مقدما.
تعديل:
من فضلك لا تخلط بين علامة جافا. الحل المطلوب في CFML. على الرغم من أنه يمكنه استخدام بعض مكتبات Java ، إن أمكن.
المحلول
أعتقد أن Sfussenegger لديه الفكرة الصحيحة. ولكن بدلاً من استخدام مصادقة مخصصة ، ماذا عن المصادقة عبر Connect (..)؟ تم اختباره فقط مع Gmail. يبدو أنه يعمل.
تعديل: لقد اختبرت هذا مع CF9 و OBD بنجاح. لسوء الحظ ، لم يكن لدي حظ مع رايلو ... بومر.
تعديل: تم تحديثه لإضافة خاصية "mail.smtp.auth" المفقودة. يجب أن تعمل الآن بشكل صحيح مع Railo أيضًا.
//Java Version
int port = 587;
String host = "smtp.gmail.com";
String user = "username@gmail.com";
String pwd = "email password";
try {
Properties props = new Properties();
// required for gmail
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.auth", "true");
// or use getDefaultInstance instance if desired...
Session session = Session.getInstance(props, null);
Transport transport = session.getTransport("smtp");
transport.connect(host, port, user, pwd);
transport.close();
System.out.println("success");
}
catch(AuthenticationFailedException e) {
System.out.println("AuthenticationFailedException - for authentication failures");
e.printStackTrace();
}
catch(MessagingException e) {
System.out.println("for other failures");
e.printStackTrace();
}
<cfscript>
//CF Version
port = 587;
host = "smtp.gmail.com";
user = "username@gmail.com";
pwd = "email password";
try {
props = createObject("java", "java.util.Properties").init();
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
// or use getDefaultInstance instance if desired...
mailSession = createObject("java", "javax.mail.Session").getInstance(props, javacast("null", ""));
transport = mailSession.getTransport("smtp");
transport.connect(host, port, user, pwd);
transport.close();
WriteOutput("success");
}
//for authentication failures
catch(javax.mail.AuthenticationFailedException e) {
WriteOutput("Error: "& e.type &" ** "& e.message);
}
// for other failures
catch(javax.mail.MessagingException e) {
WriteOutput("Error: "& e.type &" ** "& e.message);
}
</cfscript>
نصائح أخرى
استخدام Apache Commons Net, ، يمكنك أن تفعل شيئًا كهذا:
try {
int reply;
client.connect("mail.foobar.com");
System.out.print(client.getReplyString());
// After connection attempt, you should check the reply code to verify
// success.
reply = client.getReplyCode();
if(!SMTPReply.isPositiveCompletion(reply)) {
client.disconnect();
System.err.println("SMTP server refused connection.");
System.exit(1);
}
// Do useful stuff here.
...
} catch(IOException e) {
if(client.isConnected()) {
try {
client.disconnect();
} catch(IOException f) {
// do nothing
}
}
System.err.println("Could not connect to server.");
e.printStackTrace();
System.exit(1);
}
أين client
هو مثال org.apache.commons.net.smtp.smtpclient صف دراسي. تم أخذ الكود أعلاه من مستندات SMTPClient API.
هذا ليس جميلًا ، ولكن يمكن أن يفعله: ما عليك سوى استخدام محاولة إرسال بريد إلكتروني إلى عنوان غير قانوني ومعرفة رسالة الخطأ التي تحصل عليها. إذا كانت رسالة الخطأ تشكو من المصادقة الفاشلة ، فأنت تعرف ماذا تفعل.
تحرير بعض رمز العمل:
إليك بعض رمز العمل للتحقق من صحة بيانات اعتماد Gmail. Gmail لا يشتكي من@localhost غير قانوني. الآن يمكنك إما محاولة البحث عن مستلم يتسبب في استثناء أو إرسال بريد حقًا إلى عنوان وتجاهله على الفور.. تحرير: ليس من الضروري إرسال شيء ما. ما عليك سوى توصيل ومعالجة المصادقة المحتملة FailedException.
import java.util.Properties;
import javax.mail.AuthenticationFailedException;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
public class Main {
private static Session createSmtpSession(final String user, final String password) {
final Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.host", "smtp.gmail.com");
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.port", "587");
props.setProperty("mail.smtp.starttls.enable", "true");
return Session.getDefaultInstance(props, new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
});
}
private static boolean validateCredentials(String user, String password) {
try {
Transport transport = createSmtpSession(user, password).getTransport();
transport.connect();
transport.close();
} catch (AuthenticationFailedException e) {
return false;
} catch (MessagingException e) {
throw new RuntimeException("validate failed", e);
}
return true;
}
public static void main(String[] args) {
System.out.println(validateCredentials(args[0], args[1]));
}
}