【问题标题】:Send email using java without JavaMail使用没有 JavaMail 的 java 发送电子邮件
【发布时间】:2012-03-03 10:05:50
【问题描述】:

我想编写一个套接字程序来发送 SMTP 电子邮件,而不使用任何 JavaMail API。我在 Internet 上找到了执行此操作的代码,但它无法正常工作。 这是程序:

import java.net.*;
import java.io.*;
import java.util.*;


public class SMTPTest
{ public static void main(String[] args)
{ SMTPTest smtp = new SMTPTest();
smtp.sendMail();
}

public void sendMail()
{
try
{
Socket s = new Socket("smtp.gmail.com", 465); 
out = new PrintWriter(s.getOutputStream());
in = new BufferedReader(new
InputStreamReader(s.getInputStream()));
String hostName = InetAddress.getLocalHost().getHostName();
System.out.println("hostName = " + hostName);
send(null);
send("HELO " + hostName);
send("MAIL FROM: " + "my email@gmail.com");
send("RCPT TO: " + "my email@gmail.com");
send("DATA");
send("Happy SMTP Programming!!");
send("Happy SMTP Programming!!");
send(".");
send("QUIT");
s.close();
out.close();
in.close();
}
catch(IOException e)
{ e.printStackTrace();
}
}

public void send(String s) throws IOException
{ if (s != null)
{ out.println(s);
out.flush();
}
String line;
if ((line = in.readLine()) != null) //output the response
System.out.println(line);
}

private PrintWriter out;
private BufferedReader in;
}

谁能帮忙? 这是错误:

java.net.UnknownHostException: smtp.gmail.com
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at SMTPTest.sendMail(SMTPTest.java:19)
at SMTPTest.main(SMTPTest.java:12) 

【问题讨论】:

  • 未知主机异常意味着 Java 无法访问 Internet 连接(更准确地说是 DNS 服务器)。防火墙问题?
  • 不能使用带有普通 SMTP 的 Google 邮件服务器 - 它们需要 TLS。使用另一个 smtp 服务器。
  • 如果您想直接发送到 gmail 帐户,那么您需要计算 gmail.com 的 DNS MX 类型记录,然后您可以尝试使用您的代码连接到它。如果您想使用 Google smtp 作为 MTA,那么您需要!)使用 SSL 连接,2)验证自己。

标签: java sockets smtp


【解决方案1】:

您不能使用带有普通 SMTP 的 Google 邮件服务器 - 它们需要 TLS。

不确定这是否会有所帮助,但我在一些代码示例中看到了这种说法:

System.setProperty("mail.smtp.starttls.enable","true");
Socket s = new Socket(...);

【讨论】:

【解决方案2】:

使用 SSLSocket 代替 Socket,如下所示:

SSLSocket socket = (SSLSocket) ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(InetAddress.getByName("smtp.gmail.com"), 465);

您必须捕获异常,但您明白了。

【讨论】:

    猜你喜欢
    • 2018-12-18
    • 2011-10-16
    • 2012-04-27
    • 2017-10-17
    • 2015-08-10
    • 2014-07-26
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多