การส่งอีเมลโดยไม่ต้องใช้เซิร์ฟเวอร์อีเมล


11

JavaMail ส่งอีเมลโดยใช้เซิร์ฟเวอร์อีเมลโดยทั่วไปผ่านอินเตอร์เฟส SMTP ของผู้ให้บริการอีเมล จำเป็นต้องใช้เซิร์ฟเวอร์อีเมลในการส่งอีเมลหรือไม่

ฉันมีเว็บไซต์ที่จะส่งอีเมลและถ้าเป็นไปได้ฉันต้องการส่งอีเมลโดยตรงจากรหัสเว็บไซต์โดยไม่ต้องใช้เซิร์ฟเวอร์อีเมล JavaMail FAQ บอกว่าจำเป็นต้องใช้เซิร์ฟเวอร์อีเมล

มีวิธีการส่งอีเมลโดยไม่ใช้เซิร์ฟเวอร์อีเมลด้วย JavaMail หรือ API อื่นหรือไม่


ไม่เป็นไปไม่ได้ ลูกค้าอีเมลควรได้รับอีเมลที่คุณส่งไปอย่างไร
Oded


อีกทางเลือกหนึ่งซึ่งไม่จำเป็นต้องใช้กับ JavaMail คือการตั้งค่า MTA เช่น Postfix คุณไม่จำเป็นต้องใช้เซิร์ฟเวอร์จดหมายระยะไกลเพราะคุณมีเซิร์ฟเวอร์ในตัว
user16764

แม่นยำ. ฉันคิดว่าคุณสามารถพูดได้ว่า Microsoft Mail MTA เก่านั้น "serverless" ในแง่ที่ว่าลูกค้า Microsoft Mail นั้นจัดการและรับข้อความจาก / ไปยังที่เก็บเมลส่วนกลางในระบบไฟล์ (บนเซิร์ฟเวอร์ไฟล์โดยเฉพาะ เดียว) แต่ถึงอย่างนั้นวิธีเดียวที่จะลบเมลออกจากระบบนั้นสู่คนอื่นก็คือผ่านเกตเวย์ซึ่งมักจะเกี่ยวข้องกับเซิร์ฟเวอร์ คุณแน่ใจหรือไม่ว่าคุณได้ถามคำถามที่คุณต้องการ?
Craig

คำตอบ:


11

คุณสามารถส่งอีเมลโดยตรงไปยังหนึ่งในเซิร์ฟเวอร์ SMTP ที่กล่าวถึงในระเบียน MX ของโดเมนของที่อยู่ โดยปกติจะเป็นความคิดที่ไม่ดีแม้ว่า:

การส่งจดหมายไปยังเซิร์ฟเวอร์ภายในเครื่องนั้นรวดเร็วคุณสามารถดำเนินการต่อได้ทันทีและทำอย่างอื่นและให้เซิร์ฟเวอร์จัดการการส่งมอบ

การจัดส่งจริงอาจใช้เวลาสักครู่เช่นเซิร์ฟเวอร์จดหมายระยะไกลอาจช้า หรืออาจปฏิเสธจดหมายก่อน - เป็นกลยุทธ์ที่รู้จักกันดีในการต่อต้านจดหมายขยะเพื่อบอกผู้ส่งให้ลองส่งจดหมายเป็นครั้งที่สองซึ่งบอทสแปมบางอย่างจะไม่ทำ

นอกจากนี้เมลเซิร์ฟเวอร์ยังสามารถลองอีกครั้งได้อย่างง่ายดายในอีกหนึ่งวันต่อมาหรือเมื่อเซิร์ฟเวอร์ระยะไกลไม่ทำงานจะช่วยลดความเสี่ยงของเมลที่สูญหาย


ขอบคุณสำหรับข้อมูลเกี่ยวกับการป้องกันสแปม ฉันเห็นได้ว่าการเปลี่ยนแปลงกลยุทธ์เหล่านี้ทำให้การใช้เซิร์ฟเวอร์อีเมลเป็นความคิดที่ดี
Dean Schulze

2
ในทางเทคนิคการเปลี่ยนแอปพลิเคชันของคุณให้กลายเป็นเมลเซิร์ฟเวอร์ดังนั้นคุณยังคงใช้เมลเซิร์ฟเวอร์อยู่แม้ว่าจะเป็นกระดูกที่ค่อนข้างเปลือยเปล่า
jwenting

@jwenting ว่าจะเป็นเซิร์ฟเวอร์อีเมลได้อย่างไรหากทำหน้าที่เป็นลูกค้าที่เชื่อมต่อกับเซิร์ฟเวอร์อื่นเท่านั้น ผมค่อนข้างคิดว่าจะเป็นเซิร์ฟเวอร์ "" คุณต้องมีอย่างน้อยหนึ่ง "ลูกค้า" เชื่อมต่อกับคุณ ...
เจสัน Goemaat

นอกจากนี้การส่งไปยังเซิร์ฟเวอร์อีเมลระยะไกลโดยตรงจากแอปของคุณน่าจะใช้งานได้ทั้งการตรวจสอบป้องกันสแปม SPF / DMARC
Craig

1

ทุกอย่างขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "ใช้" อย่างแน่นอน

หาก "ใช้" รวมถึงการใช้โดยตรงของเซิร์ฟเวอร์อีเมลคุณอาจส่งอีเมลเพื่อส่งผ่านบริการประเภทอื่นทางอ้อมไปยังเซิร์ฟเวอร์อีเมล สำหรับกรณีการใช้งานจริงดูเหมือนว่าจะเป็นคำตอบที่ดีสำหรับฉัน

อย่างไรก็ตามหากคำถามของคุณหมายถึงตัวอักษร " โดยไม่เกี่ยวข้องกับเซิร์ฟเวอร์อีเมลใด ๆ เลย " นี่จะเป็นไปได้ก็ต่อเมื่อซอฟต์แวร์ของคุณสามารถใส่อีเมลลงในกล่องจดหมายของลูกค้าเป้าหมายด้วยวิธีที่คุณเลือก แต่ยกเว้น POP3 หรือ IMAP หรือโปรโตคอลอื่น ๆ ที่เกี่ยวข้องกับอีเมลที่ใช้ในบริบทของอีเมล (เพราะหากคุณต้องการใช้โปรโตคอลดังกล่าวโปรแกรมนั้นจะทำหน้าที่เป็นเซิร์ฟเวอร์อีเมลซึ่งไม่ได้รับอนุญาต)

เพื่อตอบคำถาม: ใช่ อย่างน้อยก็ในทางทฤษฎี


ฉันกำลังถามว่าฉันต้องใช้เซิร์ฟเวอร์อีเมลเพื่อส่งอีเมลไปยังเซิร์ฟเวอร์อีเมลผู้รับหรือไม่ (เซิร์ฟเวอร์อีเมล 2 แห่ง) ฉันสนใจที่จะส่งโดยตรงไปยังเซิร์ฟเวอร์อีเมลผู้รับจากรหัสของฉัน (เซิร์ฟเวอร์อีเมล 1) ฉันไม่ได้พยายามข้ามเซิร์ฟเวอร์อีเมลของผู้รับ แต่เป็นเซิร์ฟเวอร์อีเมลที่ส่ง
Dean Schulze

ในการส่งอีเมลคุณต้องเป็นไคลเอนต์อีเมลหรือเซิร์ฟเวอร์อีเมล ในกรณีส่วนใหญ่ในการส่งอีเมลในฐานะลูกค้าคุณจะต้องได้รับความเชื่อถือไม่ว่าจะโดยไวท์ลิสต์หรือโดยการอนุญาต ในการส่งเป็นเซิร์ฟเวอร์กฎการอนุญาตมักเข้มงวดกว่านี้ มันขึ้นอยู่กับกฎที่เซิร์ฟเวอร์อีเมลของผู้รับใช้เพื่อให้สิทธิ์ผู้ส่งที่ถูกต้อง
BobDalgleish

@BobDalgleish: หากฉันสามารถจัดการการเข้าถึงเครื่องของคุณฉันสามารถทำอะไรก็ได้ รวมถึงการใส่อีเมลลงในกล่องจดหมายของคุณ ฉันยอมรับว่านี่เป็นตัวเลือกทางวิชาการเพียงอย่างเดียว แต่คำถามไม่ได้ถูกกำหนดขอบเขตไว้อย่างชัดเจน
JensG

@DeanSchulze: ฉันคิดว่าโจฮันเนสได้ตอบคำถามนั้นแล้วและทำไมมันถึงไม่ใช่ความคิดที่ดี ถ้าฉันเป็นคุณฉันจะชอบแนวคิดการบริการ
JensG

0

หากเราต้องส่งจดหมายถึงใครบางคนจากรหัส Java เราต้องมีการเข้าถึงข้อมูลประจำตัวของเซิร์ฟเวอร์อีเมลบางอย่าง ก็ไม่เสมอไป

Google ได้ให้การเข้าถึงเซิร์ฟเวอร์อีเมลตัวใดตัวหนึ่งฟรีและคุณสามารถใช้งานได้ในรหัส Java ด้านล่างเป็นลายลักษณ์อักษรรหัสถ้าเพิ่มเติมเช่นบันทึกย่อให้ตนเอง ดังนั้นหากฉันต้องการมันเป็นบางครั้งคุณสามารถดูได้ที่นี่: http://www.computerbuzz.in/2014/02/how-to-send-email-in-java-using-gmail.html

private void setMailServerProperties()
    {
        Properties emailProperties = System.getProperties();
        emailProperties.put("mail.smtp.port", "586");
        emailProperties.put("mail.smtp.auth", "true");
        emailProperties.put("mail.smtp.starttls.enable", "true");
        mailSession = Session.getDefaultInstance(emailProperties, null);
    }

    private MimeMessage draftEmailMessage() throws AddressException, MessagingException
    {
        String[] toEmails = { "computerbuzz@gmail.com" };
        String emailSubject = "Test email subject";
        String emailBody = "This is an email sent by http://www.computerbuzz.in.";
        MimeMessage emailMessage = new MimeMessage(mailSession);
        /**
         * Set the mail recipients
         * */
        for (int i = 0; i < toEmails.length; i++)
        {
            emailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmails[i]));
        }
        emailMessage.setSubject(emailSubject);
        /**
         * If sending HTML mail
         * */
        emailMessage.setContent(emailBody, "text/html");
        /**
         * If sending only text mail
         * */
        //emailMessage.setText(emailBody);// for a text email
        return emailMessage;
    }

    private void sendEmail() throws AddressException, MessagingException
    {
        /**
         * Sender's credentials
         * */
        String fromUser = "user-email@gmail.com";
        String fromUserEmailPassword = "*******";

        String emailHost = "smtp.gmail.com";
        Transport transport = mailSession.getTransport("smtp");
        transport.connect(emailHost, fromUser, fromUserEmailPassword);
        /**
         * Draft the message
         * */
        MimeMessage emailMessage = draftEmailMessage();
        /**
         * Send the mail
         * */
        transport.sendMessage(emailMessage, emailMessage.getAllRecipients());
        transport.close();
        System.out.println("Email sent successfully.");
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.