--
Paweł Gajda ** Power on the highway
student Wiedzy Tajemnej **** Data in my head
**** Surfing on the network
** Part of me is dead
Normalnie trzeba to robic recznie. W tej chwili jest dostepna jakas
implementcja JavaMail - sprawdz http://developer.javasoft.com
Artur
Co to znaczy "zrobic recznie" ? Sluze gotowym kodem; robile
juz cos takiego.
Poza tym, wystarczy sciagnac ze stron IBM'a pakiet firmy
Taligent, Inc. z wiekszej calosci o nazwie WebRunner Toolkit,
w ktorym zaimplementowano wazniejsze protokoly, czyli
FTP, SMTP, POP3, NNTP. Masz tam wszystko to, czego potrzebujesz
kompleksowo rozwiazane. Oczywiscie jest to wersja ewaluacyjna
na wlasny uzytek, ale dziala niezle.
Oto wspomniany adres:
http://www.taligent.com/Products/webrunner/resources/WRBeans.html
Nazywa sie to "Network Beans".
p.g.
Też chciałbym wiedzieć, co to znaczy zrobić ręcznie.
Czy mógłbyś przesłać ten kod (może być na grupę - inni niech też popatrzą)
W moim pierwszym pytaniu chodziło o to czy da się to zrobić bez korzystania
z dodatkowych bibliotek, zwłaszcza komercyjnych.
> Oto wspomniany adres:
> http://www.taligent.com/Products/webrunner/resources/WRBeans.html
> Nazywa sie to "Network Beans".
Dzięki zajrzę tam.
> p.g.
Pozdrawiam
> Też chciałbym wiedzieć, co to znaczy zrobić ręcznie.
To znaczy polaczys sie z serverem port 25, wyslac FROM i inne rzeczy i
zakonczyc polaczenie. (patrz RFC ilestam). To jest dla mnie robienie tego
recznie w odroznieniu od korzystania z gotowej biblioteki z klasami w
ktorych robisz mail.setFromHeader("bla...@usa.net");
> Czy mógłbyś przesłać ten kod (może być na grupę - inni niech też popatrzą)
To nie do mnie.
> W moim pierwszym pytaniu chodziło o to czy da się to zrobić bez korzystania
> z dodatkowych bibliotek, zwłaszcza komercyjnych.
javax.mail nie jest komercyjna - mozna z niej korzystac za darmo.
A jezeli chodzi ci bez bibliotek w ogolnosci to kod ktory podesle ci pan
Pawel to tez bedzie swego rodzaju biblioteka czyz nie ?
Alternatywa jest zawsze new Socket("server", 25);
Artur
Przesylam => najpierw plik SendMail.java
Jako Reply do tego postingu wysylam SendMailApplet.java
********************************************************
* Oto wspomniany kod klasy wysylajacej poczte *
********************************************************
// Poczatek kodu
import java.net.*;
import java.io.*;
import java.util.*;
// __________________________________________________________________
//
// SendMail.java
// Copyright (c) Pawel Grotowski
// paw...@bitbank.net.pl
//
// Klasa SendMail sluzy do wysylania poczty elektronicznej
// pod zadany adres.
//
// Napisana zostala na podstawie dokumentu RFC821
// "Simple Mail Transfer Protocol", Postel, J.B.; 1982
//
// Aby otrzymac oryginal dokumentu wyslij na adres
// ser...@nic.dd.mil poczte w ktorej temat bedzie numerem
// pozadanego dokumentu RFC, w tym przypadku RFC821.
//
// INSTRUKCJA OBSLUGI:
//
// 1. Nalezy utworzyc instancje klasy dyrektywa new, w argumencie
// podajac adresu hostu z ktorego poczta jest wysylana i adres
// zwrotny. Najczesciej bedzie to tak:
//
// SendMail sm = new SendMail(getDocumentBase().getHost(), email);
//
// 2. Nastepnie trzeba wyslac dane w formacia ASCII:
//
// sm.sendMessage("us...@domena.pl", "Temat", "Tekst przesyłki");
// __________________________________________________________________
//
class SendMail
{
private String host;
private String returnAddress;
private Socket socket;
private DataInputStream input;
private PrintStream output;
private static int PORT = 25;
/**
* konstruktor
*
*/
SendMail(String host, String returnAddress)
{
this.host = host;
this.returnAddress = returnAddress;
}
/**
* otwarcie połšczenia
*
*/
private void openSocket() throws Exception
{
try {
socket = new Socket(host, PORT);
System.out.println(socket.toString());
} catch(Exception e) {
throw new Exception("BŁĽD: Połšczenie z hostem nie jest możliwe");
}
}
/**
* otwarcie standardowego wej cia dla danych
*
*/
private void openInputStream() throws Exception
{
try {
input = new DataInputStream(socket.getInputStream());
} catch(Exception e) {
throw new Exception("BŁĽD: Niemożliwe otwarcie wej cia");
}
}
/**
* otwarcie standardowego wyj cia
*
*/
private void openOutputStream() throws Exception
{
try {
output = new PrintStream(socket.getOutputStream());
} catch(Exception e) {
throw new Exception("BŁĽD: Niemożliwe otwarcie wyj cia");
}
}
/**
* wysłanie danych
*
*/
private void sendData(String recipient, String subject, String msg)
throws Exception
{
try {
sendLine("HELO " + InetAddress.getLocalHost().toString());
sendLine("MAIL FROM:<" + returnAddress + ">");
sendLine("RCPT TO:<" + recipient + ">");
sendLine("SEND FROM:<" + returnAddress + ">");
// dane
sendLine("DATA");
sendLine("Subject: " + subject);
/*
* analiza tekstu wysyłanego komunikatu. Je li zostanie napotkany
* znak '.' musi on być zamieniony na cišg '..' ponieważ kropka
* oznacza zakończenie komunikatu.
*
*/
DataInputStream is = new DataInputStream(new
StringBufferInputStream(msg));
try {
while(is.available() > 0) {
String line = is.readLine();
if (line.equals(".")) {
line = "..";
}
sendLine(line);
}
} catch(IOException e) {
}
// zakończenie sesji
sendLine("\r\n");
sendLine(".");
sendLine("QUIT");
} catch(Exception e) {
throw new Exception("BŁĽD: Wysłanie danych nie jest możliwe");
}
}
/**
* wysłanie linii do serwera poczty
*
*/
public void sendLine(String data)
{
output.print(data + "\r\n");
System.out.println("send : " + data);
}
/**
* wysłanie poczty pod zadany adres
*
* recipient - adres eMail
* subject - temat
* msg - wysyłany tekst
*
*/
public void sendMessage(String recipient, String subject, String msg)
throws Exception
{
try {
openSocket();
openOutputStream();
//openInputStream(); // bez potwierdzenia odbioru
sendData(recipient, subject, msg);
} catch(Exception e) {
throw new Exception("BŁĽD: Wysłanie wiadomo ci nie jest możliwe");
}
finally {
if (socket != null) {
socket.close();
}
}
}
}
// Koniec kodu
p.g.
--
URL: http://www.bitbank.net.pl/pawelg eMail: paw...@bitbank.net.pl
======================================================================
PGP public key http://www.bitbank.net.pl/pawelg/my_pgp_key/PUBRING.asc
PGP key fingerprint = FE 19 52 8D F8 94 FD 0F 9B 9B 8E 4B 05 7F 53 A9
*********************************************************
* Kod appletu wysylajacego poczte ze strony WWW *
* Wykorzystuje klase SendMail i HexConverter. *
* HexConterter nie jest zamieszczony w tym listingu! *
*********************************************************
// Poczatek kodu
import java.applet.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import SendMail;
import HexConverter;
// __________________________________________________________________
//
// Formularz do wypełnienia danymi głosujšcego
//
// Copyright (c) Pawel Grotowski
// paw...@bitbank.net.pl
// __________________________________________________________________
//
class MailForm extends Panel
{
private SendMailApplet applet;
public TextField name = null;
public TextField email = null;
public TextField age = null;
public TextField city = null;
public TextField country = null;
public Button button = null;
public String buttonDesc = null;
/**
* konstruktor
*/
MailForm
(
SendMailApplet ap,
String nameDesc,
String emailDesc,
String ageDesc,
String cityDesc,
String countryDesc,
String buttonDesc,
Color colorPanel
)
{
applet = ap;
Label label;
GridBagConstraints gbc = new GridBagConstraints();
GridBagLayout gbl = new GridBagLayout();
// ustalenia czcionki dla okna i przycisku
Font font = new Font("Arial", Font.BOLD, 16);
Font bttn = new Font("Arial", Font.BOLD, 24);
// ustalenie koloru pól dialogowych
Color textFieldColor = new Color(colorPanel.getRed() - 95,
colorPanel.getGreen() - 95,
colorPanel.getBlue() - 95);
setLayout(gbl);
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.NONE;
// imię i nazwisko
label = new Label(nameDesc);
label.setFont(font);
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.EAST;
gbl.setConstraints(label, gbc);
add(label);
name = new TextField(20);
name.setFont(font);
name.setBackground(textFieldColor);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.anchor = GridBagConstraints.WEST;
gbl.setConstraints(name, gbc);
add(name);
label = new Label(emailDesc);
label.setFont(font);
gbc.insets = new Insets(4,0,0,0);
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.EAST;
gbl.setConstraints(label, gbc);
add(label);
email = new TextField(20);
email.setFont(font);
email.setBackground(textFieldColor);
gbc.insets = new Insets(4,0,0,0);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.anchor = GridBagConstraints.WEST;
gbl.setConstraints(email, gbc);
add(email);
// wiek
label = new Label(ageDesc);
label.setFont(font);
gbc.insets = new Insets(4,0,0,0);
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.EAST;
gbl.setConstraints(label, gbc);
add(label);
age = new TextField(3);
age.setFont(font);
age.setBackground(textFieldColor);
gbc.insets = new Insets(4,0,0,0);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.anchor = GridBagConstraints.WEST;
gbl.setConstraints(age, gbc);
add(age);
// miasto
label = new Label(cityDesc);
label.setFont(font);
gbc.insets = new Insets(4,0,0,0);
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.EAST;
gbl.setConstraints(label, gbc);
add(label);
city = new TextField(20);
city.setFont(font);
city.setBackground(textFieldColor);
gbc.insets = new Insets(4,0,0,0);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.anchor = GridBagConstraints.WEST;
gbl.setConstraints(city, gbc);
add(city);
// narodowo ć
label = new Label(countryDesc);
label.setFont(font);
gbc.insets = new Insets(4,0,0,0);
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.EAST;
gbl.setConstraints(label, gbc);
add(label);
country = new TextField(20);
country.setFont(font);
country.setBackground(textFieldColor);
gbc.insets = new Insets(4,0,0,0);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.anchor = GridBagConstraints.WEST;
gbl.setConstraints(country, gbc);
add(country);
// przycisk wy lij
this.buttonDesc = buttonDesc;
button = new Button(buttonDesc);
button.setFont(bttn);
gbc.insets = new Insets(20,0,0,0);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.CENTER;
gbl.setConstraints(button, gbc);
add(button);
validate();
setBackground(colorPanel);
}
}
// __________________________________________________________________
//
// SendMailApplet.java
// Copyright (c) Pawel Grotowski
// paw...@bitbank.net.pl
// __________________________________________________________________
//
public final class SendMailApplet extends Applet implements Runnable
{
MailForm mailForm = null;
Thread sendMailThread = null;
String recipient = null;
String subject = null;
String message = null;
String buttonDesc = null;
String msgWindowName = null;
String nameErrorDoc = null;
String ageErrorDoc = null;
String socketErrorDoc = null;
String sendOkDoc = null;
// nazwy parametrów wej ciowych
private final static String paramName[] = {
"NameDesc",
"EmailDesc",
"AgeDesc",
"CityDesc",
"CountryDesc",
"ButtonDesc",
"BgColor",
"Recipient",
"Subject",
"Message",
"MsgWindowName",
"NameErrorEvent",
"AgeErrorEvent",
"SocketErrorEvent",
"SendOkEvent"
};
// ilo ć opisów elementów kontrolnych formularza
private final static int DESCNUM = 6;
/**
* uruchomienie appletu
*/
public void run()
{
}
/**
* zainicjowanie appletu
*/
public void init()
{
try {
parseArguments();
} catch(NoSuchElementException e) {
}
}
/**
* włšczenie wštku
*/
public void start()
{
sendMailThread = new Thread(this);
sendMailThread.start();
}
/**
* wyłšczenie wštku
*/
public void stop()
{
sendMailThread.stop();
sendMailThread = null;
}
/**
* wy wietlenie grafiki
*/
public void paint(Graphics g)
{
mailForm.paint(g);
}
/**
* od wieżenie grafiki
*/
public void update(Graphics g)
{
paint(g);
}
/**
* metoda wywoływana przy wystšpieniu zdarzenia
*/
public boolean action(Event evt, Object obj)
{
if (mailForm != null) {
if (obj.equals(mailForm.buttonDesc))
{
String name = mailForm.name.getText();
String email = mailForm.email.getText();
String age = mailForm.age.getText();
String city = mailForm.city.getText();
String country = mailForm.country.getText();
// sprawdzenie czy wszyskie pola formularza sš wypełnione
if ((name .length() == 0) ||
(age .length() == 0) ||
(city .length() == 0) ||
(country.length() == 0))
{
showDocument(nameErrorDoc, msgWindowName);
return true;
}
// sprawdzenie wieku
int ageValue = Integer.parseInt(age.trim());
if (ageValue < 18 || ageValue > 100)
{
showDocument(ageErrorDoc, msgWindowName);
return true;
}
mailForm.button.disable();
// sporzšdzenie pełnej informacji
String fullInfo = "Imie i nazwisko osoby glosujacej...: <" +
name + ">\n" +
"E-mail.............................: <" +
email + ">\n" +
"Wiek...............................: <" +
age + ">\n" +
"Miasto.............................: <" +
city + ">\n" +
"Kraj...............................: <" +
country + ">\n" +
"\n" + message;
// sprawdzenie czy adres email jest poprawny
if (email.indexOf("@") == (-1) || email.length() == 0)
{
try {
email = InetAddress.getLocalHost().getHostName();
} catch(Exception e) {
}
}
/****************************************************************************************************/
// wysłanie danych
try {
SendMail sendmail = new SendMail(getDocumentBase().getHost(),
email);
sendmail.sendMessage(recipient, subject, fullInfo);
// wy wietlenie dokumentu 'SendOkEvent' po poprawnym
// wysłaniu poczty
showDocument(sendOkDoc, msgWindowName);
} catch(Exception e) {
showDocument(socketErrorDoc, msgWindowName);
}
/****************************************************************************************************/
}
}
return true;
}
/**
* wy wietlenie dokumentu informujšcego o stanie głosowania
*/
private void showDocument(String doc, String window)
{
try {
getAppletContext().showDocument(new URL(getDocumentBase(), doc),
msgWindowName);
} catch(Exception e) {
}
}
/**
* rozpoznanie argumentów appletu
*/
private void parseArguments() throws NoSuchElementException
{
String param;
Color color;
// kolor tła
param = getParameter(paramName[DESCNUM]);
if (param == null) {
color = Color.gray;
} else {
color = new Color(new HexConverter().hexToDec(param));
}
// adres docelowy
param = getParameter(paramName[DESCNUM + 1]);
if (param == null) {
throw new NoSuchElementException("Brak adresu docelowego");
} else {
recipient = param;
}
// temat
param = getParameter(paramName[DESCNUM + 2]);
if (param == null) {
subject = "<NONE>";
} else {
subject = param;
}
// tekst wiadomo ci
param = getParameter(paramName[DESCNUM + 3]);
if (param == null || param.equals("null")) {
message = "\n\n <KONIEC WIADOMOSCI>";
} else {
message = param;
}
// nazwa okna przeglšdarki w którym będš się pojawiać komunikaty
zwrotne
param = getParameter(paramName[DESCNUM + 4]);
if (param == null) {
msgWindowName = "_self";
} else {
msgWindowName = param;
}
// dokument wywoływany przy złym wypełnieniu formularza
param = getParameter(paramName[DESCNUM + 5]);
if (param != null) {
nameErrorDoc = param;
}
// dokument wywoływany przy złym wieku głosujšcego
param = getParameter(paramName[DESCNUM + 6]);
if (param != null) {
ageErrorDoc = param;
}
// dokument wywoływany przy błędzie połšczenia z serwerem
param = getParameter(paramName[DESCNUM + 7]);
if (param != null) {
socketErrorDoc = param;
}
// dokument wywoływany po poprawnym głosowaniu
param = getParameter(paramName[DESCNUM + 8]);
if (param != null) {
sendOkDoc = param;
}
makeMailForm (color);
setBackground(color);
}
/**
* utworzenie formularza do głosowania
*/
private void makeMailForm(Color color)
{
String[] desc = new String[DESCNUM];
for(int i = 0; i < DESCNUM; i++) {
desc[i] = getParameter(paramName[i]);
if (desc[i] == null) {
throw new NoSuchElementException("Brak jednego z parametrów
opisowych elementu kontrolnego");
}
}
mailForm = new MailForm
(
this,
desc[0] + " ",
desc[1] + " ",
desc[2] + " ",
desc[3] + " ",
desc[4] + " ",
desc[5],
color
);
add(mailForm);
Dzięki wielkie!
Naprawdę będzie co analizować :-).
Oto mi właśnie chodziło.
> p.g.
Pozdrawiam wylewnie
>> Też chciałbym wiedzieć, co to znaczy zrobić ręcznie.
> To znaczy polaczys sie z serverem port 25, wyslac FROM i inne rzeczy i
> zakonczyc polaczenie. (patrz RFC ilestam). To jest dla mnie robienie tego
> recznie w odroznieniu od korzystania z gotowej biblioteki z klasami w
> ktorych robisz mail.setFromHeader("bla...@usa.net");
Dzięki za oświecenie! Teraz już jestem w stanie napisać coś takiego sam
(chyba).
>> Czy mógłbyś przesłać ten kod (może być na grupę - inni niech też popatrzą)
> To nie do mnie.
Oczywiście, że nie do Ciebie :-). Spojrzyj komu odpowiadałem.
>> W moim pierwszym pytaniu chodziło o to czy da się to zrobić bez korzystania
>> z dodatkowych bibliotek, zwłaszcza komercyjnych.
> javax.mail nie jest komercyjna - mozna z niej korzystac za darmo.
> A jezeli chodzi ci bez bibliotek w ogolnosci to kod ktory podesle ci pan
> Pawel to tez bedzie swego rodzaju biblioteka czyz nie ?
> Alternatywa jest zawsze new Socket("server", 25);
Jeszcze raz dziękuję za wskazówki, czasami trochę wolno kojarzę :-)
> Artur
Pozdrawiam