发送电子邮件Java时的例外情况

时间:2013-09-30 10:30:12

标签: java email exception

我在发送电子邮件时遇到异常问题。这是我的代码

public static void sendEmail(String email, String subjectBody, String srcAndFile) throws Exception {
    System.out.println(srcAndFile);

    try {
        logger.debug("sending email to: " + email + "with attached file: " + srcAndFile);

        Properties props = System.getProperties();
        props.put("mail.smtp.host", address);
        props.put("mail.smtp.port", "25");
        props.put("mail.smtp.auth", "false");

        Session session_m = Session.getDefaultInstance(props, null);
        MimeMessage message = new MimeMessage(session_m);
        message.setFrom (new InternetAddress(sender, sender));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
        message.setSubject(subjectBody);
        message.setText("Hi");
        message.setHeader("Content-Type","text/plain;charset=windows-1251");

        Multipart multiPart = new MimeMultipart();
        MimeBodyPart messageText = new MimeBodyPart();
        messageText.setContent(subjectBody, "text/plain");
        multiPart.addBodyPart(messageText);

        MimeBodyPart rarAttachment = new MimeBodyPart();
        File f = new File(srcAndFile);
        FileDataSource rarFile = new FileDataSource(f);
        rarAttachment.setDataHandler(new DataHandler(rarFile));
        rarAttachment.setFileName(rarFile.getName());
        multiPart.addBodyPart(rarAttachment);

        message.setContent(multiPart);

        SMTPTransport t = (SMTPTransport)session_m.getTransport("smtp");
        t.connect(addrress, sender, null);
        t.sendMessage(message, message.getAllRecipients());
        success = true;

        } catch (AddressException e) {
            logger.error(e.getMessage());
            throw new AddressException("[sendEmail]: Incorrect email address");

        } catch (MessagingException e) {
            logger.error(e.getMessage());
            throw new MessagingException("[sendEmail]: Unable to send email");

        } catch (IOException e) {
            logger.error(e.getMessage());
            throw new IOException("[sendEmail]: Unable to find file to attach");

        } catch (Exception e) {
            logger.error(e.getMessage());
            DBWrapper.processStatusDB("[sendEmail]","failed",e.getMessage());
            throw  new Exception("[sendEmail]: Error in method " + e.getMessage());
        }
        DBWrapper.processStatusDB("[sendEmail]","finished","process to send an email with " + FileManager.getFile(srcAndFile) + " has finished properly");


}

现在,当我想捕捉到一些错误时,就会出现问题:

  1. 地址无效

  2. 无法连接到服务器

  3. 这两种情况都被捕获(MessagingException e)。有没有办法在不同的例外中拆分它们。

    问题是如果接收方的电子邮件地址无效,我的程序应该继续与其他收件人。但是如果程序无法连接到邮件服务器,那么程序应该终止。但就我而言,即使电子邮件地址无效,它也会终止。由于(MessagingException e)抛出错误,如代码所示。

    是否有其他例外可以捕获无效电子邮件地址? (AddressException e)没有捕获无效电子邮件的错误。

    谢谢。

3 个答案:

答案 0 :(得分:0)

我觉得,最好在尝试发送邮件之前验证邮件地址。这是您知道的,甚至可以在异常发生之前纠正它。无法访问的邮件服务器是您可以预期的一个例外,因此可以捕获它并进行后期处理。

答案 1 :(得分:0)

您可以使用SendFailedException。摘自文档

  

无法发送邮件时抛出此异常。

     

例外包括消息无法解析的地址   发送以及发送消息的有效地址   和未发送邮件的有效地址。

答案 2 :(得分:0)

几天前我遇到了同样的问题。尝试使用

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

而不是

Session session_m = Session.getDefaultInstance(props, null);

同时重新检查您的端口号。