سؤال

لقد وجدت العديد من الأسئلة الأخرى على SO فيما يتعلق بـ JavaMail API وإرسال البريد من خلال خادم SMTP، ولكن لم يناقش أي منها استخدام أمان TLS.أحاول استخدام JavaMail لإرسال تحديثات الحالة إلى نفسي من خلال خادم بريد SMTP الخاص بالعمل، ولكنه يتطلب TLS، ولا يمكنني العثور على أي أمثلة عبر الإنترنت حول كيفية استخدام JavaMail للوصول إلى خادم SMTP الذي يتطلب تشفير TLS.يمكن لأي شخص أن تساعد في ذلك؟

هل كانت مفيدة؟

المحلول

لدينا بالفعل بعض رمز الإعلام في منتجاتنا يستخدم TLS لإرسال البريد إذا كان متوفرا.

وسوف تحتاج لتعيين خصائص جافا البريد. تحتاج فقط TLS واحد ولكن قد تحتاج SSL إذا كان الخادم SMTP الخاص بك يستخدم SSL.

Properties props = new Properties();
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.auth", "true");  // If you need to authenticate
// Use the following if you need SSL
props.put("mail.smtp.socketFactory.port", d_port);
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");

ويمكنك بعد ذلك إما تمرير هذا إلى جلسة JavaMail أو أي المسرع جلسة أخرى مثل Session.getDefaultInstance(props).

نصائح أخرى

وظيفة جيدة، الخط

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

إلزامي إذا كان خادم SMTP يستخدم مصادقة SSL, ، كما يفعل خادم GMail SMTP.ولكن إذا كان الخادم يستخدم مصادقة النص العادي عبر TLS, ، لا ينبغي أن يكون موجودًا، لأن Java Mail سوف يشكو من كون الاتصال الأولي نصًا عاديًا.

تأكد أيضًا من أنك تستخدم أحدث إصدار من Java Mail.لقد استخدمت مؤخرًا بعض جرة Java Mail القديمة من مشروع سابق ولم أتمكن من تشغيل الكود، لأن عملية تسجيل الدخول كانت فاشلة.بعد أن قمت بالترقية إلى الإصدار الأحدث من Java Mail، أصبح سبب الخطأ واضحًا:لقد كان javax.net.ssl.SSLHandshakeException، والذي لم يتم طرحه في الإصدار القديم من lib.

والإعدادات من المثال أعلاه لم تنجح لخادم كنت تستخدم ( authsmtp.com ) . ظللت على الحصول على هذا الخطأ:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

وأزلت إعدادات mail.smtp.socketFactory وعملت كل شيء. و(لم يستخدم المصادقة SMTP وأنا تعيين منفذ في مكان آخر) الإعدادات النهائية هذا:

java.util.Properties props = new java.util.Properties();
props.put("mail.smtp.starttls.enable", "true");

ومجرد استخدام التعليمات البرمجية التالية. ومن المفيد حقا لإرسال البريد الإلكتروني عن طريق جافا، ويعمل:

import java.util.*;
import javax.activation.CommandMap;
import javax.activation.MailcapCommandMap;
import javax.mail.*;
import javax.mail.Provider;
import javax.mail.internet.*;

public class Main {

    public static void main(String[] args) {
            final String username="your@gmail.com";
            final String password="password";
            Properties prop=new Properties();
            prop.put("mail.smtp.auth", "true");
            prop.put("mail.smtp.host", "smtp.gmail.com");
            prop.put("mail.smtp.port", "587");
            prop.put("mail.smtp.starttls.enable", "true");

            Session session = Session.getDefaultInstance(prop,
          new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
          }
        });
          try {
                 String body="Dear Renish Khunt Welcome";
                 String htmlBody = "<strong>This is an HTML Message</strong>";
                 String textBody = "This is a Text Message.";
         Message message = new MimeMessage(session);
         message.setFrom(new InternetAddress("your@gmail.com"));
                 message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("receiver@gmail.com"));
        message.setSubject("Testing Subject");
        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);
            message.setText(htmlBody);
                        message.setContent(textBody, "text/html");
            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            e.printStackTrace();
        }

    }

}

مع بريد جافا البسيط 5.0.0 (simplejavamail.org) الأمر بسيط جدًا وستتولى المكتبة جميع خصائص الجلسة نيابةً عنك.

فيما يلي مثال لاستخدام خوادم SMTP من Google:

Email email = EmailBuilder.startingBlank()
        .from("lollypop", "lol.pop@somemail.com")
        .to("C.Cane", "candycane@candyshop.org")
        .withSubject("hey")
        .withPlainText("We should meet up!")
        .withHTMLText("<b>We should meet up!</b>")
        .buildEmail();

MailerBuilder.withSMTPServer("smtp.gmail.com", 25, "user", "pass", SMTP_TLS)
        .buildMailer()
        .sendMail(email);

MailerBuilder.withSMTPServer("smtp.gmail.com", 587, "user", "pass", SMTP_TLS)
        .buildMailer()
        .sendMail(email);

MailerBuilder.withSMTPServer("smtp.gmail.com", 465, "user", "pass", SMTP_SSL)
        .buildMailer()
        .sendMail(email);

إذا كان تسجيل الدخول الثنائي قيد التشغيل، فستحتاج إلى إنشاء حساب كلمة المرور الخاصة بالتطبيق من حسابك في جوجل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top