<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FNetwork_Protocol%2FSMTP</id>
		<title>Java/Network Protocol/SMTP - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FNetwork_Protocol%2FSMTP"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Network_Protocol/SMTP&amp;action=history"/>
		<updated>2026-04-21T21:50:33Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Network_Protocol/SMTP&amp;diff=8905&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Network_Protocol/SMTP&amp;diff=8905&amp;oldid=prev"/>
				<updated>2010-06-01T07:21:17Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 07:21, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Network_Protocol/SMTP&amp;diff=8904&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Network_Protocol/SMTP&amp;diff=8904&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:47Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== A Thin SMTP Client ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
import java.io.DataInputStream;&lt;br /&gt;
import java.io.DataOutputStream;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
import java.text.DateFormat;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
import java.util.Locale;&lt;br /&gt;
public class Main {&lt;br /&gt;
  public static void main(String[] args) throws Exception {&lt;br /&gt;
    String host = &amp;quot;host&amp;quot;;&lt;br /&gt;
    int port = 25;&lt;br /&gt;
    String from = &amp;quot;from@from.net&amp;quot;;&lt;br /&gt;
    String toAddr = &amp;quot;to@to.net&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    Socket servSocket = new Socket(host, port);&lt;br /&gt;
    DataOutputStream os = new DataOutputStream(servSocket.getOutputStream());&lt;br /&gt;
    DataInputStream is = new DataInputStream(servSocket.getInputStream());&lt;br /&gt;
    if (servSocket != null &amp;amp;&amp;amp; os != null &amp;amp;&amp;amp; is != null) {&lt;br /&gt;
      os.writeBytes(&amp;quot;HELO\r\n&amp;quot;);&lt;br /&gt;
      os.writeBytes(&amp;quot;MAIL From:&amp;quot; + from + &amp;quot; \r\n&amp;quot;);&lt;br /&gt;
      os.writeBytes(&amp;quot;RCPT To:&amp;quot; + toAddr + &amp;quot;\r\n&amp;quot;);&lt;br /&gt;
      os.writeBytes(&amp;quot;DATA\r\n&amp;quot;);&lt;br /&gt;
      os.writeBytes(&amp;quot;X-Mailer: Java\r\n&amp;quot;);&lt;br /&gt;
      os.writeBytes(&amp;quot;DATE: &amp;quot; + DateFormat.getDateInstance(DateFormat.FULL, Locale.US).format(new Date()) + &amp;quot;\r\n&amp;quot;);&lt;br /&gt;
      os.writeBytes(&amp;quot;From:&amp;quot; + from + &amp;quot;\r\n&amp;quot;);&lt;br /&gt;
      os.writeBytes(&amp;quot;To:&amp;quot; + toAddr + &amp;quot;\r\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    os.writeBytes(&amp;quot;Subject:\r\n&amp;quot;);&lt;br /&gt;
    os.writeBytes(&amp;quot;body\r\n&amp;quot;);&lt;br /&gt;
    os.writeBytes(&amp;quot;\r\n.\r\n&amp;quot;);&lt;br /&gt;
    os.writeBytes(&amp;quot;QUIT\r\n&amp;quot;);&lt;br /&gt;
    String responseline;&lt;br /&gt;
    while ((responseline = is.readUTF()) != null) { &lt;br /&gt;
      if (responseline.indexOf(&amp;quot;Ok&amp;quot;) != -1)&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SMTP package to send a message to the specified recipients ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Copyright 2001-2005 The Apache Software Foundation&lt;br /&gt;
 *&lt;br /&gt;
 * Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
 * you may not use this file except in compliance with the License.&lt;br /&gt;
 * You may obtain a copy of the License at&lt;br /&gt;
 *&lt;br /&gt;
 *     http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 *&lt;br /&gt;
 * Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
 * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
 * See the License for the specific language governing permissions and&lt;br /&gt;
 * limitations under the License.&lt;br /&gt;
 */&lt;br /&gt;
package examples;&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileReader;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.io.Writer;&lt;br /&gt;
import java.util.Enumeration;&lt;br /&gt;
import java.util.Vector;&lt;br /&gt;
import org.apache.rumons.net.io.Util;&lt;br /&gt;
import org.apache.rumons.net.smtp.SMTPClient;&lt;br /&gt;
import org.apache.rumons.net.smtp.SMTPReply;&lt;br /&gt;
import org.apache.rumons.net.smtp.SimpleSMTPHeader;&lt;br /&gt;
/***&lt;br /&gt;
 * This is an example program using the SMTP package to send a message&lt;br /&gt;
 * to the specified recipients.  It prompts you for header information and&lt;br /&gt;
 * a filename containing the message.&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 ***/&lt;br /&gt;
public class mail&lt;br /&gt;
{&lt;br /&gt;
    public final static void main(String[] args)&lt;br /&gt;
    {&lt;br /&gt;
        String sender, recipient, subject, filename, server, cc;&lt;br /&gt;
        Vector ccList = new Vector();&lt;br /&gt;
        BufferedReader stdin;&lt;br /&gt;
        FileReader fileReader = null;&lt;br /&gt;
        Writer writer;&lt;br /&gt;
        SimpleSMTPHeader header;&lt;br /&gt;
        SMTPClient client;&lt;br /&gt;
        Enumeration en;&lt;br /&gt;
        if (args.length &amp;lt; 1)&lt;br /&gt;
        {&lt;br /&gt;
            System.err.println(&amp;quot;Usage: mail smtpserver&amp;quot;);&lt;br /&gt;
            System.exit(1);&lt;br /&gt;
        }&lt;br /&gt;
        server = args[0];&lt;br /&gt;
        stdin = new BufferedReader(new InputStreamReader(System.in));&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(&amp;quot;From: &amp;quot;);&lt;br /&gt;
            System.out.flush();&lt;br /&gt;
            sender = stdin.readLine();&lt;br /&gt;
            System.out.print(&amp;quot;To: &amp;quot;);&lt;br /&gt;
            System.out.flush();&lt;br /&gt;
            recipient = stdin.readLine();&lt;br /&gt;
            System.out.print(&amp;quot;Subject: &amp;quot;);&lt;br /&gt;
            System.out.flush();&lt;br /&gt;
            subject = stdin.readLine();&lt;br /&gt;
            header = new SimpleSMTPHeader(sender, recipient, subject);&lt;br /&gt;
&lt;br /&gt;
            while (true)&lt;br /&gt;
            {&lt;br /&gt;
                System.out.print(&amp;quot;CC &amp;lt;enter one address per line, hit enter to end&amp;gt;: &amp;quot;);&lt;br /&gt;
                System.out.flush();&lt;br /&gt;
                // Of course you don&amp;quot;t want to do this because readLine() may be null&lt;br /&gt;
                cc = stdin.readLine().trim();&lt;br /&gt;
                if (cc.length() == 0)&lt;br /&gt;
                    break;&lt;br /&gt;
                header.addCC(cc);&lt;br /&gt;
                ccList.addElement(cc);&lt;br /&gt;
            }&lt;br /&gt;
            System.out.print(&amp;quot;Filename: &amp;quot;);&lt;br /&gt;
            System.out.flush();&lt;br /&gt;
            filename = stdin.readLine();&lt;br /&gt;
            try&lt;br /&gt;
            {&lt;br /&gt;
                fileReader = new FileReader(filename);&lt;br /&gt;
            }&lt;br /&gt;
            catch (FileNotFoundException e)&lt;br /&gt;
            {&lt;br /&gt;
                System.err.println(&amp;quot;File not found. &amp;quot; + e.getMessage());&lt;br /&gt;
            }&lt;br /&gt;
            client = new SMTPClient();&lt;br /&gt;
            client.addProtocolCommandListener(new PrintCommandListener(&lt;br /&gt;
                                                  new PrintWriter(System.out)));&lt;br /&gt;
            client.connect(server);&lt;br /&gt;
            if (!SMTPReply.isPositiveCompletion(client.getReplyCode()))&lt;br /&gt;
            {&lt;br /&gt;
                client.disconnect();&lt;br /&gt;
                System.err.println(&amp;quot;SMTP server refused connection.&amp;quot;);&lt;br /&gt;
                System.exit(1);&lt;br /&gt;
            }&lt;br /&gt;
            client.login();&lt;br /&gt;
            client.setSender(sender);&lt;br /&gt;
            client.addRecipient(recipient);&lt;br /&gt;
            en = ccList.elements();&lt;br /&gt;
            while (en.hasMoreElements())&lt;br /&gt;
                client.addRecipient((String)en.nextElement());&lt;br /&gt;
            writer = client.sendMessageData();&lt;br /&gt;
            if (writer != null)&lt;br /&gt;
            {&lt;br /&gt;
                writer.write(header.toString());&lt;br /&gt;
                Util.copyReader(fileReader, writer);&lt;br /&gt;
                writer.close();&lt;br /&gt;
                client.rupletePendingCommand();&lt;br /&gt;
            }&lt;br /&gt;
            fileReader.close();&lt;br /&gt;
            client.logout();&lt;br /&gt;
            client.disconnect();&lt;br /&gt;
        }&lt;br /&gt;
        catch (IOException e)&lt;br /&gt;
        {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
            System.exit(1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SMTP talker class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002.&lt;br /&gt;
 * All rights reserved. Software written by Ian F. Darwin and others.&lt;br /&gt;
 * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 * 1. Redistributions of source code must retain the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 * 2. Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *    documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS&amp;quot;&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED&lt;br /&gt;
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS&lt;br /&gt;
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 * &lt;br /&gt;
 * Java, the Duke mascot, and all variants of Sun&amp;quot;s Java &amp;quot;steaming coffee&lt;br /&gt;
 * cup&amp;quot; logo are trademarks of Sun Microsystems. Sun&amp;quot;s, and James Gosling&amp;quot;s,&lt;br /&gt;
 * pioneering role in inventing and promulgating (and standardizing) the Java &lt;br /&gt;
 * language and environment is gratefully acknowledged.&lt;br /&gt;
 * &lt;br /&gt;
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&amp;amp;T, for&lt;br /&gt;
 * inventing predecessor languages C and C++ is also gratefully acknowledged.&lt;br /&gt;
 */&lt;br /&gt;
///&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.PrintStream;&lt;br /&gt;
import java.net.ConnectException;&lt;br /&gt;
import java.net.NoRouteToHostException;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
import java.net.UnknownHostException;&lt;br /&gt;
import java.util.StringTokenizer;&lt;br /&gt;
/**&lt;br /&gt;
 * SMTP talker class, usable standalone (as a SendMail(8) backend) or inside&lt;br /&gt;
 * applications such as JabaDex that need to send mail..&lt;br /&gt;
 * &lt;br /&gt;
 * OBSOLETE!! Use javax.mail instead, now that it&amp;quot;s available!&lt;br /&gt;
 * &lt;br /&gt;
 * Needs more parameterization - bit of a hack to start. Should use same&lt;br /&gt;
 * interface as Mailer (subclass, and override doSend()).&lt;br /&gt;
 * &lt;br /&gt;
 * @author Ian Darwin&lt;br /&gt;
 * @version $Id: SmtpTalk.java,v 1.10 2002/10/26 13:53:45 ian Exp $&lt;br /&gt;
 */&lt;br /&gt;
public class SmtpTalk {&lt;br /&gt;
  BufferedReader is;&lt;br /&gt;
  PrintStream os;&lt;br /&gt;
  private boolean debug = true;&lt;br /&gt;
  private String host;&lt;br /&gt;
  /**&lt;br /&gt;
   * A simple main program showing the class in action.&lt;br /&gt;
   * &lt;br /&gt;
   * TODO generalize to accept From arg, read msg on stdin&lt;br /&gt;
   */&lt;br /&gt;
  public static void main(String[] argv) {&lt;br /&gt;
    if (argv.length != 2) {&lt;br /&gt;
      System.err.println(&amp;quot;Usage: java SmtpTalk host user&amp;quot;);&lt;br /&gt;
      System.exit(1);&lt;br /&gt;
    }&lt;br /&gt;
    try {&lt;br /&gt;
      SmtpTalk st = new SmtpTalk(argv[0]);&lt;br /&gt;
      System.out.println(&amp;quot;SMTP Talker ready&amp;quot;);&lt;br /&gt;
      st.converse(&amp;quot;MAILER-DAEMON@daroad.darwinsys.ru&amp;quot;, argv[1],&lt;br /&gt;
          &amp;quot;Test message&amp;quot;, &amp;quot;Hello there&amp;quot;);&lt;br /&gt;
    } catch (Exception ig) {&lt;br /&gt;
      System.err.println(ig.getMessage());&lt;br /&gt;
      System.exit(0);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Constructor taking a server hostname as argument.&lt;br /&gt;
   */&lt;br /&gt;
  SmtpTalk(String server) throws Exception {&lt;br /&gt;
    host = server;&lt;br /&gt;
    try {&lt;br /&gt;
      Socket s = new Socket(host, 25);&lt;br /&gt;
      is = new BufferedReader(new InputStreamReader(s.getInputStream()));&lt;br /&gt;
      os = new PrintStream(s.getOutputStream());&lt;br /&gt;
    } catch (NoRouteToHostException e) {&lt;br /&gt;
      die( &amp;quot;No route to host &amp;quot; + host);&lt;br /&gt;
    } catch (ConnectException e) {&lt;br /&gt;
      die(&amp;quot;Connection Refused by &amp;quot; + host);&lt;br /&gt;
    } catch (UnknownHostException e) {&lt;br /&gt;
      die(&amp;quot;Unknown host &amp;quot; + host);&lt;br /&gt;
    } catch (IOException e) {&lt;br /&gt;
      die( &amp;quot;I/O error setting up socket streams\n&amp;quot; + e);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /** Send a command with an operand */&lt;br /&gt;
  protected void send_cmd(String cmd, String oprnd) {&lt;br /&gt;
    send_cmd(cmd + &amp;quot; &amp;quot; + oprnd);&lt;br /&gt;
  }&lt;br /&gt;
  /* Send a command with no operand */&lt;br /&gt;
  protected void send_cmd(String cmd) {&lt;br /&gt;
    if (debug)&lt;br /&gt;
      System.out.println(&amp;quot;&amp;gt;&amp;gt;&amp;gt; &amp;quot; + cmd);&lt;br /&gt;
    os.print(cmd + &amp;quot;\r\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  /** Send_text sends the body of the message. */&lt;br /&gt;
  public void send_text(String text) {&lt;br /&gt;
    os.print(text + &amp;quot;\r\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  /** Expect (read and check for) a given reply */&lt;br /&gt;
  protected boolean expect_reply(String rspNum) throws Exception {&lt;br /&gt;
    String s = null;&lt;br /&gt;
    try {&lt;br /&gt;
      s = is.readLine();&lt;br /&gt;
    } catch (IOException e) {&lt;br /&gt;
      die( &amp;quot;I/O error reading from host &amp;quot; + host + &amp;quot; &amp;quot; + e);&lt;br /&gt;
    }&lt;br /&gt;
    if (debug)&lt;br /&gt;
      System.out.println(&amp;quot;&amp;lt;&amp;lt;&amp;lt; &amp;quot; + s);&lt;br /&gt;
    return s.startsWith(rspNum + &amp;quot; &amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Convenience routine to print message &amp;amp; exit, like K&amp;amp;P error(), perl&lt;br /&gt;
   * die(), ...&lt;br /&gt;
   * &lt;br /&gt;
   * @param ret&lt;br /&gt;
   *            Numeric value to pass back&lt;br /&gt;
   * @param msg&lt;br /&gt;
   *            Error message to be printed on stdout.&lt;br /&gt;
   */&lt;br /&gt;
  protected void die(String msg) throws Exception {&lt;br /&gt;
    throw new Exception( msg);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * send one Mail message to one or more recipients via smtp to server&lt;br /&gt;
   * &amp;quot;host&amp;quot;.&lt;br /&gt;
   */&lt;br /&gt;
  public void converse(String sender, String recipients, String subject,&lt;br /&gt;
      String body) throws Exception {&lt;br /&gt;
    if (!expect_reply(&amp;quot;220&amp;quot;))&lt;br /&gt;
      die(&amp;quot;did not get SMTP greeting&amp;quot;);&lt;br /&gt;
    send_cmd(&amp;quot;HELO&amp;quot;, &amp;quot;darwinsys.ru&amp;quot;);&lt;br /&gt;
    if (!expect_reply(&amp;quot;250&amp;quot;))&lt;br /&gt;
      die(&amp;quot;did not ack our HELO&amp;quot;);&lt;br /&gt;
    send_cmd(&amp;quot;MAIL&amp;quot;, &amp;quot;From:&amp;lt;&amp;quot; + sender + &amp;quot;&amp;gt;&amp;quot;); // no spaces!&lt;br /&gt;
    if (!expect_reply(&amp;quot;250&amp;quot;))&lt;br /&gt;
      die(&amp;quot;did not ack our MAIL command&amp;quot;);&lt;br /&gt;
    StringTokenizer st = new StringTokenizer(recipients);&lt;br /&gt;
    while (st.hasMoreTokens()) {&lt;br /&gt;
      String r = st.nextToken();&lt;br /&gt;
      send_cmd(&amp;quot;RCPT&amp;quot;, &amp;quot;To:&amp;lt;&amp;quot; + r + &amp;quot;&amp;gt;&amp;quot;);&lt;br /&gt;
      if (!expect_reply(&amp;quot;250&amp;quot;))&lt;br /&gt;
        die(&amp;quot;didn&amp;quot;t ack RCPT &amp;quot; + r);&lt;br /&gt;
    }&lt;br /&gt;
    send_cmd(&amp;quot;DATA&amp;quot;);&lt;br /&gt;
    if (!expect_reply(&amp;quot;354&amp;quot;))&lt;br /&gt;
      die(&amp;quot;did not want our DATA!&amp;quot;);&lt;br /&gt;
    send_text(&amp;quot;From: &amp;quot; + sender);&lt;br /&gt;
    send_text(&amp;quot;To: &amp;quot; + recipients);&lt;br /&gt;
    send_text(&amp;quot;Subject: &amp;quot; + subject);&lt;br /&gt;
    send_text(&amp;quot;&amp;quot;);&lt;br /&gt;
    send_text(body + &amp;quot;\r&amp;quot;);&lt;br /&gt;
    send_cmd(&amp;quot;.&amp;quot;);&lt;br /&gt;
    if (!expect_reply(&amp;quot;250&amp;quot;))&lt;br /&gt;
      die(&amp;quot;Mail not accepted&amp;quot;);&lt;br /&gt;
    send_cmd(&amp;quot;QUIT&amp;quot;);&lt;br /&gt;
    if (!expect_reply(&amp;quot;221&amp;quot;))&lt;br /&gt;
      die(&amp;quot;Other end not closing down&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>