Java kullanarak e-posta gönderin


112

Java kullanarak bir e-posta göndermeye çalışıyorum:

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();
      }
   }
}

Şu hatayı alıyorum:

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)

Bu kod e-posta göndermek için çalışacak mı?


11
Aynı makinede 25 numaralı bağlantı noktasını dinleyen bir SMTP sunucusu çalıştırıyor musunuz?
Jeff

Gmail aracılığıyla aktarmaya çalıştığınızı adreslerinize göre varsayacağım. Bu doğruysa, kullanabileceğiniz bazı kodlara sahip olabilirim. İşte bir ipucu, TLS'ye ihtiyacınız var
Paul Gregoire

@Mondain Birkaç kod yazabilirseniz yardımcı olacaktır. Gmail kullanarak geçiş yapmak istiyorum
Mohit Bansal

Aşağıdaki cevabımla bağlantılı, tek yakalama, JavaMail kitaplığını kullanmamasıdır. İsterseniz size tam kaynağı gönderebilirim.
Paul Gregoire

Yanıtlar:


98

Aşağıdaki kod, Google SMTP sunucusuyla çok iyi çalışır. Google kullanıcı adınızı ve şifrenizi sağlamanız gerekiyor.

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();
    }
}

11 Aralık 2015 ile ilgili güncelleme

Kullanıcı adı + şifre artık önerilen bir çözüm değil. Bunun nedeni

Bunu denedim ve Gmail, bu kodda kullanıcı adı olarak kullanılan e-postayı, kısa süre önce Google Hesabınızda bir oturum açma girişimini engellediğimizi belirten bir e-posta gönderdi ve beni şu destek sayfasına yönlendirdi: support.google.com/accounts/answer/6010255 bu yüzden çalışıp çalışmadığını arar, göndermek için kullanılan e-posta hesabının kendi güvenliklerini

Google, Gmail API'yi yayınladı - https://developers.google.com/gmail/api/?hl=en . Kullanıcı adı + şifre yerine oAuth2 yöntemini kullanmalıyız.

İşte Gmail API ile çalışacak kod pasajı.

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();
    }
}

OAuth2 aracılığıyla yetkili bir Gmail hizmeti oluşturmak için, işte kod pasajı.

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;        
    }
}

OAuth2 kimlik doğrulamasının kullanıcı dostu bir yolunu sağlamak için, aşağıdaki giriş iletişim kutusunu görüntülemek için JavaFX'i kullandım

görüntü açıklamasını buraya girin

Kullanıcı dostu oAuth2 iletişim kutusunu görüntüleme anahtarı MyAuthorizationCodeInstalledApp.java ve SimpleSwingBrowser.java'da bulunabilir.


Hata Alınıyor: "main" iş parçacığında istisna javax.mail.MessagingException: SMTP ana bilgisayarına bağlanılamadı: smtp.gmail.com, bağlantı noktası: 465; iç içe geçmiş istisna: java.net.ConnectException: Bağlantı zaman aşımına uğradı: com.sun.mail.smtp.SMTPTransport.openServer (SMTPTransport.java:1706)
Mohit Bansal

1
Smtp.gmail.com'a ping atarsanız, herhangi bir yanıt alıyor musunuz?
Cheok Yan Cheng

Daha önce de söylediğim gibi STMP'de yeniyim ve smtp.gmail.com'a nasıl ping atacağımı bilmiyorum.
Mohit Bansal

2
Komut isteminize 'ping smtp.gmail.com' yazın ve enter tuşuna basın.
Cheok Yan Cheng

12
Bunun Sendyerine yöntemlerin çağrılması hoşuma gitmiyor sendama kullanışlı bir sınıf. Gmail şifresini kodda saklamanın güvenlik sonuçları hakkında herhangi bir fikriniz var mı?
Simon Forsberg

48

Aşağıdaki kod benim için çalıştı.

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
Devre dışı bırakılmış 2 faktörlü kimlik doğrulamasına sahip bir hesapta çalıştı. Bu çözüm yerel olduğu ve güneş paketlerine gerek olmadığı için harika.
AlikElzin-kilaka

Bu kodu kullanmak için, gönderilecek e-postanın bir gmail hesabı olması gerekir?
Erick

3
Kod benim için çalıştı ama ilk yapmam gereken bu ve "daha az güvenli uygulamalar için Erişim" açmak

@ user4966430 Kabul Edildi! ve teşekkürler!
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 );
    }
}
}

Gerekli jar dosyaları

Buraya tıklayın - Harici Kavanozlar nasıl eklenir


11

Kısa cevap - Hayır.

Uzun cevap - hayır, çünkü kod yerel makinede çalışan bir SMTP sunucusunun varlığına ve 25 numaralı bağlantı noktasında dinlemeye dayandığından. SMTP sunucusu (teknik olarak MTA veya Posta Aktarım Aracısı) Posta Kullanıcı Aracısı ile iletişimden sorumludur. (MUA, bu durumda Java işlemidir) giden e-postaları almak için.

Şimdi, MTA'lar tipik olarak belirli bir alan adındaki kullanıcılardan posta almaktan sorumludur. Dolayısıyla, gmail.com etki alanı için, posta kullanıcı aracılarının kimliğinin doğrulanmasından ve dolayısıyla postaların GMail sunucularındaki gelen kutularına aktarılmasından Google posta sunucuları sorumlu olacaktır. GMail'in açık posta geçiş sunucularına güvenip güvenmediğinden emin değilim, ancak Google adına kimlik doğrulaması yapmak ve ardından postayı GMail sunucularına aktarmak kesinlikle kolay bir iş değildir.

GMail'e erişmek için JavaMail kullanımıyla ilgili JavaMail SSS bölümünü okursanız, ana bilgisayar adı ve bağlantı noktasının GMail sunucularını işaret ettiğini ve kesinlikle yerel ana bilgisayarı işaret etmediğini fark edeceksiniz. Yerel makinenizi kullanmayı düşünüyorsanız, aktarma veya yönlendirme yapmanız gerekir.

SMTP söz konusu olduğunda herhangi bir yere ulaşmayı düşünüyorsanız, muhtemelen SMTP protokolünü derinlemesine anlamanız gerekecektir. SMTP hakkındaki Wikipedia makalesiyle başlayabilirsiniz , ancak daha fazla ilerleme, aslında bir SMTP sunucusuna karşı programlamayı gerektirecektir.


Tomcat'i SMTP sunucum olarak kullanabilir miyim? Aynı konuda yardım memnuniyetle karşılanacaktır. :)
CᴴᴀZ

3
@ChaZ, Tomcat'in bir SMTP sunucusu olacağı fikrini nereden aldınız?
eis

6

Postaları göndermek için bir SMTP sunucusuna ihtiyacınız var. Kendi bilgisayarınıza yerel olarak kurabileceğiniz sunucular vardır veya birçok çevrimiçi sunucudan birini kullanabilirsiniz. Daha bilinen sunuculardan biri Google'ın şudur:

Basit Java Mail'deki ilk örneği kullanarak izin verilen Google SMTP yapılandırmalarını başarıyla test ettim :

    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);

Çeşitli bağlantı noktalarına ve taşıma stratejilerine dikkat edin (sizin için gerekli tüm özellikleri ele alan).

Merakla, Google'ın talimatları aksini söylese de, Google, 25 numaralı bağlantı noktasında da TLS istemektedir .


1
adından da anlaşılacağı gibi, bu çok basit
Kai Wang

4

Bunun yayınlanmasından bu yana epey zaman geçti. Ancak 13 Kasım 2012 itibarıyla 465 numaralı bağlantı noktasının hala çalıştığını doğrulayabilirim.

GaryM'nin bu forumdaki cevabına bakın . Umarım bu birkaç kişiye daha yardımcı olur.

/*
* 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
Bu bağlantı soruyu cevaplayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak daha iyidir. Bağlantılı sayfa değişirse, yalnızca bağlantı yanıtları geçersiz hale gelebilir. - Yorumdan
swiftBoy

1
Gönderideki cevabı eklendi.
Mukus

1
@Mukush Geat !! bu gelecekte birine yardım edecek.
swiftBoy

3

Aşağıdaki kod çok iyi çalışıyor. Javamail-1.4.5.jar ile bir java uygulaması olarak deneyin

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

Bu kod e-posta göndermek için çalışacak mı?

Şey, hayır, bir hata aldığınız için bazı kısımları değiştirmeden olmaz. Şu anda localhost üzerinde çalışan bir SMTP sunucusu aracılığıyla posta göndermeye çalışıyorsunuz, ancak herhangi bir şekilde çalıştırmıyorsunuz ConnectException.

Kodun iyi olduğunu varsayarsak (gerçekten kontrol etmedim), ya yerel bir SMTP sunucusu çalıştırmanız ya da (ISS'nizden) (uzak) bir sunucu kullanmanız gerekir.

Kodla ilgili olarak, SSS'de belirtildiği gibi JavaMail indirme paketinde örnekler bulabilirsiniz :

JavaMail'in nasıl kullanılacağını gösteren bazı örnek programları nerede bulabilirim?

S: JavaMail'in nasıl kullanılacağını gösteren bazı örnek programları nerede bulabilirim?
C: JavaMail indirme paketinde , JavaMail API'sinin çeşitli yönlerini gösteren basit komut satırı programları, Swing tabanlı bir GUI uygulaması, basit bir servlet tabanlı uygulama ve JSP sayfalarını kullanan eksiksiz bir web uygulaması dahil olmak üzere birçok örnek program vardır ve bir etiket kitaplığı.


Merhaba, aslında bir smtp sunucusu nedir? E-posta sunucusuna dahil mi ve paketlenmiş mi? Yoksa smtp'yi ayrı ayrı mı kurmamız gerekiyor?
GMsoF

dovecot bir SMTP sunucusudur. Kendinize şu soruyu sorun: hangi yazılımı bu e-posta gönderiyorsanız o Google koşmak yapar için ? Bir çeşit smtp sunucusu çalıştırıyorlar. Dovecot iyidir; dovecot ve postfix birlikte daha iyidir. Postfix'in smtp kısmı olduğunu ve imap kısmını dovecot olduğunu düşünüyorum.
Thufir

2

Bunu deneyin. benim için iyi çalışıyor. E-posta göndermeden önce, gmail hesabınızda daha az güvenli uygulamaya erişim izni vermeniz gerektiğinden emin olun. Bu nedenle aşağıdaki bağlantıya gidin ve bu java kodunu deneyin.
Daha az güvenli uygulama için Gmail'i etkinleştirin

Javax.mail.jar dosyasını ve activation.jar dosyasını projenize aktarmanız gerekiyor.

Bu, java'da e-posta göndermek için tam koddur

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

İşte çalışan çözüm kardeşim. Garantili.

  1. Öncelikle, sizin durumunuzda olduğu gibi, posta göndermek istediğiniz gmail hesabınızı açın xyz@gmail.com
  2. Aşağıdaki bu bağlantıyı açın:

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

  3. Hesabım'da "Daha az güvenli uygulamalar" bölümüne git "i tıklayın. seçenek
  4. O zaman aç
  5. Bu kadar (:

İşte kodum:

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");
    }

}

Teşekkürler! Benim için çalıştı! Hesabımdaki "Daha az güvenli uygulamalar" seçeneğine gittim ve Uygulamamın kullanması için bir şifre oluşturdum.
raikumardipak

1

İncelemeniz için çalışan gmail java sınıfımı pastebin'e koydum, "startSessionWithTLS" yöntemine özellikle dikkat edin ve aynı işlevselliği sağlamak için JavaMail'i ayarlayabilirsiniz. http://pastebin.com/VE8Mqkqp


belki cevabınızda biraz daha fazla bilgi verebilir misiniz?
Antti Haapala

1

Kodunuz, SMTP sunucusuyla bağlantı kurmanın dışında çalışır. Size e-posta göndermek için çalışan bir posta (SMTP) sunucusuna ihtiyacınız var.

İşte değiştirilmiş kodunuz. İhtiyaç duyulmayan kısımları yorumladım ve Oturum oluşturma işlemini bir Authenticator gerektirecek şekilde değiştirdim. Şimdi sadece kullanmak istediğiniz SMPT_HOSTNAME, USERNAME ve PASSWORD bilgilerini bulun (İnternet sağlayıcınız genellikle bunları sağlar).

Bunu her zaman böyle yapıyorum (bildiğim uzak bir SMTP sunucusu kullanarak) çünkü yerel bir posta sunucusu çalıştırmak Windows altında o kadar da önemsiz değil (görünüşe göre Linux altında oldukça kolay).

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

Aslında 465 çalışıyor ve aldığınız istisna, açık olmayan SMTP bağlantı noktası 25'ten kaynaklanıyor olabilir. Varsayılan olarak bağlantı noktası numarası 25'tir. Yine de, açık kaynak olarak bulunan posta aracısını kullanarak yapılandırabilirsiniz - Mercury

Basit olması için aşağıdaki yapılandırmayı kullanın ve sorun olmayacak.

// 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");

Daha da fazlası için: eksiksiz çalışma örneğini buradan inceleyin


1

Sizinle aynı istisnaya sahibim. Bunun nedeni, makinenizde smpt sunucusunun kurulmaması ve çalıştırılmamasıdır (çünkü ana bilgisayarınız localhost'tur). Windows 7 kullanıyorsanız, SMTP sunucusu yoktur. bu yüzden domain ile indirmeniz, kurmanız, yapılandırmanız ve hesap oluşturmanız gerekecek. hmailserver'ı smtp sunucusu olarak kullandım ve yerel makinemde konfigüre ettim. https://www.hmailserver.com/download


-2

Google (gmail) hesabını kullanarak e-posta göndermek için eksiksiz ve çok basit bir java sınıfı bulabilirsiniz burada,

Java ve Google hesabı kullanarak e-posta gönderin

Aşağıdaki özellikleri kullanır

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
SO'da yalnızca bağlantı yanıtlarının tavsiye edilmediğini unutmayın. Cevabı cevaba dahil etmek daha iyidir.
laalto
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.