Gửi email bằng java


112

Tôi đang cố gửi email bằng Java:

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendEmail {

   public static void main(String [] args) {

      // Recipient's email ID needs to be mentioned.
      String to = "abcd@gmail.com";

      // Sender's email ID needs to be mentioned
      String from = "web@gmail.com";

      // Assuming you are sending email from localhost
      String host = "localhost";

      // Get system properties
      Properties properties = System.getProperties();

      // Setup mail server
      properties.setProperty("mail.smtp.host", host);

      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);

      try{
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO,
                                  new InternetAddress(to));

         // Set Subject: header field
         message.setSubject("This is the Subject Line!");

         // Now set the actual message
         message.setText("This is actual message");

         // Send message
         Transport.send(message);
         System.out.println("Sent message successfully....");
      }catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
}

Tôi gặp lỗi:

javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
  nested exception is:java.net.ConnectException: Connection refused: connect
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1706)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:525)

Mã này có hoạt động để gửi email không?


11
Bạn có đang chạy một máy chủ SMTP trên cùng một máy nghe trên cổng 25 không?
Jeff

Tôi sẽ giả sử theo địa chỉ của bạn rằng bạn đang cố gắng chuyển tiếp qua gmail? Nếu điều này là đúng thì tôi có thể có một số mã mà bạn có thể sử dụng. Đây là một gợi ý, bạn cần TLS
Paul Gregoire

@Mondain Sẽ rất hữu ích nếu bạn có thể năm một số mã. Tôi muốn chuyển tiếp bằng gmail
Mohit Bansal

Nó được liên kết trong câu trả lời của tôi bên dưới, điều duy nhất là nó không sử dụng thư viện JavaMail. Tôi có thể gửi cho bạn nguồn đầy đủ nếu bạn muốn.
Paul Gregoire

Câu trả lời:


98

Đoạn mã sau hoạt động rất tốt với máy chủ SMTP của Google. Bạn cần cung cấp tên người dùng và mật khẩu Google của mình.

import com.sun.mail.smtp.SMTPTransport;
import java.security.Security;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 *
 * @author doraemon
 */
public class GoogleMail {
    private GoogleMail() {
    }

    /**
     * Send email using GMail SMTP server.
     *
     * @param username GMail username
     * @param password GMail password
     * @param recipientEmail TO recipient
     * @param title title of the message
     * @param message message to be sent
     * @throws AddressException if the email address parse failed
     * @throws MessagingException if the connection is dead or not in the connected state or if the message is not a MimeMessage
     */
    public static void Send(final String username, final String password, String recipientEmail, String title, String message) throws AddressException, MessagingException {
        GoogleMail.Send(username, password, recipientEmail, "", title, message);
    }

    /**
     * Send email using GMail SMTP server.
     *
     * @param username GMail username
     * @param password GMail password
     * @param recipientEmail TO recipient
     * @param ccEmail CC recipient. Can be empty if there is no CC recipient
     * @param title title of the message
     * @param message message to be sent
     * @throws AddressException if the email address parse failed
     * @throws MessagingException if the connection is dead or not in the connected state or if the message is not a MimeMessage
     */
    public static void Send(final String username, final String password, String recipientEmail, String ccEmail, String title, String message) throws AddressException, MessagingException {
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

        // Get a Properties object
        Properties props = System.getProperties();
        props.setProperty("mail.smtps.host", "smtp.gmail.com");
        props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.port", "465");
        props.setProperty("mail.smtps.auth", "true");

        /*
        If set to false, the QUIT command is sent and the connection is immediately closed. If set 
        to true (the default), causes the transport to wait for the response to the QUIT command.

        ref :   http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html
                http://forum.java.sun.com/thread.jspa?threadID=5205249
                smtpsend.java - demo program from javamail
        */
        props.put("mail.smtps.quitwait", "false");

        Session session = Session.getInstance(props, null);

        // -- Create a new message --
        final MimeMessage msg = new MimeMessage(session);

        // -- Set the FROM and TO fields --
        msg.setFrom(new InternetAddress(username + "@gmail.com"));
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientEmail, false));

        if (ccEmail.length() > 0) {
            msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(ccEmail, false));
        }

        msg.setSubject(title);
        msg.setText(message, "utf-8");
        msg.setSentDate(new Date());

        SMTPTransport t = (SMTPTransport)session.getTransport("smtps");

        t.connect("smtp.gmail.com", username, password);
        t.sendMessage(msg, msg.getAllRecipients());      
        t.close();
    }
}

Cập nhật vào ngày 11 tháng 12 năm 2015

Tên người dùng + mật khẩu không còn là giải pháp được khuyến nghị nữa. Điều này là do

Tôi đã thử điều này và Gmail đã gửi email được sử dụng làm tên người dùng trong mã này một email thông báo rằng Chúng tôi gần đây đã chặn nỗ lực đăng nhập vào Tài khoản Google của bạn và hướng tôi đến trang hỗ trợ này: support.google.com/accounts/answer/6010255 để nó hoạt động, tài khoản email đang được sử dụng để gửi cần giảm bảo mật của chính chúng

Google đã phát hành API Gmail - https://developers.google.com/gmail/api/?hl=vi . Chúng ta nên sử dụng phương thức oAuth2, thay vì tên người dùng + mật khẩu.

Đây là đoạn mã để làm việc với API Gmail.

GoogleMail.java

import com.google.api.client.util.Base64;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.model.Message;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 *
 * @author doraemon
 */
public class GoogleMail {
    private GoogleMail() {
    }

    private static MimeMessage createEmail(String to, String cc, String from, String subject, String bodyText) throws MessagingException {
        Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);

        MimeMessage email = new MimeMessage(session);
        InternetAddress tAddress = new InternetAddress(to);
        InternetAddress cAddress = cc.isEmpty() ? null : new InternetAddress(cc);
        InternetAddress fAddress = new InternetAddress(from);

        email.setFrom(fAddress);
        if (cAddress != null) {
            email.addRecipient(javax.mail.Message.RecipientType.CC, cAddress);
        }
        email.addRecipient(javax.mail.Message.RecipientType.TO, tAddress);
        email.setSubject(subject);
        email.setText(bodyText);
        return email;
    }

    private static Message createMessageWithEmail(MimeMessage email) throws MessagingException, IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        email.writeTo(baos);
        String encodedEmail = Base64.encodeBase64URLSafeString(baos.toByteArray());
        Message message = new Message();
        message.setRaw(encodedEmail);
        return message;
    }

    public static void Send(Gmail service, String recipientEmail, String ccEmail, String fromEmail, String title, String message) throws IOException, MessagingException {
        Message m = createMessageWithEmail(createEmail(recipientEmail, ccEmail, fromEmail, title, message));
        service.users().messages().send("me", m).execute();
    }
}

Để tạo một dịch vụ Gmail được ủy quyền thông qua oAuth2, đây là đoạn mã.

Utils.java

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.GmailScopes;
import com.google.api.services.oauth2.Oauth2;
import com.google.api.services.oauth2.model.Userinfoplus;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.GeneralSecurityException;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.yccheok.jstock.engine.Pair;

/**
 *
 * @author yccheok
 */
public class Utils {
    /** Global instance of the JSON factory. */
    private static final GsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();

    /** Global instance of the HTTP transport. */
    private static HttpTransport httpTransport;

    private static final Log log = LogFactory.getLog(Utils.class);

    static {
        try {
            // initialize the transport
            httpTransport = GoogleNetHttpTransport.newTrustedTransport();

        } catch (IOException ex) {
            log.error(null, ex);
        } catch (GeneralSecurityException ex) {
            log.error(null, ex);
        }
    }

    private static File getGmailDataDirectory() {
        return new File(org.yccheok.jstock.gui.Utils.getUserDataDirectory() + "authentication" + File.separator + "gmail");
    }

    /**
     * Send a request to the UserInfo API to retrieve the user's information.
     *
     * @param credentials OAuth 2.0 credentials to authorize the request.
     * @return User's information.
     * @throws java.io.IOException
     */
    public static Userinfoplus getUserInfo(Credential credentials) throws IOException
    {
        Oauth2 userInfoService =
            new Oauth2.Builder(httpTransport, JSON_FACTORY, credentials).setApplicationName("JStock").build();
        Userinfoplus userInfo  = userInfoService.userinfo().get().execute();
        return userInfo;
    }

    public static String loadEmail(File dataStoreDirectory)  {
        File file = new File(dataStoreDirectory, "email");
        try {
            return new String(Files.readAllBytes(Paths.get(file.toURI())), "UTF-8");
        } catch (IOException ex) {
            log.error(null, ex);
            return null;
        }
    }

    public static boolean saveEmail(File dataStoreDirectory, String email) {
        File file = new File(dataStoreDirectory, "email");
        try {
            //If the constructor throws an exception, the finally block will NOT execute
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
            try {
                writer.write(email);
            } finally {
                writer.close();
            }
            return true;
        } catch (IOException ex){
            log.error(null, ex);
            return false;
        }
    }

    public static void logoutGmail() {
        File credential = new File(getGmailDataDirectory(), "StoredCredential");
        File email = new File(getGmailDataDirectory(), "email");
        credential.delete();
        email.delete();
    }

    public static Pair<Pair<Credential, String>, Boolean> authorizeGmail() throws Exception {
        // Ask for only the permissions you need. Asking for more permissions will
        // reduce the number of users who finish the process for giving you access
        // to their accounts. It will also increase the amount of effort you will
        // have to spend explaining to users what you are doing with their data.
        // Here we are listing all of the available scopes. You should remove scopes
        // that you are not actually using.
        Set<String> scopes = new HashSet<>();

        // We would like to display what email this credential associated to.
        scopes.add("email");

        scopes.add(GmailScopes.GMAIL_SEND);

        // load client secrets
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(Utils.JSON_FACTORY,
            new InputStreamReader(Utils.class.getResourceAsStream("/assets/authentication/gmail/client_secrets.json")));

        return authorize(clientSecrets, scopes, getGmailDataDirectory());
    }

    /** Authorizes the installed application to access user's protected data.
     * @return 
     * @throws java.lang.Exception */
    private static Pair<Pair<Credential, String>, Boolean> authorize(GoogleClientSecrets clientSecrets, Set<String> scopes, File dataStoreDirectory) throws Exception {
        // Set up authorization code flow.

        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            httpTransport, JSON_FACTORY, clientSecrets, scopes)
            .setDataStoreFactory(new FileDataStoreFactory(dataStoreDirectory))
            .build();
        // authorize
        return new MyAuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
    }

    public static Gmail getGmail(Credential credential) {
        Gmail service = new Gmail.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName("JStock").build();
        return service;        
    }
}

Để cung cấp một cách xác thực oAuth2 thân thiện với người dùng, tôi đã sử dụng JavaFX, để hiển thị hộp thoại nhập sau

nhập mô tả hình ảnh ở đây

Bạn có thể tìm thấy chìa khóa để hiển thị hộp thoại oAuth2 thân thiện với người dùng trong MyAuthorizationCodeInstalledApp.javaSimpleSwingBrowser.java


Bắt lỗi: Ngoại lệ trong chuỗi "main" javax.mail.MessagingException: Không thể kết nối với máy chủ lưu trữ SMTP: smtp.gmail.com, cổng: 465; ngoại lệ lồng nhau là: java.net.ConnectException: Kết nối đã hết thời gian chờ: kết nối tại com.sun.mail.smtp.SMTPTransport.openServer (SMTPTransport.java:1706)
Mohit Bansal

1
Nếu bạn ping smtp.gmail.com, bạn có nhận được phản hồi nào không?
Cheok Yan Cheng

Như tôi đã nói trước khi tôi chưa quen với STMP và tôi không biết cách ping smtp.gmail.com.
Mohit Bansal

2
Trong dấu nhắc lệnh của bạn, nhập 'ping smtp.gmail.com' và nhấn enter.
Cheok Yan Cheng

12
Tôi không thích rằng các phương thức được gọi Sendthay vì sendnó là một lớp hữu ích. Bất kỳ suy nghĩ nào về tác động bảo mật của việc lưu trữ mật khẩu gmail trong mã?
Simon Forsberg

48

Mã sau làm việc cho tôi.

import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class SendMail {

    public static void main(String[] args) {

        final String username = "your_user_name@gmail.com";
        final String password = "yourpassword";

        Properties props = new Properties();
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

        Session session = Session.getInstance(props,
          new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
          });

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("your_user_name@gmail.com"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("to_email_address@domain.com"));
            message.setSubject("Testing Subject");
            message.setText("Dear Mail Crawler,"
                + "\n\n No spam to my email, please!");

            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}

1
Đã làm việc trên tài khoản có xác thực 2 yếu tố bị vô hiệu hóa. Giải pháp này là tuyệt vời vì nó là cục bộ và không cần gói mặt trời.
AlikElzin-kilaka

Để sử dụng mã này, email được gửi từ cần phải là tài khoản gmail?
Erick

3
mã làm việc cho tôi nhưng trước tiên tôi cần làm này và bật "Truy cập cho các ứng dụng kém an toàn"

@ user4966430 Đồng ý! và cảm ơn!
raikumardipak

17
import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class SendEmail extends Object{

public static void main(String [] args)
{

    try{

        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.mail.yahoo.com"); // for gmail use smtp.gmail.com
        props.put("mail.smtp.auth", "true");
        props.put("mail.debug", "true"); 
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");

        Session mailSession = Session.getInstance(props, new javax.mail.Authenticator() {

            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("username@yahoo.com", "password");
            }
        });

        mailSession.setDebug(true); // Enable the debug mode

        Message msg = new MimeMessage( mailSession );

        //--[ Set the FROM, TO, DATE and SUBJECT fields
        msg.setFrom( new InternetAddress( "fromusername@yahoo.com" ) );
        msg.setRecipients( Message.RecipientType.TO,InternetAddress.parse("tousername@gmail.com") );
        msg.setSentDate( new Date());
        msg.setSubject( "Hello World!" );

        //--[ Create the body of the mail
        msg.setText( "Hello from my first e-mail sent with JavaMail" );

        //--[ Ask the Transport class to send our mail message
        Transport.send( msg );

    }catch(Exception E){
        System.out.println( "Oops something has gone pearshaped!");
        System.out.println( E );
    }
}
}

Các tệp jar bắt buộc

Nhấp vào đây - Cách thêm Lọ Bên ngoài


11

Câu trả lời ngắn gọn - Không.

Câu trả lời dài - không, vì mã dựa vào sự hiện diện của máy chủ SMTP chạy trên máy cục bộ và lắng nghe trên cổng 25. Máy chủ SMTP (về mặt kỹ thuật là MTA hoặc Tác nhân chuyển thư) chịu trách nhiệm giao tiếp với Tác nhân người dùng thư (MUA, trong trường hợp này là quy trình Java) để nhận các email gửi đi.

Giờ đây, MTA thường chịu trách nhiệm nhận thư từ người dùng cho một miền cụ thể. Vì vậy, đối với miền gmail.com, máy chủ thư của Google sẽ chịu trách nhiệm xác thực tác nhân người dùng thư và do đó chuyển thư đến hộp thư đến trên máy chủ GMail. Tôi không chắc liệu GMail có tin cậy các máy chủ chuyển tiếp thư mở hay không, nhưng chắc chắn việc thực hiện xác thực thay mặt cho Google và sau đó chuyển tiếp thư đến máy chủ GMail không phải là một việc dễ dàng.

Nếu bạn đọc Câu hỏi thường gặp về JavaMail về cách sử dụng JavaMail để truy cập GMail , bạn sẽ nhận thấy rằng tên máy chủ và cổng tình cờ trỏ đến máy chủ GMail và chắc chắn không phải đến localhost. Nếu bạn định sử dụng máy cục bộ của mình, bạn sẽ cần thực hiện chuyển tiếp hoặc chuyển tiếp.

Có thể bạn sẽ cần phải hiểu sâu về giao thức SMTP nếu bạn có ý định đi bất cứ đâu khi nói đến SMTP. Bạn có thể bắt đầu với bài viết trên Wikipedia về SMTP , nhưng bất kỳ tiến bộ nào nữa sẽ thực sự cần lập trình dựa trên máy chủ SMTP.


Tôi có thể sử dụng Tomcat làm máy chủ SMTP của mình không? Trợ giúp về cùng một sẽ được đánh giá cao. :)
CᴴᴀZ

3
@ChaZ từ đâu mà bạn có ý tưởng Tomcat sẽ là một máy chủ SMTP?
eis

6

Bạn cần một máy chủ SMTP để gửi thư. Có những máy chủ bạn có thể cài đặt cục bộ trên máy tính của mình hoặc bạn có thể sử dụng một trong nhiều máy chủ trực tuyến. Một trong những máy chủ được biết đến nhiều hơn là của Google:

Tôi vừa thử nghiệm thành công các cấu hình SMTP của Google được phép sử dụng ví dụ đầu tiên từ Simple Java Mail :

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

    // starting 5.0.0 do the following using the MailerBuilder instead...
    new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);
    new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);
    new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email);

Lưu ý các cổng và chiến lược vận chuyển khác nhau (xử lý tất cả các thuộc tính cần thiết cho bạn).

Thật kỳ lạ, Google cũng yêu cầu TLS trên cổng 25, mặc dù hướng dẫn của Google nói khác .


1
như tên gọi nói, nó là đơn giản
Kai Wang

4

Đã khá lâu kể từ khi điều này được đăng. Nhưng kể từ ngày 13 tháng 11 năm 2012, tôi có thể xác minh rằng cổng 465 vẫn hoạt động.

Tham khảo câu trả lời của GaryM trên diễn đàn này . Tôi hy vọng điều này sẽ giúp ít người hơn.

/*
* Created on Feb 21, 2005
*
*/

import java.security.Security;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class GoogleTest {

    private static final String SMTP_HOST_NAME = "smtp.gmail.com";
    private static final String SMTP_PORT = "465";
    private static final String emailMsgTxt = "Test Message Contents";
    private static final String emailSubjectTxt = "A test from gmail";
    private static final String emailFromAddress = "";
    private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
    private static final String[] sendTo = { "" };


    public static void main(String args[]) throws Exception {

        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

        new GoogleTest().sendSSLMessage(sendTo, emailSubjectTxt,
            emailMsgTxt, emailFromAddress);
        System.out.println("Sucessfully mail to All Users");
    }

    public void sendSSLMessage(String recipients[], String subject,
                               String message, String from) throws MessagingException {
        boolean debug = true;

        Properties props = new Properties();
        props.put("mail.smtp.host", SMTP_HOST_NAME);
        props.put("mail.smtp.auth", "true");
        props.put("mail.debug", "true");
        props.put("mail.smtp.port", SMTP_PORT);
        props.put("mail.smtp.socketFactory.port", SMTP_PORT);
        props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
        props.put("mail.smtp.socketFactory.fallback", "false");

        Session session = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("xxxxxx", "xxxxxx");
            }
        });

        session.setDebug(debug);

        Message msg = new MimeMessage(session);
        InternetAddress addressFrom = new InternetAddress(from);
        msg.setFrom(addressFrom);

        InternetAddress[] addressTo = new InternetAddress[recipients.length];
        for (int i = 0; i < recipients.length; i++) {
            addressTo[i] = new InternetAddress(recipients);
        }
        msg.setRecipients(Message.RecipientType.TO, addressTo);

        // Setting the Subject and Content Type
        msg.setSubject(subject);
        msg.setContent(message, "text/plain");
        Transport.send(msg);
    }
}

1
Mặc dù liên kết này có thể trả lời câu hỏi, nhưng tốt hơn hết bạn nên đưa các phần thiết yếu của câu trả lời vào đây và cung cấp liên kết để tham khảo. Các câu trả lời chỉ có liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. - Từ xét
swiftBoy

1
Đã thêm câu trả lời từ bài đăng.
Mukus

1
@Mukush Geat !! điều đó sẽ giúp ai đó trong tương lai.
swiftBoy

3

Đoạn mã sau hoạt động rất tốt. Hãy thử đây như một ứng dụng java với javamail-1.4.5.jar

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class MailSender
{
    final String senderEmailID = "typesendermailid@gmail.com";
    final String senderPassword = "typesenderpassword";
    final String emailSMTPserver = "smtp.gmail.com";
    final String emailServerPort = "465";
    String receiverEmailID = null;
    static String emailSubject = "Test Mail";
    static String emailBody = ":)";

    public MailSender(
            String receiverEmailID,
            String emailSubject,
            String emailBody
    ) {
        this.receiverEmailID=receiverEmailID;
        this.emailSubject=emailSubject;
        this.emailBody=emailBody;
        Properties props = new Properties();
        props.put("mail.smtp.user",senderEmailID);
        props.put("mail.smtp.host", emailSMTPserver);
        props.put("mail.smtp.port", emailServerPort);
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.socketFactory.port", emailServerPort);
        props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
        SecurityManager security = System.getSecurityManager();
        try {
            Authenticator auth = new SMTPAuthenticator();
            Session session = Session.getInstance(props, auth);
            MimeMessage msg = new MimeMessage(session);
            msg.setText(emailBody);
            msg.setSubject(emailSubject);
            msg.setFrom(new InternetAddress(senderEmailID));
            msg.addRecipient(Message.RecipientType.TO,
                    new InternetAddress(receiverEmailID));
            Transport.send(msg);
            System.out.println("Message send Successfully:)");
        }
        catch (Exception mex)
        {
            mex.printStackTrace();
        }
    }

    public class SMTPAuthenticator extends javax.mail.Authenticator
    {
        public PasswordAuthentication getPasswordAuthentication()
        {
            return new PasswordAuthentication(senderEmailID, senderPassword);
        }
    }

    public static void main(String[] args)
    {
        MailSender mailSender=new
            MailSender("typereceivermailid@gmail.com",emailSubject,emailBody);
    }
}

2

Mã này có hoạt động để gửi email không?

Chà, không, không phải là không thay đổi một số bộ phận vì bạn đang gặp lỗi. Bạn hiện đang cố gắng gửi thư qua máy chủ SMTP chạy trên máy chủ cục bộ nhưng do đó bạn không chạy bất kỳ thư nào ConnectException.

Giả sử mã là OK (tôi không thực sự kiểm tra), bạn sẽ phải chạy một máy chủ SMTP cục bộ hoặc sử dụng một máy chủ (từ xa) (từ ISP của bạn).

Về mã, bạn có thể tìm thấy các mẫu trong gói tải xuống JavaMail như được đề cập trong Câu hỏi thường gặp :

Tôi có thể tìm một số chương trình ví dụ hướng dẫn cách sử dụng JavaMail ở đâu?

H: Tôi có thể tìm một số chương trình ví dụ hướng dẫn cách sử dụng JavaMail ở đâu?
Đ: Có nhiều chương trình ví dụ được bao gồm trong gói tải xuống JavaMail , bao gồm các chương trình dòng lệnh đơn giản minh họa các khía cạnh khác nhau của API JavaMail, ứng dụng GUI dựa trên Swing, ứng dụng dựa trên servlet đơn giản và ứng dụng web hoàn chỉnh sử dụng các trang JSP và một thư viện thẻ.


Xin chào, máy chủ smtp thực sự là gì? Nó có được bao gồm và đóng gói trong máy chủ Email không? Hay chúng ta phải thiết lập smtp riêng biệt?
GMsoF

dovecot là một máy chủ SMTP. Hãy tự hỏi mình câu hỏi này: những gì phần mềm không chạy Google mà bạn đang gửi e-mail này để ? Họ đang chạy một số loại máy chủ smtp. Dovecot là tốt; dovecot và postfix cùng nhau thì tốt hơn. Tôi nghĩ rằng postfix là phần smtp và dovecot phần imap.
Thufir

2

Thử thứ này đi. Nó hoạt động tốt cho tôi. Đảm bảo rằng trước khi gửi email, bạn cần cấp quyền truy cập cho ứng dụng kém an toàn hơn trong tài khoản gmail của mình. Vì vậy, hãy truy cập liên kết sau và thử với mã java này.
Kích hoạt gmail cho ứng dụng kém an toàn hơn

Bạn cần nhập tệp javax.mail.jar và tệp kích hoạt.jar vào dự án của mình.

Đây là mã đầy đủ để gửi email trong java

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class SendEmail {

    final String senderEmail = "your email address";
    final String senderPassword = "your password";
    final String emailSMTPserver = "smtp.gmail.com";
    final String emailServerPort = "587";
    String receiverEmail = null;
    String emailSubject = null;
    String emailBody = null;

    public SendEmail(String receiverEmail, String Subject, String message) {
        this.receiverEmail = receiverEmail;
        this.emailSubject = Subject;
        this.emailBody = message;

        Properties props = new Properties();
        props.put("mail.smtp.user", senderEmail);
        props.put("mail.smtp.host", emailSMTPserver);
        props.put("mail.smtp.port", emailServerPort);
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.socketFactory.port", emailServerPort);
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

        SecurityManager security = System.getSecurityManager();

        try {
            Authenticator auth = new SMTPAuthenticator();
            Session session = Session.getInstance(props, auth);

            Message msg = new MimeMessage(session);
            msg.setText(emailBody);
            msg.setSubject(emailSubject);
            msg.setFrom(new InternetAddress(senderEmail));
            msg.addRecipient(Message.RecipientType.TO,
                    new InternetAddress(receiverEmail));
            Transport.send(msg);
            System.out.println("send successfully");
        } catch (Exception ex) {
            System.err.println("Error occurred while sending.!");
        }

    }

    private class SMTPAuthenticator extends javax.mail.Authenticator {

        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(senderEmail, senderPassword);
        }
    }

    public static void main(String[] args) {
        SendEmail send = new SendEmail("receiver email address", "subject", "message");
    }

}

2

Đây là giải pháp làm việc anh em. Nó được bảo đảm.

  1. Trước hết, hãy mở tài khoản gmail của bạn mà bạn muốn gửi thư, như trong trường hợp của bạn xyz@gmail.com
  2. Mở liên kết này bên dưới:

    https://support.google.com/accounts/answer/6010255?hl=vi

  3. Nhấp vào "Chuyển đến phần" Ứng dụng kém an toàn "trong Tài khoản của tôi." Lựa chọn
  4. Sau đó bật nó lên
  5. Đó là nó (:

Đây là mã của tôi:

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class SendEmail {

   final String senderEmailID = "Sender Email id";
final String senderPassword = "Sender Pass word";
final String emailSMTPserver = "smtp.gmail.com";
final String emailServerPort = "465";
String receiverEmailID = null;
static String emailSubject = "Test Mail";
static String emailBody = ":)";
public SendEmail(String receiverEmailID, String emailSubject, String emailBody)
{
this.receiverEmailID=receiverEmailID;
this.emailSubject=emailSubject;
this.emailBody=emailBody;
Properties props = new Properties();
props.put("mail.smtp.user",senderEmailID);
props.put("mail.smtp.host", emailSMTPserver);
props.put("mail.smtp.port", emailServerPort);
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.port", emailServerPort);
props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
SecurityManager security = System.getSecurityManager();
try
{
Authenticator auth = new SMTPAuthenticator();
Session session = Session.getInstance(props, auth);
MimeMessage msg = new MimeMessage(session);
msg.setText(emailBody);
msg.setSubject(emailSubject);
msg.setFrom(new InternetAddress(senderEmailID));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress(receiverEmailID));
Transport.send(msg);
System.out.println("Message send Successfully:)");
}
catch (Exception mex)
{
mex.printStackTrace();
}
}
public class SMTPAuthenticator extends javax.mail.Authenticator
{
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(senderEmailID, senderPassword);
}
}
    public static void main(String[] args) {
       SendEmail mailSender;
        mailSender = new SendEmail("Receiver Email id","Testing Code 2 example","Testing Code Body yess");
    }

}

Cảm ơn! Nó đã làm việc cho tôi! Tôi đã đi đến tùy chọn "Ứng dụng kém an toàn hơn" trong Tài khoản của tôi. "Và tạo mật khẩu cho MyApp sử dụng.
raikumardipak 13/1217

1

Tôi đã đưa lớp java trong gmail đang hoạt động của mình lên pastebin để bạn xem xét, đặc biệt chú ý đến phương thức "startSessionWithTLS" và bạn có thể điều chỉnh JavaMail để cung cấp chức năng tương tự. http://pastebin.com/VE8Mqkqp


có lẽ bạn cũng có thể cung cấp thêm một chút trong câu trả lời của mình?
Antti Haapala

1

Mã của bạn hoạt động, ngoài việc thiết lập kết nối với máy chủ SMTP. Bạn cần một máy chủ thư (SMTP) đang chạy để gửi email cho bạn.

Đây là mã đã sửa đổi của bạn. Tôi đã nhận xét những phần không cần thiết và đã thay đổi việc tạo Phiên để nó cần một Trình xác thực. Bây giờ chỉ cần tìm ra SMPT_HOSTNAME, USERNAME và MẬT KHẨU bạn muốn sử dụng (nhà cung cấp Internet của bạn thường cung cấp chúng).

Tôi luôn làm điều đó như thế này (sử dụng máy chủ SMTP từ xa mà tôi biết) vì chạy một máy chủ thư cục bộ không phải là chuyện nhỏ trong Windows (nó có vẻ khá dễ dàng trong Linux).

import java.util.*;

import javax.mail.*;
import javax.mail.internet.*;

//import javax.activation.*;

public class SendEmail {

    private static String SMPT_HOSTNAME = "";
    private static String USERNAME = "";
    private static String PASSWORD = "";

    public static void main(String[] args) {

        // Recipient's email ID needs to be mentioned.
        String to = "abcd@gmail.com";

        // Sender's email ID needs to be mentioned
        String from = "web@gmail.com";

        // Assuming you are sending email from localhost
        // String host = "localhost";

        // Get system properties
        Properties properties = System.getProperties();

        // Setup mail server
        properties.setProperty("mail.smtp.host", SMPT_HOSTNAME);

        // Get the default Session object.
        // Session session = Session.getDefaultInstance(properties);

        // create a session with an Authenticator
        Session session = Session.getInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USERNAME, PASSWORD);
            }
        });

        try {
            // Create a default MimeMessage object.
            MimeMessage message = new MimeMessage(session);

            // Set From: header field of the header.
            message.setFrom(new InternetAddress(from));

            // Set To: header field of the header.
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(
                    to));

            // Set Subject: header field
            message.setSubject("This is the Subject Line!");

            // Now set the actual message
            message.setText("This is actual message");

            // Send message
            Transport.send(message);
            System.out.println("Sent message successfully....");
        } catch (MessagingException mex) {
            mex.printStackTrace();
        }
    }
}

1

Thật vậy, 465 hoạt động và ngoại lệ mà bạn nhận được có thể là do cổng SMTP chưa mở 25. Theo mặc định, số cổng là 25. Tuy nhiên, bạn có thể định cấu hình nó bằng cách sử dụng tác nhân thư có sẵn dưới dạng mã nguồn mở - Mercury

Để đơn giản, chỉ cần sử dụng cấu hình sau và bạn sẽ ổn.

// Setup your mail server
props.put("mail.smtp.host", SMTP_HOST); 
props.put("mail.smtp.user",FROM_NAME);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.port", "25");
props.put("mail.debug", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.EnableSSL.enable","true");
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");  
props.setProperty("mail.smtp.socketFactory.fallback", "false");  
props.setProperty("mail.smtp.port", "465");  
props.setProperty("mail.smtp.socketFactory.port", "465");

Để biết thêm chi tiết: hãy xem ví dụ làm việc hoàn chỉnh từ đầu tại đây


1

Tôi cũng có ngoại lệ giống như bạn. Lý do cho điều này là không có và chạy máy chủ smpt trong máy của bạn (vì máy chủ của bạn là localhost). Nếu bạn sử dụng windows 7 nó không có máy chủ SMTP. vì vậy bạn sẽ phải tải xuống, cài đặt và cấu hình với miền và tạo tài khoản. Tôi đã sử dụng hmailserver làm máy chủ smtp được cài đặt và cấu hình trong máy cục bộ của tôi. https://www.hmailserver.com/download


-2

Bạn có thể tìm thấy một lớp java hoàn chỉnh và rất đơn giản để gửi email bằng tài khoản Google (gmail) tại đây,

Gửi email bằng java và tài khoản Google

Nó sử dụng các thuộc tính sau

Properties props = new Properties();
  props.put("mail.smtp.auth", "true");
  props.put("mail.smtp.starttls.enable", "true");
  props.put("mail.smtp.host", "smtp.gmail.com");
  props.put("mail.smtp.port", "587");

1
Lưu ý rằng câu trả lời chỉ có liên kết không được khuyến khích trên SO. Tốt hơn là nên đưa câu trả lời vào chính câu trả lời.
laalto
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.