从java发送电子邮件

时间:2012-02-25 16:59:14

标签: java smtp javamail

我一直在尝试从我的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)

2 个答案:

答案 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。但是,我认为要求任何人提供他们的电子邮件密码是不明智的。我知道无论我多么信任他们的服务,我都不会将这些信息输入某人的网站。因此,我认为您需要更多地考虑您的设计以及您的预期,而不仅仅是如何使用代码。