# Spam-Mail-Versand Hausarbeit



## egaal (27. Jul 2017)

Hallo, das hier ist mein erster Beitrag hier und ich brauche eure Hilfe.
Ich muss für eine Hausarbeit ein Programm erstellen, welches den Versand von Spam-Mails plant und dann einen Zeitplan ausgibt. Das Grundgerüst habe ich schon fertig, jedoch hapert es bei mir dabei, die Tage durch zu zählen. Ich habe erst versucht, alle Monate von selbst zu definieren - 30 Tage, 31 Tage, Schaltjahre etc. - komme aber an diesem Punkt nicht weiter. 
Als Tipp haben wir bekommen, es mit JavaUtil.GregorianCalendar zu probieren, aber das habe ich auch noch nicht so ganz hinbekommen. Dann habe ich ein bisschen im Internet gesucht und bin auf JodaTime gestoßen. Vielleicht kann mir ja jemand verraten, was die beste vorgehensweise ist. Ich bin blutiger Anfänger was Java angeht, beherrsche aber die Basics einigermaßen, hab nur mit der Struktur immer meine Probleme.
Ich würde mal meinen Versuch als Anhang hochladen, sowie die Aufgabenstellung. 
Vielen Dank schon mal im Vorraus.


----------



## VfL_Freak (27. Jul 2017)

Moin und Willkommen 
zuerst mal: poste Code bitte immer in Code-Tags (siehe meine Signatur).
Er ist dann besser lesbar und vor allen auch besser zitierbar!
Außerdem öffnen viele heir nicht gerne unbekannte Dokumnte!



egaal hat gesagt.:


> Ich habe erst versucht, alle Monate von selbst zu definieren - 30 Tage, 31 Tage, Schaltjahre etc. - komme aber an diesem Punkt nicht weiter


Was genau heißt? An welcher Stelle denn ?

Lies Dir auch bitte mal dies hier durch, dass DIR und UNS weiterhilft :
http://www.java-forum.org/forum-faq-beitraege/7407-man-fragen-richtig-stellt.html

So ganz auf die Schnelle ist mir an Deinem Code nichts aufgefallen ... 

VG Klaus

*EDIT:*
>> System.out.println("Der Februar hat nur 28 Tage wenn kein Schaltjahr ist!");
hier sollte besser 29 stehen


----------



## egaal (27. Jul 2017)

Vielen Dank erstmal für deine schnelle Antwort! 
Also für die Benutzergruppe Agestellte und Beamte sollen die Mails ja nur an Werktagen versendet werden. 
Über GregorianCalendar würde ich ja an den Wochentag kommen, aber wie addiere ich dann einen oder zwei Tage? Also je nachdem ob es ein Samstag oder Sonntag ist. Wenn ich mit der Kalender Klasse arbeite muss ich die Ausgabe wahrscheinlich auch anders gestalten oder?


----------



## egaal (27. Jul 2017)

Den Code füge ich dann an dieser Stelle nochmal ein wie gewünscht!

```
//import java.util.GregorianCalendar;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Zeitplan {
   
    /* Empfaenger=0 Privat , Empfaenger=1 Firmen , Empfaenger=2 Behörden

    /*    Datum muss das Format tt.mm.jjjj haben */
   
    public boolean erstelleZeitplan(int empfaenger, String datum) {
       
        if (empfaenger<0 || empfaenger>2)
        {    System.out.println("Da lief was schief");
            return false;
        }
       
        String[] meinDatum = datum.split("\\.");
       
       
       
        if(meinDatum.length!=3) {
            System.out.println("Da lief was falsch");
            return false;
        }
       
        int tag   = Integer.parseInt(meinDatum[0]);
        int monat = Integer.parseInt(meinDatum[1]);
        int jahr  = Integer.parseInt(meinDatum[2]);
        GregorianCalendar calendar = new GregorianCalendar(jahr, monat, tag);
       
        //int i = calendar.get(calendar.DAY_OF_WEEK);
           
        if(tag<1 || tag>31) {
            System.out.println("Falscher Tag");
            return false;
        }
       
        if(monat<1 || monat>12) {
            System.out.println("Falscher Monat");
            return false;
        }
       
        if(jahr<2010 || jahr>2050) {
            System.out.println("Das Jahr muss zwichen 2010 und 2050 liegen");
            return false;
        }
       
       
        //Monate mit 30 Tagen pruefen
        if((monat==4 || monat==6 || monat==9 || monat==11) && tag>30) {
            System.out.println("Dieser Monat hat nur 30 Tage!");
            return false;
        }
       
       
        //Schaltjahr pruefen
        if (monat==2 && jahr%4==0 && tag>28 )    {
            System.out.println("Der Februar hat nur 28 Tage wenn kein Schaltjahr ist!");
            return false;
        }
       
       
        /*
         Ab hier muessen jetzt die Personen uberprueft werden
         */
       
        int aktMonat=monat;
        int aktTag = tag;
        int aktJahr= jahr;
       
        //private Benutzer
       
        if(empfaenger==0) {
           
        do {   
            /* Nur 30 Tage */
            if (aktMonat==4 || aktMonat==6 || aktMonat==9 || aktMonat==11)
            {
                while(aktTag<31) {
                    System.out.println("Tag: "+aktTag +"  Monat: "+aktMonat+"  Jahr: "+ aktJahr + "   Empfaenger: privat");
                    aktTag+=8;
                }
                           
                aktTag=aktTag-30;
               
            }
            //Februar
            else if (aktMonat==2)
            {
                if(jahr%4==0)        //Schaltjahr
                {
                    while(aktTag<30) {
                        System.out.println("Tag: "+aktTag +"  Monat: "+aktMonat+"  Jahr: "+ aktJahr + "\t Empfaenger: privat");
                        aktTag+=8;
                    }
                   
                    aktTag= aktTag-29;
                }
               
                else  {    //kein Schaltjahr
                    while(aktTag<29) {
                        System.out.println("Tag: "+aktTag +"  Monat: "+aktMonat+"  Jahr: "+ aktJahr + "\t Empfaenger: privat");
                        aktTag+=8;
                    }
                   
                    aktTag=aktTag-28;
                }
            }
           
           
            else {
                while(aktTag<32) {
                    System.out.println("Tag: "+aktTag +"  Monat: "+aktMonat+"  Jahr: "+ aktJahr + "\t Empfaenger: privat");
                    aktTag+=8;
                }
                           
                aktTag=aktTag-31;
            }
           
           
           
           
           
            if(aktMonat==12)
                aktMonat=1;
           
            else
                aktMonat++;   
        }while(aktMonat!=monat);    //Hoere auf wenn ein Jahr vorbei
       
        return true;
        }
       
       
        return false;
    }
   
   
   
   
   
   
   
   
   
   
   
   
   
    public static void main(String args[]) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
       
       
        while(true) {
            Zeitplan zeitPlan = new Zeitplan();
           
            System.out.println("Geben Sie den Empfaenger ein: 0 fuer Privat, 1 fuer Firma, 2 fuer Behoerde");
            int empf= Integer.parseInt(reader.readLine());
           
            System.out.println("Geben Sie das Datum ein ab dem der Zeitplan erstellt werden soll");
            String datum = reader.readLine();
           
           

           
           
            zeitPlan.erstelleZeitplan(empf, datum);
           
           
        }
    }
}
```


----------



## VfL_Freak (27. Jul 2017)

Moin,
mit welcher Java-version arbeitet ihr denn ?
Dürft ihr sowas wie GregorianCalendar nutzen ?

Hier mal zwei Links zu dem Thema
https://dbs.cs.uni-duesseldorf.de/lehre/docs/java/javabuch/html/k100106.html
https://kevcodez.de/index.php/2015/07/java-8-date-und-time-api-neue-datumsfunktionen/

VG Klaus


----------



## egaal (27. Jul 2017)

Ja, Gregorian Calendar wurde uns sogar empfohlen, weiss nur nicht recht damit umzugehen, ich könnte ja dann den ganzen code, in dem ich die Monate einzeln definiert habe, ersetzen können richtig? Habe als alternative auch JodaTime gefunden, ist das evtl einfacher als GregorianCalendar oder eher nicht so?


----------



## egaal (27. Jul 2017)

Und wie bekomme ich denn das Datum aus meiner Abfrage als Startdatum für den Zeitplan?


----------



## VfL_Freak (27. Jul 2017)

Moin,

also, ich nehme auch JodaTime, da es in einigen Dingen angenehmer als GregorianCalendar ist!
Oder eben gleich die neue Date/Time-API von Java8 (die allerdings auch nicht kenne, sie ist aber Joda-basiert).

Hier mal der Link zur API von GregorianCalendar: https://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html
oder: http://www.programcreek.com/java-api-examples/java.util.GregorianCalendar

VG Klaus


----------



## VfL_Freak (27. Jul 2017)

egaal hat gesagt.:


> Und wie bekomme ich denn das Datum aus meiner Abfrage als Startdatum für den Zeitplan?


Dass kannst Du einfach setzen, so wie in den Beispielen beschrieben!

VG Klaus

*EDIT:*
und noch drei Links zum Einlesen
http://joda-time.sourceforge.net/quickstart.html
https://kodejava.org/how-do-i-create-datetime-object-in-joda-time/
https://stackoverflow.com/questions/20331163/how-to-format-joda-time-datetime-to-only-mm-dd-yyyy


----------



## Flown (27. Jul 2017)

Joda wird gar nicht mehr weiterentwickelt? Sie verweisen jetzt darauf, dass man die Java datetime api verwenden sollte.


----------



## egaal (27. Jul 2017)

Gibt es vielleicht eine Seite die mir Jede Zeile erklärt? Ich denke so wäre es einfacher für mich zu verstehen wo ich was zu tun habe. Den Anfang habe ich mit einem Freund gemacht, der aber leider jetzt im Urlaub ist.


----------



## Flown (27. Jul 2017)

Kannst du auch hier die Auszüge (also Beispiel Ein-/Ausgabe) hier posten?


----------



## egaal (30. Jul 2017)

Ich bin ein erhebliches Stück weiter gekommen und stehe jetzt vor der nächsten aufgabe: 
Ich möchte die Anweisungen genau für ein Jahr durchlaufen lassen damit sich der Zeitplan für ein Jahr ergibt. 

Meine Anweisungen für eine Empfängergruppe sieht bis jetzt so aus.

```
if(empfaenger==1)
        {
           
            if(calendar.get(calendar.DAY_OF_WEEK)==1)
                {
                calendar.add((GregorianCalendar.DAY_OF_YEAR),1);
                System.out.println("Spam versand an diesem Tag:"+calendar.getTime());
                calendar.add((GregorianCalendar.DAY_OF_YEAR), 16);
                }
            else if(calendar.get(calendar.DAY_OF_WEEK)==7)
                {
                calendar.add((GregorianCalendar.DAY_OF_YEAR), 2);
                System.out.println("Spam versand an diesem Tag:"+calendar.getTime());
                calendar.add((GregorianCalendar.DAY_OF_YEAR),16);
                }
            else
            {
                System.out.println("Spam versand an diesem Tag:"+calendar.getTime());
                calendar.add((GregorianCalendar.DAY_OF_YEAR),16);
            }
```

hier soll der versand alle 16 Tage stattfinden und an wochenenden auf den folgenden Montag verschoben werden, da Mitarbeiter in einer Firma. 
Ich muss diese Anweisungen jetzt nur noch genau ein Jahr in schleife laufen lassen.


----------



## Flown (31. Jul 2017)

@egaal Ich wiederhole: Kannst du auch hier die Auszüge (also Beispiel für Ein-/Ausgabe) hier posten? Anders ausgedrückt, wie sollte das Ergebnis aussehen?


----------

