无法将附件作为邮件发送

时间:2015-03-06 11:55:08

标签: java javamail

我正在尝试通过电子邮件发送一些生成的报告,但我收到以下异常

javax.mail.MessagingException: Exception reading response;
  nested exception is:
        java.net.SocketException: Connection reset
        at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:1764)
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1523)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:453)
        at javax.mail.Service.connect(Service.java:291)
        at javax.mail.Service.connect(Service.java:172)
        at javax.mail.Service.connect(Service.java:121)
        at javax.mail.Transport.send0(Transport.java:190)
        at javax.mail.Transport.send(Transport.java:120)
        at centina.sa.server.system.SystemManager$6$1.call(SystemManager.java:1872)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)
Caused by: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:106)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
        at com.sun.mail.util.LineInputStream.readLine(LineInputStream.java:84)
        at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:1742)

代码:

MimeBodyPart att = new MimeBodyPart();
FileDataSource fileData = new FileDataSource( attachment ){
    public String getContentType(){
        return "application/octet-stream";
    }
};
att.setDataHandler(  new DataHandler( fileData ));

我收到了att.setDataHandler行的错误,它是系统管理员的第1872行。有人可以解释为什么我会收到这个错误。

3 个答案:

答案 0 :(得分:0)

如果,我尝试发送一个附件,那么它正常工作,使用此代码。尝试将它与你拥有的东西相匹配。似乎设置中存在一些缺陷。虽然我正在使用gmail的服务器,但是要使用此程序发送邮件。

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

public class SendMailExample {

    private String from;
    private String to;
    private String subject;
    private String messageBody;
    private String fileName;
    private String host;

    private Properties properties;

    private MimeMessage message;
    private BodyPart messageBodyPart;
    private Multipart multipart;

    private Authenticator authenticator;

    public SendMailExample () {
        from = "sender@gmail.com";
        to = "recipient@gmail.com";
        subject = "Subject Testing";
        messageBody = "<html><body><h1>HAVE FAITH, AND STAY" +
                    " CALM :-) I AM WITH YOU, OKAY :-)</h1></body></html>";
        fileName = "Test.txt";
        host = "smtp.gmail.com";

        authenticator = new SMTPAuthenticator ();
        properties = System.getProperties ();
        properties.put ( "mail.smtp.host", host );
        properties.put ( "mail.smtp.starttls.enable", "true" );
        properties.put ( "mail.smtp.port", "587" );
        properties.put ( "mail.smtp.auth", "true" );
    }

    private void sendMail ( String from, String to,
                    String subject, String messageBody, String fileName ) {
        try {
            Session session = Session.getDefaultInstance ( properties, authenticator );
            message = new MimeMessage ( session );
            message.setFrom ( new InternetAddress ( from ) );
            message.addRecipient ( Message.RecipientType.TO,
                                new InternetAddress ( to ) );
            message.setSubject ( subject );

            multipart = new MimeMultipart ();
            messageBodyPart = new MimeBodyPart ();
            messageBodyPart.setContent ( messageBody, "text/html" );
            multipart.addBodyPart ( messageBodyPart );

            messageBodyPart = new MimeBodyPart ();
            DataSource source = new FileDataSource ( fileName );
            messageBodyPart.setDataHandler ( new DataHandler ( source ) );
            messageBodyPart.setFileName ( fileName );
            multipart.addBodyPart ( messageBodyPart );

            message.setContent ( multipart );

            Transport.send ( message );
            System.out.println ( "Message send successfully...." );
        } catch ( Exception me ) {
            me.printStackTrace ();
        }
    } 

    private void performTask () {
        sendMail ( from, to, subject, messageBody, fileName );
    }

    public static void main ( String[] args ) {
        new SendMailExample ().performTask ();
    }
}

/**
  * SimpleAuthenticator is used to do simple authentication
  * when the SMTP server requires it.
  */

class SMTPAuthenticator extends Authenticator {

    private static final String SMTP_AUTH_USER = "myemail@gmail.com";
    private static final String SMTP_AUTH_PASSWORD = "password";

    public PasswordAuthentication getPasswordAuthentication () {
        String username = SMTP_AUTH_USER;
        String password = SMTP_AUTH_PASSWORD;

        return new PasswordAuthentication( username,  password );
    }
}

答案 1 :(得分:0)

从这个JavaMail FAQ entry for debugging connection problems开始。

您很可能有防火墙或防病毒程序阻止您连接。

答案 2 :(得分:0)

如果您发送带有小附件的信件,则问题不在您的代码中。

  

java.net.SocketException:连接重置

此错误意味着服务器断开连接,而不是客户端。我想当你发送太大的附件时会发生这种情况。不幸的是,这是服务器端问题,你无法在客户端解决它。尝试以某种方式减少附件大小(压缩或使用不同的报告格式)。也许会更好的发送直接下载链接,而不是完整的报告。