繁体   English   中英

无法通过邮件发送附件

[英]Failed to send attachment as mail

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

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行。 有人可以解释为什么我遇到此错误。

如果我尝试发送一个附件,则使用此代码可以正常工作。 尝试将其与您所拥有的相匹配。 似乎在设置中存在一些缺陷。 尽管我使用的是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 );
    }
}

从此JavaMail FAQ条目开始, 以调试连接问题

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

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

java.net.SocketException:连接重置

此错误意味着服务器将断开连接,而不是客户端。 我想这是在您发送太大附件时发生的。 不幸的是,这是服务器端的问题,您不能在客户端解决。 尝试以某种方式减小附件大小(将其压缩或使用其他报告格式)。 也许最好发送直接下载链接,而不是完整报告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM