title: Gmail SMTP authentication
body: <p>How can I send an email with an attachment using Gmail's servers, but without JavaMail?</p>
  
  <p>I have come across this <a href="http://www.java-forums.org/java-net/7247-sending-mail-using-sockets.html" rel="nofollow">code</a>.</p>
  
  <p>How to authenticate when using this code (using my gmail account as a sender)? Can this code be edited in a way that subject can be specified? I'm guessing that file.txt acts as an attachment?</p>
  
  <p>EDIT: Here's the code from the link, adapted to my need's (more or less). Only difference is file location, smtp server and "from" and "to" strings.</p>
  
  <pre><code>public static void blabla() throws IOException, UnknownHostException {
          String msgFile = "C:\\file.txt";
          String from = "myemailaccount@gmail.com";
          String to = "otheremailaccount@gmail.com";
          String mailHost = "smtp.gmail.com";
          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");
          }
  
          @SuppressWarnings({"resource", "unused"})
          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:&lt;" + from + "&gt;");
              out.println("MAIL From:&lt;" + from + "&gt;");
  
              String senderOK = in.readLine();
  
              System.out.println(senderOK);
              System.out.println("RCPT TO:&lt;" + to + "&gt;");
              out.println("RCPT TO:&lt;" + to + "&gt;");
  
              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;
          }
  </code></pre>