我一直在尝试从我的servlet发送电子邮件。我试着看看如何在互联网上做到这一点。但是,在我遇到的所有代码中,没有一个使用发件人密码发送邮件。
这意味着任何人都可以从任何人的帐户发送电子邮件。我弄错了或者实际问题是什么?
Exception in thread "main" javax.mail.MessagingException: Could not connect to S
MTP host: localhost, port: 465;
nested exception is:
java.net.ConnectException: Connection refused: connect
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1391)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:41
2)
at javax.mail.Service.connect(Service.java:288)
at javax.mail.Service.connect(Service.java:169)
at javax.mail.Service.connect(Service.java:189)
at Email1.main(Email1.java:19)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketI
mpl.java:69)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.ja
va:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocket
Impl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java
:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:612)
at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:160
)
at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:233)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:189)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1359)
答案 0 :(得分:2)
你在某种程度上是对的。如果smtp服务器不需要身份验证,任何人都可以发送假装成其他任何人的电子邮件;-)幸运的是,大多数服务器都需要身份验证。
我没有完全明白你想要实现的目标。您是否拥有自己的smtp服务器,或者是否允许用户从他们已有的帐户(例如来自gmail.com)发送邮件。在这两种情况下,您可能都希望看到JavaMail API文档。甚至可以使用示例JavaMailServlet作为参考。
这是一个发送电子邮件并使用user / pass对smtp服务器进行身份验证的简单程序(基于JavaMail中的示例):
import java.util.Properties;
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;
public class Mail
{
public static void main(String[] args) throws MessagingException
{
Properties props = new Properties();
props.setProperty("mail.smtp.host", "smtp.example.com");
// props.setProperty("mail.smtp.auth", "true"); // not necessary for my server, I'm not sure if you'll need it
Session session = Session.getInstance(props, null);
Transport transport = session.getTransport("smtp");
transport.connect("user", "password");
Message message = new MimeMessage(session);
message.setSubject("Test");
message.setText("Hello :)");
message.setFrom(new InternetAddress("you@example.com"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("your-friend@example.com"));
transport.sendMessage(message, message.getAllRecipients());
}
}
答案 1 :(得分:0)
当您的代码运行报告或需要通知您某些事件时,您可能会从servlet发送电子邮件,在这种情况下,该电子邮件将来自通用服务帐户。如果要使用客户端的电子邮件凭据,则必须请求它们或具有允许用户输入联系信息的UI。但是,我认为要求任何人提供他们的电子邮件密码是不明智的。我知道无论我多么信任他们的服务,我都不会将这些信息输入某人的网站。因此,我认为您需要更多地考虑您的设计以及您的预期,而不仅仅是如何使用代码。