我正在创建一个 java 应用程序,我想添加的功能之一是将生成的电子邮件发送给用户。我已经在 Macbook 上设置了邮件,并且可以从命令行发送电子邮件。当我调用runtime.exec() 时,我在发送电子邮件时遇到问题。任何人都知道为什么它不会执行并发送电子邮件?
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("echo This is the body | mail -s Subject -F [email protected]");
}
catch ( Exception e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我没有收到任何错误,一切都编译正常。我只是没有收到任何电子邮件发送。如果有人可以帮助,我将不胜感激。
Runtime.exec(String)
不会通过将整个字符串粘贴到 UNIX shell 中并运行来执行整个字符串。这是因为这是一个巨大的安全缺陷。
想象一下你这样做了:
runtime.exec("Hello "+name+" | mail ...");
然后我可以设置name
to ; rm -rf /*; echo
or && cat /etc/passwd
,或其他一些 shell 注入代码。
So, Java 正在将您的命令分解为多个部分:
更准确地说,使用通过调用 new StringTokenizer(command) 创建的 StringTokenizer 将命令字符串分解为标记,而无需进一步修改字符类别。然后,标记生成器生成的标记按照相同的顺序放置在新的字符串数组 cmdarray 中。
最终,您正在运行echo
单独命令,带有参数,例如|
and mail
. The echo
命令只会将它们打印到标准输出,您不会收集这些内容。它永远不会调用mail
命令。
你不应该使用mail
由于涉及安全风险,从 Java 发送邮件的命令。您应该使用 JavaMail 包,它提供了安全且方便的 API 来发送邮件。 UNIXmail
命令的工作原理是连接到sendmail
守护进程在本地计算机的端口 25 上运行,JavaMail 也可以执行此操作。
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
public class SendMail {
public static sendMail(String from, String to, String subject, String body)
throws MessagingException
{
final Properties p = new Properties();
p.put("mail.smtp.host", "localhost");
final Message msg = new MimeMessage(Session.getDefaultInstance(p));
msg.setFrom(new InternetAddress(from));
msg.addRecipient(RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
msg.setText(body);
Transport.send(msg);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)