在java中,如何使用sendmail发送电子邮件?

在java中,如何使用sendmail发送电子邮件?,java,bash,sendmail,Java,Bash,Sendmail,我需要在bash中使用sendmail来用Java发送电子邮件。由于配置重复,我无法使用javamail package fr.thales.edf.reportEmailAcrAcq.email; import java.io.IOException; import org.apache.log4j.Level; import org.apache.log4j.Logger; public class SendHTMLEmail {

我需要在bash中使用sendmail来用Java发送电子邮件。由于配置重复,我无法使用javamail

    package fr.thales.edf.reportEmailAcrAcq.email;

    import java.io.IOException;

    import org.apache.log4j.Level;
    import org.apache.log4j.Logger;

    public class SendHTMLEmail {
        private static final String SENDMAIL = "sendmail -R hdrs -N never -t -v <         ";
        private static final Logger LOGGER = Logger.getLogger(SendHTMLEmail.class
                .getName());

        private String fileName;

        public SendHTMLEmail(String fileName) {
            this.fileName = fileName;
        }

        public void sendMail() {
            String command = SENDMAIL + fileName;
            try {
                Runtime r = Runtime.getRuntime();
                LOGGER.log(Level.INFO, "Envoi de la commande: " + command);
                Process p = r.exec(command);
                p.waitFor();
                LOGGER.log(Level.INFO,
                        "Résultat de l'envoi de l'e-mail : " + p.getOutputStream());
            } catch (InterruptedException ex) {
                LOGGER.log(Level.FATAL, ex.getMessage());
            } catch (IOException ex) {
                LOGGER.log(Level.FATAL, ex.getMessage());
            }
        }
    }
文件包fr.thales.edf.reportEmailAcrAcq.email;
导入java.io.IOException;
导入org.apache.log4j.Level;
导入org.apache.log4j.Logger;
公共类SendHTMLEmail{
私有静态最终字符串SENDMAIL=“SENDMAIL-R hdrs-N never-t-v<”;
私有静态最终记录器Logger=Logger.getLogger(SendHTMLEmail.class
.getName());
私有字符串文件名;
public SendHTMLEmail(字符串文件名){
this.fileName=文件名;
}
public void sendMail(){
String命令=SENDMAIL+文件名;
试一试{
Runtime r=Runtime.getRuntime();
LOGGER.log(Level.INFO,“Envoi de la commande:”+命令);
进程p=r.exec(命令);
p、 waitFor();
LOGGER.log(Level.INFO,
“电子邮件环境的结果:”+p.getOutputStream());
}捕获(中断异常例外){
LOGGER.log(Level.FATAL,例如getMessage());
}捕获(IOEX异常){
LOGGER.log(Level.FATAL,例如getMessage());
}
}
}
这是我的日志文件:

    INFO - Command: sendmail -R hdrs -N never -t -v < ACR_20130111_100744.html
INFO-Command:sendmail-R hdrs-N never-t-v
但我的程序从不发送电子邮件,sendmail命令仍在运行(即使在2小时后)。
另一件事,当我在bash脚本中使用相同的命令时,它只需5分钟就可以工作…

当您从Java创建一个进程时,您还必须处理它的输入和输出流。尤其是
进程
可能不会终止,除非您从STDOUT和STDERR读取其所有输出。是对常见问题的描述;您似乎正遭受第一个问题的困扰。

当您从Java创建一个进程时,您还必须处理它的输入和输出流。尤其是
进程
可能不会终止,除非您从STDOUT和STDERR读取其所有输出。是对常见问题的描述;您似乎正遭受第一个问题的困扰。

我找到了解决方案:

    package fr.thales.edf.reportEmailAcrAcq.email;

    import java.io.IOException;

    import org.apache.log4j.Level;
    import org.apache.log4j.Logger;

    public class SendHTMLEmail {
        private static final String SENDMAIL = "sendmail -R hdrs -N never -t -v < ";
        private static final Logger LOGGER = Logger.getLogger(SendHTMLEmail.class
                .getName());

        private String fileName;

        public SendHTMLEmail(String fileName) {
            this.fileName = fileName;
        }

        public void sendMail() {
            String command = SENDMAIL + fileName;
            try {
                Runtime r = Runtime.getRuntime();
                LOGGER.log(Level.INFO, "Envoi de la commande: " + command);
                Process p = r.exec(new String[]{"/usr/bin/ksh", "-c", command});
                p.waitFor();
                LOGGER.log(Level.INFO,
                        "Résultat de l'envoi de l'e-mail : " + p.getOutputStream());
            } catch (InterruptedException ex) {
                LOGGER.log(Level.FATAL, ex.getMessage());
            } catch (IOException ex) {
                LOGGER.log(Level.FATAL, ex.getMessage());
            }

        }
    }
文件包fr.thales.edf.reportEmailAcrAcq.email;
导入java.io.IOException;
导入org.apache.log4j.Level;
导入org.apache.log4j.Logger;
公共类SendHTMLEmail{
私有静态最终字符串SENDMAIL=“SENDMAIL-R hdrs-N never-t-v<”;
私有静态最终记录器Logger=Logger.getLogger(SendHTMLEmail.class
.getName());
私有字符串文件名;
public SendHTMLEmail(字符串文件名){
this.fileName=文件名;
}
public void sendMail(){
String命令=SENDMAIL+文件名;
试一试{
Runtime r=Runtime.getRuntime();
LOGGER.log(Level.INFO,“Envoi de la commande:”+命令);
进程p=r.exec(新字符串[]{”/usr/bin/ksh“,“-c”,command});
p、 waitFor();
LOGGER.log(Level.INFO,
“电子邮件环境的结果:”+p.getOutputStream());
}捕获(中断异常例外){
LOGGER.log(Level.FATAL,例如getMessage());
}捕获(IOEX异常){
LOGGER.log(Level.FATAL,例如getMessage());
}
}
}
我在这个论坛上找到了答案: 我找到了解决方案:

    package fr.thales.edf.reportEmailAcrAcq.email;

    import java.io.IOException;

    import org.apache.log4j.Level;
    import org.apache.log4j.Logger;

    public class SendHTMLEmail {
        private static final String SENDMAIL = "sendmail -R hdrs -N never -t -v < ";
        private static final Logger LOGGER = Logger.getLogger(SendHTMLEmail.class
                .getName());

        private String fileName;

        public SendHTMLEmail(String fileName) {
            this.fileName = fileName;
        }

        public void sendMail() {
            String command = SENDMAIL + fileName;
            try {
                Runtime r = Runtime.getRuntime();
                LOGGER.log(Level.INFO, "Envoi de la commande: " + command);
                Process p = r.exec(new String[]{"/usr/bin/ksh", "-c", command});
                p.waitFor();
                LOGGER.log(Level.INFO,
                        "Résultat de l'envoi de l'e-mail : " + p.getOutputStream());
            } catch (InterruptedException ex) {
                LOGGER.log(Level.FATAL, ex.getMessage());
            } catch (IOException ex) {
                LOGGER.log(Level.FATAL, ex.getMessage());
            }

        }
    }
文件包fr.thales.edf.reportEmailAcrAcq.email;
导入java.io.IOException;
导入org.apache.log4j.Level;
导入org.apache.log4j.Logger;
公共类SendHTMLEmail{
私有静态最终字符串SENDMAIL=“SENDMAIL-R hdrs-N never-t-v<”;
私有静态最终记录器Logger=Logger.getLogger(SendHTMLEmail.class
.getName());
私有字符串文件名;
public SendHTMLEmail(字符串文件名){
this.fileName=文件名;
}
public void sendMail(){
String命令=SENDMAIL+文件名;
试一试{
Runtime r=Runtime.getRuntime();
LOGGER.log(Level.INFO,“Envoi de la commande:”+命令);
进程p=r.exec(新字符串[]{”/usr/bin/ksh“,“-c”,command});
p、 waitFor();
LOGGER.log(Level.INFO,
“电子邮件环境的结果:”+p.getOutputStream());
}捕获(中断异常例外){
LOGGER.log(Level.FATAL,例如getMessage());
}捕获(IOEX异常){
LOGGER.log(Level.FATAL,例如getMessage());
}
}
}
我在这个论坛上找到了答案:

这只是一个小把戏,不是因为标准输出或标准输出。这是因为“只是一个把戏,这不是因为STDOUT或STDERR,而是因为”