Transport.send (сообщение) не работает в приведенном ниже коде .. netbeans застревает в работающей части.это не происходит дальше .. оно висит там навсегда - PullRequest
6 голосов
/ 18 января 2012

Я попытался написать код для отправки электронной почты с использованием Java. Но этот код не работает. Когда код выполняется, он застревает в transport.send (сообщение). Он застрял там навсегда. Также я не уверен, что остальная часть кода верна или нет.

  //first from, to, subject, & text values are set
    public class SendMail {
    private String from;
    private String to;
    private String subject;
    private String text;


    public SendMail(String from, String to, String subject, String text){
        this.from = from;
        this.to = to;
        this.subject = subject;
        this.text = text;
    }

    //send method is called in the end 
    public void send(){

        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "465");

        Session mailSession = Session.getDefaultInstance(props);
        Message simpleMessage = new MimeMessage(mailSession);

        InternetAddress fromAddress = null;
        InternetAddress toAddress = null;
        try {
            fromAddress = new InternetAddress(from);
            toAddress = new InternetAddress(to);
        } catch (AddressException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            simpleMessage.setFrom(fromAddress);
            simpleMessage.setRecipient(RecipientType.TO, toAddress);
            simpleMessage.setSubject(subject);
                    simpleMessage.setText(text);
            Transport.send(simpleMessage);  // this is where code hangs     
        } catch (MessagingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
    }
}

Ответы [ 7 ]

10 голосов
/ 15 марта 2013

Я столкнулся с точно такой же проблемой, и другие сообщили о периодических сбоях.Причина в том, что Transport.send с SMTP имеет два бесконечных тайм-аута, которые могут привести к зависанию вашего процесса!

Из документации SUN:

mail.smtp.connectiontimeout int Значение времени ожидания соединения сокета в миллисекундах. По умолчанию задано бесконечное время ожидания.

mail.smtp.timeout int Значение тайм-аута ввода-вывода в миллисекундах. По умолчанию задано бесконечное время ожидания.

Чтобы не «зависать» вечно, вы можете установить их явно:

Из СОЛНЦА: свойства всегда задаются как строки;столбец Тип описывает, как строка интерпретируется.Например, используйте

    props.put("mail.smtp.port", "888");

Обратите внимание, что если вы используете протокол «smtps» для доступа к SMTP через SSL, все свойства будут называться «mail.smtps. *».

Таким образом, если вы установите два тайм-аута, вы должны получить «MessagingException», который вы можете обрабатывать с помощью try / catch, а не просто зависать.

Предполагая, что вы используете smtp, добавьте следующее, где t1 и t2 - ваши тайм-ауты в мс:

    props.put("mail.smtp.connectiontimeout", "t1");
    props.put("mail.smtp.timeout", "t2");

Конечно, это не устранит основную причину для тайм-аутов,но это позволит вам изящно справиться с проблемами.

Благодаря посту Зигфрида Гешла на Apache Commons

PS: Основная причина проблемы, с которой я столкнулся, связана с сетевым подключением, которое я использовал во время путешествия.Очевидно, соединение вызывало тайм-аут SMTP, которого у меня не было ни с какими другими соединениями.

2 голосов
/ 18 января 2012

Замените Session.getDefaultInstance на Session.getInstance.

Если это не решит проблему, прочтите FAQ по JavaMail, в котором есть советы по отладке.

0 голосов
/ 19 июня 2018

У меня была точно такая же проблема. Мне потребовалось несколько часов, чтобы найти источник проблемы. Я использовал неправильную комбинацию зависимости / зависимости ...

     <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>javax.mail-api</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.5.3</version>
    </dependency>

Изменение его на ...

     <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>javax.mail-api</artifactId>
        <version>1.5.3</version>
    </dependency>
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.5.3</version>
    </dependency>

... решил проблему.

0 голосов
/ 28 ноября 2016

Когда вы объявляете Transport.send(), это не будет работать, используйте это вместо transport.sendMessage(message, message.getAllRecipients());, а также объявите объект javax.mail.Transport transport = session.getTransport("smtp");, как показано в коде.

       javax.mail.Transport transport = session.getTransport("smtp");
 transport.sendMessage(message,message.getAllRecipients());

, тогда следующий код будет выглядеть следующим образомСпасибо, надеюсь, это будет отлично работать

package org.java.vamsi;
//import javax.activation.*;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;
//import java.io.*;
//import javax.mail.internet.*;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.mail.Message.RecipientType;
//import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;

//import java.io.*;
//import java.util.*;
//import javax.servlet.*;
//import javax.servlet.http.*;
//import javax.mail.*;
//import javax.mail.internet.*;
//import javax.activation.*;



//import sun.rmi.transport.Transport;

public class SendEmail extends HttpServlet {
    private static final long serialVersionUID = 1L;

        public void doGet(HttpServletRequest request,
                HttpServletResponse response)
        throws ServletException, IOException
{
  // Recipient's email ID needs to be mentioned.
  String to = "mysore.vamsikrishna@gmail.com";

  // Sender's email ID needs to be mentioned
  String from = "mysore.vamsikrishna007@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);

  // Set response content type
  response.setContentType("text/html");
  PrintWriter out = response.getWriter();

  try{
      javax.mail.Transport transport = session.getTransport("smtp");
     // 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(RecipientType.TO,
                              new InternetAddress(to));//as we are importing the "javax.mail.Message.RecipientType"
     //we have to not set the type as this 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.sendMessage(message,
             message.getAllRecipients());
     String title = "Send Email";
     String res = "Sent message successfully....";
     String docType =
     "<!doctype html public \"-//w3c//dtd html 4.0 " +
     "transitional//en\">\n";
     out.println(docType +
     "<html>\n" +
     "<head><title>" + title + "</title></head>\n" +
     "<body bgcolor=\"#f0f0f0\">\n" +
     "<h1 align=\"center\">" + title + "</h1>\n" +
     "<p align=\"center\">" + res + "</p>\n" +
     "</body></html>");
  }catch (MessagingException mex) {
     mex.printStackTrace();
  }
}           
    }
0 голосов
/ 12 ноября 2014
  1. Отключить все антивирусные программы.
  2. Отключить брандмауэр.

Затем попытайтесь, если вам это удастся, продолжайте расследование, чтобы найти виновного.

В моем случае это был Антивирус, и мне пришлось сделать исключение для исходящей почты на SMTP для успешной отправки почты.

0 голосов
/ 02 октября 2013

Была такая же проблема.Вы должны закрыть транспорт в блоке захвата.Причина, по которой код зависает, заключается в том, что подключение к серверу SMTP никогда не прерывается на стороне клиента, если вы не сделаете это вручную.

    try {
        simpleMessage.setFrom(fromAddress);
        simpleMessage.setRecipient(RecipientType.TO, toAddress);
        simpleMessage.setSubject(subject);
                simpleMessage.setText(text);
        Transport.send(simpleMessage);  // this is where code hangs     
    } catch (MessagingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Transport.close()
    } 

Но самый эффективный способ убедиться, что javamail правильно завершает работу, - это объединить логику javamail в один блок try и закрыть транспорт в блоке finally.Попробуй это. [РЕДАКТИРОВАТЬ] После предупреждения о том, что вышеприведенный код не работает, код корректно компилируется.

import java.util.Properties;

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

//first from, to, subject, & text values are set

public class SendMail {
    private String from;
    private String to;
    private String subject;
    private String text;

    public SendMail(String from, String to, String subject, String text) {
            this.from = from;
            this.to = to;
        this.subject = subject;
            this.text = text;
    }

    // send method is called in the end
    public void send() throws MessagingException {

        Properties props = new Properties();
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.host", "localhost");
    props.put("mail.smtp.auth", "false");// set to false for no username
    props.put("mail.debug", "false");
    props.put("mail.smtp.port", "25");

    Session session = Session.getDefaultInstance(props);

    InternetAddress fromAddress = null;
    InternetAddress toAddress = null;
    Transport transport = session.getTransport("smtp");
    transport.connect();
    try {
        Message simpleMessage = new MimeMessage(session);
        fromAddress = new InternetAddress(from);
        toAddress = new InternetAddress(to);
        simpleMessage.setFrom(fromAddress);
        simpleMessage.setRecipient(RecipientType.TO, toAddress);
        simpleMessage.setSubject(subject);
        simpleMessage.setText(text);
        transport.sendMessage(simpleMessage,
                simpleMessage.getAllRecipients());
    } catch (MessagingException e) {
        e.printStackTrace();
    } finally {
        transport.close();
    }
     }
 }
0 голосов
/ 18 января 2012

Пожалуйста, попробуйте это,

    public class SMTPDemo {

  public static void main(String args[]) throws IOException,
      UnknownHostException {
    String msgFile = "file.txt";
    String from = "java2s@java2s.com";
    String to = "yourEmail@yourServer.com";
    String mailHost = "yourHost";
    SMTP mail = new SMTP(mailHost);
    if (mail != null) {
      if (mail.send(new FileReader(msgFile), from, to)) {
        System.out.println("Mail sent.");
      } else {
        System.out.println("Connect to SMTP server failed!");
      }
    }
    System.out.println("Done.");
  }

  static class SMTP {
    private final static int SMTP_PORT = 25;

    InetAddress mailHost;

    InetAddress localhost;

    BufferedReader in;

    PrintWriter out;

    public SMTP(String host) throws UnknownHostException {
      mailHost = InetAddress.getByName(host);
      localhost = InetAddress.getLocalHost();
      System.out.println("mailhost = " + mailHost);
      System.out.println("localhost= " + localhost);
      System.out.println("SMTP constructor done\n");
    }

    public boolean send(FileReader msgFileReader, String from, String to)
        throws IOException {
      Socket smtpPipe;
      InputStream inn;
      OutputStream outt;
      BufferedReader msg;
      msg = new BufferedReader(msgFileReader);
      smtpPipe = new Socket(mailHost, SMTP_PORT);
      if (smtpPipe == null) {
        return false;
      }
      inn = smtpPipe.getInputStream();
      outt = smtpPipe.getOutputStream();
      in = new BufferedReader(new InputStreamReader(inn));
      out = new PrintWriter(new OutputStreamWriter(outt), true);
      if (inn == null || outt == null) {
        System.out.println("Failed to open streams to socket.");
        return false;
      }
      String initialID = in.readLine();
      System.out.println(initialID);
      System.out.println("HELO " + localhost.getHostName());
      out.println("HELO " + localhost.getHostName());
      String welcome = in.readLine();
      System.out.println(welcome);
      System.out.println("MAIL From:<" + from + ">");
      out.println("MAIL From:<" + from + ">");
      String senderOK = in.readLine();
      System.out.println(senderOK);
      System.out.println("RCPT TO:<" + to + ">");
      out.println("RCPT TO:<" + to + ">");
      String recipientOK = in.readLine();
      System.out.println(recipientOK);
      System.out.println("DATA");
      out.println("DATA");
      String line;
      while ((line = msg.readLine()) != null) {
        out.println(line);
      }
      System.out.println(".");
      out.println(".");
      String acceptedOK = in.readLine();
      System.out.println(acceptedOK);
      System.out.println("QUIT");
      out.println("QUIT");
      return true;
    }
  }
}
...