2011-10-09 107 views
5

我从我的Java应用程序向Gmail帐户发送邮件。我曾使用Java邮件API,它工作正常。但是可以在不使用Java中的邮件API的情况下发送电子邮件吗?发送邮件到Gmail帐户

我的意思只是用插座:

public class Main { 
    public static void main(String[] args) throws Exception { 
    String host = "smtp.gmail.com"; 
    int port = 465; 
    String from = "[email protected]"; 
    String toAddr = "[email protected]"; 


    Socket servSocket = new Socket(host, port); 
    DataOutputStream os = new DataOutputStream(servSocket.getOutputStream()); 
    DataInputStream is = new DataInputStream(servSocket.getInputStream()); 

    if (servSocket != null && os != null && is != null) { 
     os.writeBytes("HELO\r\n"); 
     os.writeBytes("MAIL From:" + from + " \r\n"); 
     os.writeBytes("RCPT To:" + toAddr + "\r\n"); 
     os.writeBytes("DATA\r\n"); 
     os.writeBytes("X-Mailer: Java\r\n"); 
     os.writeBytes("DATE: " + DateFormat.getDateInstance(DateFormat.FULL, 
            Locale.US).format(new Date()) + "\r\n"); 
     os.writeBytes("From:" + from + "\r\n"); 
     os.writeBytes("To:" + toAddr + "\r\n"); 
    } 

    os.writeBytes("Subject:\r\n"); 
    os.writeBytes("body\r\n"); 
    os.writeBytes("\r\n.\r\n"); 
    os.writeBytes("QUIT\r\n"); 
    String responseline; 
    while ((responseline = is.readUTF()) != null) { 
     if (responseline.indexOf("Ok") != -1) 
     break; 
    } 
    } 
} 

但它不工作,不发送邮件。谁能告诉我可能是什么问题?

+1

尝试在年底关闭套接字,我曾与这一个bug前一段时间。 – Sibbo

+0

什么是错误? – Mob

+0

它不显示任何错误,但邮件未被发送 – Sharpzain120

回答

2

这里是一个很好的例子:

public class SMTPDemo { 

    public static void main(String args[]) throws IOException, 
     UnknownHostException { 
    String msgFile = "file.txt"; 
    String from = "[email protected]"; 
    String to = "[email protected]"; 
    String mailHost = "yourHost"; 
    SMTP mail = new SMTP(mailHost); 
    if (mail != null) { 
     if (mail.send(new FileReader(msgFile), from, to)) { 
     System.out.println("Mail sent."); 
     } else { 
     System.out.println("Connect to SMTP server failed!"); 
     } 
    } 
    System.out.println("Done."); 
    } 

    static class SMTP { 
    private final static int SMTP_PORT = 25; 

    InetAddress mailHost; 

    InetAddress localhost; 

    BufferedReader in; 

    PrintWriter out; 

    public SMTP(String host) throws UnknownHostException { 
     mailHost = InetAddress.getByName(host); 
     localhost = InetAddress.getLocalHost(); 
     System.out.println("mailhost = " + mailHost); 
     System.out.println("localhost= " + localhost); 
     System.out.println("SMTP constructor done\n"); 
    } 

    public boolean send(FileReader msgFileReader, String from, String to) 
     throws IOException { 
     Socket smtpPipe; 
     InputStream inn; 
     OutputStream outt; 
     BufferedReader msg; 
     msg = new BufferedReader(msgFileReader); 
     smtpPipe = new Socket(mailHost, SMTP_PORT); 
     if (smtpPipe == null) { 
     return false; 
     } 
     inn = smtpPipe.getInputStream(); 
     outt = smtpPipe.getOutputStream(); 
     in = new BufferedReader(new InputStreamReader(inn)); 
     out = new PrintWriter(new OutputStreamWriter(outt), true); 
     if (inn == null || outt == null) { 
     System.out.println("Failed to open streams to socket."); 
     return false; 
     } 
     String initialID = in.readLine(); 
     System.out.println(initialID); 
     System.out.println("HELO " + localhost.getHostName()); 
     out.println("HELO " + localhost.getHostName()); 
     String welcome = in.readLine(); 
     System.out.println(welcome); 
     System.out.println("MAIL From:<" + from + ">"); 
     out.println("MAIL From:<" + from + ">"); 
     String senderOK = in.readLine(); 
     System.out.println(senderOK); 
     System.out.println("RCPT TO:<" + to + ">"); 
     out.println("RCPT TO:<" + to + ">"); 
     String recipientOK = in.readLine(); 
     System.out.println(recipientOK); 
     System.out.println("DATA"); 
     out.println("DATA"); 
     String line; 
     while ((line = msg.readLine()) != null) { 
     out.println(line); 
     } 
     System.out.println("."); 
     out.println("."); 
     String acceptedOK = in.readLine(); 
     System.out.println(acceptedOK); 
     System.out.println("QUIT"); 
     out.println("QUIT"); 
     return true; 
    } 
    } 
} 

- >http://www.java2s.com/Code/Java/Network-Protocol/SendingMailUsingSockets.htm

+0

msgfile变量的逻辑是什么? – Sharpzain120

+0

有消息位于将被发送。 – MasterCassim

+0

530 5.7.0首先必须发出STARTTLS命令。 ei16sm26532474wbb.21 – Sharpzain120

0

如果你有一个动态IP,你很可能无法将消息发送到Googlemail电子邮件。

0

GMail不允许非安全邮件传输。您需要在实施中进行SSL/TLS连接。

0

默认情况下,Google只允许加密连接。在我看来,这实际上是一件好事。

但是,如果您必须以明文形式发送邮件,则可以在设置下的Account Page上启用它。

0

为了使用安全连接,使用SSLSocket的,而不是插座,这样的:

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