Mail verschicken
-
Hallo,
ich habe ein kleines Programm geschrieben, das eine Mail verschicken soll. Es orientiert sich an den vielen, einfach gehaltenen Beispielen, die in den Büchern zum Thema Java gelistet werden. (Java ist auch eine Insel z.B.)
Jetzt habe ich nur das Problem, dass, wenn ich online bin, und den Verschicken-Button drücke, eine Fehlermeldung auftaucht, die folgendes besagt:java.net.SocketException: Network is unreachable: connect.
Warum bekommt das Programm keine Verbindung hin, und überhaupt, ist es einfach so möglich eine Mail zu verschicken? Ich könnte ja als Absender irgendwen angeben, das Programm so modifizieren, dass aus einer Mail mal eben hundert werden und schon erfüllt es nicht seinen eigenen Zweck.
Bitte um Hilfe bei Bewältigung dieses Problems.
Vielen Dank für Antworten im voraus!
-
hmm : frage:
was hast du benutzt? einen client, der mit einem mailserver connected?
dann braucht es einen mailserver. der wird angesprochen und dem wird dann die mail übergeben. die api macht ein "hallo, versende das bitte" und der server sendet dann weg.
welchen mailserver nutzt du?
-
Original erstellt von <Fragender>:
Warum bekommt das Programm keine Verbindung hin, und überhaupt, ist es einfach so möglich eine Mail zu verschicken? Ich könnte ja als Absender irgendwen angeben, das Programm so modifizieren, dass aus einer Mail mal eben hundert werden und schon erfüllt es nicht seinen eigenen Zweck.Genau damit sprichst Du das Problem der Spam-Mails an. Im Prinzip kann jeder als Absender-Email irgendwas reinschreiben. Dies aber nur solange der SMTP-Server dies auch zuläßt. Zum Glück ist die Zahl der freien, öffentlichen SMTP-Server gesunken aber dennoch gibts sie immer noch.
Zu deinem Problem: Ich würde mal hinterfragen, ob dein SMTP-Server nicht vorher noch eine POP3-Authentifikation benötigt. Dies ist sehr häufig der Fall. Dann müsstest du zuerst über POP3 deinen Zugang auf neue Mails prüfen und dann erst via SMTP deine Mail verschicken. Ich hab ein Beispiel wie man so etwas machen kann. Wenn es dich interessiert poste ich es hier rein.
-
Fänd ich klasse, wenn du das machen könntest.
Also ich wollte an meine yahoo Adresse eine Mail schicken - zum Test.
Das läuft dann so ab:
Socket socket = new Socket(mail.yahoo.de, 25);
etc...
printWriter.write("Hello " + "mail.yahoo.de");das ganze noch mit Empfänger, RCPT To, Subject, DATA, mit den jeweils benötigten Daten.
Weiterhin Danke für Antworten im voraus!
-
Aha du benutzt also gar nicht die Java Mail-API (http://java.sun.com/products/javamail/)?
-
Wäre wohl besser, was? Warum geht das denn nicht so, wie ich mir das vorstelle ohne Mail-Api?
Danke im voraus!
-
Wie gesagt viele SMTP-Server verlangen dass du über POP3 eine authentifizierung vornimmst.
-
Ich werde mich jetzt mit der Mail-Api auseinandersetzen, aber deiner Antwort entnehme ich, dass die Authentifizierung dabei wegfällt.
Naja, wenn ich das Programm auf die bisherige Art nutzen wollte, könnte ich gleich, da ich mich zuerst Authentifizieren muss, meine Mails von dieser Adresse aus losschicken.
Danke für die Antworten!
-
Nee wegfallen tut sie dadurch nicht nur das Verschicken gestaltet sich komfortabler.
Ich poste mal nen Code-Ausschnitt aus einem meiner Programme[java]/*
* Copyright (c) 2001 Sahin Computing Systems(R), Germany.
* All rights reserved.
* Original Author: Cengiz Sahin
*/
package de.sahinc.jmail.mailing;import java.util.Properties;
import javax.mail.;
import javax.mail.internet.;
import javax.activation.;
import java.util.;
import java.io.InputStream;
import java.io.IOException;import java.io.File;
import java.io.FileInputStream;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;import de.sahinc.jmail.accounts.*;
import de.sahinc.gui.ExceptionMessage;/** SendMultiPartMessage sends an eMail-Message to a given list of receivers (normal, cc and/or bcc)
* and handles also attached files with their appropriate MIME-Types.
*/
public class SendMultiPartMessage {
private Account sender = null;/** An authenticator for POP-Authentication
*/
private Authenticator auth = null;/** Flag that shows whether sending emails should preceed POP-Authentification
*/
private Boolean smtpAfterPop = null;/** A Vector that stores the senders addresses
*/
private Vector fromVector = new Vector(0, 1);/** A Vector that stores the Receivers addresses
*/
private Vector toVector = new Vector(0, 1);/** The message-object to be sent
*/
private Message message = null;/** A session for sending emails and authentification
*/
private Session session = null;/** A property-object
*/
private Properties props = System.getProperties();/** The store for authentification
*/
private Store store; // for authentification/** Public constructor that starts the process of sending eMails automatically right after
* intialization
* @throws Exception If an error regarding send-process occurs
*/
public SendMultiPartMessage(Account fromAccount, String subject, Vector rcvList, Vector ccList, Vector bccList, Vector fileArray, StringBuffer text, int prio) throws Exception {
this.sender = fromAccount;// Setup mail servers
props.put("mail.smtp.host", fromAccount.getOutgoingMailHost());
props.put("mail.pop3.host", fromAccount.getIncomingMailHost());// Setup authentication (if needed), get session
smtpAfterPop = new Boolean(fromAccount.getSmtpAfterPop());
if (smtpAfterPop.booleanValue()) {
auth = new PopupAuthenticator(fromAccount);
}// If we do not need to authentificate us with POP before sending auth is null so everything is all right then
session = Session.getDefaultInstance(props, auth);if (smtpAfterPop.booleanValue()) {
if (store == null) {
store = session.getStore("pop3");
store.connect();
}
}// Create the message
message = new MimeMessage(session);fillHeaders(message, fromAccount, subject, rcvList, ccList, bccList, prio);
addMainBodyPart(message, text, fileArray);
}/** Fills the Header of the given message with sender, receiver and subject.
* @param message The message that will get the Headers
* @param index The index of the email that will get a header
* @throws MessagingException If any error with the header occurs
* @throws AddressException If the given addresses are malformed
*/
private void fillHeaders(Message message, Account fromAccount, String subject, Vector rcvList, Vector ccList, Vector bccList, int prio) throws MessagingException, AddressException{
String fromAddress = fromAccount.getMailAddress();
String fromUser = fromAccount.getUserInfo();// Fill its headers
message.setSubject(subject);
try {
message.setFrom(new InternetAddress(fromAddress, fromUser));
} catch (UnsupportedEncodingException ueex) {
message.setFrom(new InternetAddress(fromAddress));
}for (int i=0; i<rcvList.size(); i++) {
message.addRecipient(Message.RecipientType.TO, new InternetAddress((String)rcvList.elementAt(i)));
}for (int i=0; i<ccList.size(); i++) {
message.addRecipient(Message.RecipientType.CC, new InternetAddress((String)ccList.elementAt(i)));
}for (int i=0; i<bccList.size(); i++) {
message.addRecipient(Message.RecipientType.BCC, new InternetAddress((String)bccList.elementAt(i)));
}
message.addHeader("X-Priority", ""+prio);
message.setHeader("X-Mailer", "JMail (pure Java-Client)");}
/** Adds the main body part of the email to be transmitted to the message
* @param message The message that will get the body
* @param id The emailID
* @throws MessagingException If any error regarding the message occurs
*/
private void addMainBodyPart(Message message, StringBuffer text, Vector fileArray) throws MessagingException {
// Create your new message part
BodyPart messageBodyPart = new MimeBodyPart();// Set the content of the body part
messageBodyPart.setContent(text.toString(), "text/plain");// Create a related multi-part to combine the parts
MimeMultipart multipart = new MimeMultipart("related");// Add body part to multipart (normally the text)
multipart.addBodyPart(messageBodyPart);addAttachedParts(message, multipart, messageBodyPart, fileArray);
}/** Adds all attachements for this <code>emailID</code> to the message
* @param multipart The multipart that is going to be extended by attachements
* @param messageBodyPart The messagebody
* @param emailID The emailID to have a reference on the attachements to get
* @throws MessagingException If any error regarding the message-object occurs
*/
private void addAttachedParts(Message message, MimeMultipart multipart, BodyPart messageBodyPart, Vector fileArray) throws MessagingException {
// Create part for the file
messageBodyPart = new MimeBodyPart();
String cid = new String();
String mime = new String();for (int i=0; i<fileArray.size(); i++) {
messageBodyPart = new MimeBodyPart();
File theFile = (File)fileArray.elementAt(i);
FileDataSource bds = new FileDataSource(theFile);
messageBodyPart.setDataHandler(new DataHandler(bds));
messageBodyPart.setFileName(theFile.getName());multipart.addBodyPart(messageBodyPart);
}// Associate multi-part with message
message.setContent(multipart);// Send message
Transport.send(message);
}
}[/code]
-
Na, wenn das nicht wegfällt, dann gehts vielleicht auch so, denn ich habe das so erstellt, dass MailServer, Absender, Empfänger und Titel über jeweils ein Textfeld eingegeben werden - der Inhalt über eine TextArea - und dann wird mit einem Abschicken Button, die Mail losgeschickt.
Was kann man da noch komfortabler machen? Diese Abfragen benötigt man ja so oder so.
Auf den Sprung gebracht, habe ich mir die entsprechenden Files runtergeladen und installiert. D.h. die JMail Api und das Bean Framework.
In dem beigelegten Tut werde ich aufgefordert aus den Demos die Datei msgsend.java zu kompilieren. Das klappt auch (Classpath ist auf mail.jar bzw. activision.jar gesetzt - ich hab sie sogar in die lib/ext von der jre kopiert)
Aber, wenn ich Ausführen will, gibt es einen NoClassDefFoundError, der besagt, dass javax/mail/Message nicht gefunden wird.
Ich hab nochmal alles überprüft, aber wenn es sich schon kompilieren lässt, dann muss es doch auch ausführbar sein. Oder fehlt da eine Klasse in der mail.jar?Nochwas
Ich habe in der autoexec.bat wie gewohnt den Classpath gesetzt: auf mail.jar und activision.jar. Aber ohne explizite Classpath Angabe, auf mail.jar kann ich nicht kompilieren. Das System wurde auch schon neu gestartet, deshalb müsste da alles paletti sein. Komisch.Vielen Dank für Antworten im voraus!
-
Unter komfortabel meinte ich eher für den Programmierer Dem Anwender kann das egal sein ob du die JMailAPI genommen hast oder das ganze SMTP und POP3-Protokoll selbst implementiert hast. Und genau um die Implementation der Protokolle geht es ja letztendlich
Was dein Classpath für ein Problem hat kann ich ehrlich gesagt so gar nicht nachvollziehen. Höchstens dass dein java-Interpreter eine andere Classpath benutzt als der Compiler aber das hattest du ja glaube ich ausgeschlossen.