[C#, VB.NET, F#, ...] Mailen met GMail in C#

[]
De code voor VB.NET stond er al, nu heb ik ook nog even snel code geschreven voor c#
ik ben NIET verantwoordelijk voor wat je met dit script doet. Als je er iets slechts mee doet, is dat jouw probleem, niet de mijne.
Door deze code te gebruiken ga je ermee akkoord dat alles wat je ermee doet op eigen risico is.

Ik zag dat er wel een VB.NET script was voor mailen, maar niet een c# script. Dit is een functie die je zo kan plakken in je programma, zolang dit maar hebt:
using System.Net;
using System.Net.Mail;


De volgende argumenten kunnen worden gegeven:
-Username
Google gebruikersnaam
-Password
Google wachtwoord
-From
Het adres waarop het From item wordt ingesteld. Bij mijn tests werkte dit niet. Als je deze niet wil gebruiken kun je hem instellen op je GMail adres.
-To
Het adres waar je naartoe mailt
-Subject
Het onderwerp van de email
-Body
De tekst (body) van de email
-Attachments
De bijlagen als een AttachmentCollection. null geven als je geen bijlagen wilt gebruiken. Als je die wel wilt gebruiken, kun je meer informatie over de AttachmentCollection vinden op MSDN
-SMTPServer
De URL van de SMTP server. Hoeft niet opgegeven te worden. Standaard is deze voor Gmail smtp.gmail.com. Als je een andere server wilt proberen, verander deze tekst dan.
-SMTPPort
De poort voor de SMTP server. Hoeft niet opgegeven te worden. Standaard is deze voor Gmail 587. Als je een andere server gebruikt moet je deze misschien aanpassen.
-UseSSL
Of SSL gebruikt moet worden. Hoeft niet opgegeven te worden. Standaard is deze ingeschakeld omdat die nodig is voor Gmail. Als je een andere server wilt gebruiken, moet je hem misschien op false zetten.


AANROEPEN:
De laatste drie argumenten hoeven niet, maar mogen wel. De argumenten zijn bedoeld voor gebruik van andere servers, zoals bijvoorbeeld Hotmail. Ik heb dit niet getest, misschien moet je wat code aanpassen, maar gmail werkt in ieder geval.

if( SendGMail("gebruikersnaam", "wachtwoord", "van@email.adres", "doel@email.adres", "Titel van je bericht!", "Tekst van je bericht", null , "smtp.gmail.com", 587, true) )
{
       //Bericht succesvol verzonden
} else {
       //Het bericht is niet verzonden door een fout.
}



Dit stuurt een bericht van google account "gebruikersnaam", met wachtwoord "wachtwoord" met als header voor afzender "van@email.adres" naar "doel@email.adres". Het bericht heeft de titel "Titel van je bericht" en de tekst "Tekst van je bericht". Het heeft geen bijlagen en wordt via de standaardinstellingen van Gmail verstuurd.

EDIT: In plaats van een int returned de code nu een bool, is makkelijker (dank je voor het aangeven, LaugHawa)

EDIT 2: De MessageBox is nu vervangen door een throw, zodat je zelf de fouten kan afhandelen. Aangepast via mijn mobieltje, de hoofdletters in de throw lijn kunnen fouten bevatten.

//Dit stuk zie je terug in de code editor, kun je zelf ook genereren voor je eigen functies door /// te typen voor een functie

        ///
        /// Een email versturen over Gmail
        ///

        /// De gebruikersnaam voor Gmail
        /// Het wachtwoord voor Gamil
        /// Het adres waar de email wordt verstuurd zogenaamd wordt verstuurd, werkt misschien niet
        /// Het doeladres
        /// Het onderwerp van de email
        /// De tekst van de email
        /// De bijlagen, als een AttachmentCollection.
        /// Voor meer informatie, zie http://msdn.microsoft.com/en-us/library/system.net.mail.attachmentcollection.aspx#Y0
        /// De server voor gmail, Optioneel.
        /// De standaardserver is smtp.gmail.com
        /// Als je een andere server wilt gebruiken, gebruik dan deze waarde om het webadres op te geven
        /// De poort voor gmail. Optioneel
        /// De standaardpoort is 587
        /// Als je een andere server wilt gebruiken, pas dan dit getal aan zoals in de documentatie van de emaildienst staat
        /// SSL gebruiken bij true. Optioneel
        /// SSL is nodig voor Gmail
        /// Als je een andere server wilt gebruiken, moet je misschien deze waarde op false zetten
        /// true voor OK, false voor fout
        public bool SendGMail(String Username, String Password,
                String From, String To, String Subject, String Body, AttachmentCollection Attachments = null,
                String SMTPServer = "smtp.gmail.com", int SMTPPort = 587, bool UseSSL = true){

            //////////////////////////////SMTP server instellen//////////////////////////////////////////////////////////////
            SmtpClient Server = new SmtpClient();                               //Nieuwe client maken voor de SMTP server
            Server.UseDefaultCredentials = false;                               //Nodig, niet na "Server.Credentials = new..." zetten, dan krijg je fouten. Geeft aan dat je je eigen inloggegevens wilt gebruiken
            Server.Host = SMTPServer;                                           //De host instellen op het webadres van de SMTP server
            Server.Port = SMTPPort;                                             //De poort instellen
            Server.Credentials = new NetworkCredential(Username, Password);     //Nieuwe credentials maken op basis van je gebruikersnaam en wachtwoord
            Server.EnableSsl = UseSSL;                                          //Instellen of SSL gebruikt moet worden

            //////////////////////////////email object maken en voorbereiden/////////////////////////////////////////////////

            MailMessage msg = new MailMessage(From, To, Subject, Body);         //Nieuw object maken voor de email. From, To Subject en Body zijn de argumenten van de functie
            if (Attachments != null)                                            //Als er een lijst met bijlagen is gegeven:
            {
                for (int i = 0; i < Attachments.Count(); i++)                   //Alle bijlagen langsgaan
                {
                    msg.Attachments.Add(Attachments[i]);                        //De bijlage toevoegen aan het bericht
                }
            }

            ///////////////////////////////email verzenden///////////////////////////////////////////////////////////////////
            try                                                                 //Nodig, voor als er fouten zijn
            {
                Server.Send(msg);                                               //Bericht msg verzenden met SmtpClient Server
            }
            catch (SmtpException e)                                             //Als er iets mis ging met het verzenden van het bericht
            {
                /*         Nieuw: exception handling aan de gebruiker overlaten*/
                throw new Exception("Fout tijdens emailen.\nDe opgeven fouttekst is:\n\n\"" + e.Message + "\"\n\nAls overeenkomt met \"The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn more at\", controleer dan de gebruikersnaam en het wachtwoord.");
                return false;                                                       //Aangeven dat er iets mis ging
                throw;                                                          //Standaard try...catch...throw
            }
            return true;                                                           //Aangeven dat er niets misging
        }

Reacties (5)

 
Mooie tut, maar is het niet zo dat je ook hotmail kunt gebruiken. gwn de smtp server en de poort aanpassen?
 
@gertmenkel
waarom een 0 en 1 returnen ?
kun je niet beter een bool maken en dan een true of false returnen ? dan kun je de functie direct in een if zetten en hoef je niet nog eens te controleren of je nou 0 of 1 hebt terug gekregen

voorbeeld.
if(sendgmail){
}

if(sendgmail == false){
}

lijkt mij makkelijker te begrijpen en al helemaal als je bijvoorbeeld de functie gebruikt als mail.send of zo iets dan
if(sendgmail == 1){
}

if(sendgmail == 0){
}

verder mooi gedaan

@steelnose
dit klopt inderdaad. MAAR vergete je credentials niet ook aan te passen ;)
deze worden namelijk door gmail en hotmail gecontroleert
 
@steelnose
Je kunt inderdaad de server en de poort aanpassen als je wilt, deze pagina lijkt ongeveer dezelfde code te gebruiken, maar zou moeten werken met hotmail: http://stackoverflow.com/questions/5451 ... r-in-c-app

@LaugHawa
Ik wilde eerst voor verschillende fouten verschillende return waarden geven, maar ik dacht dat alleen de SmtpException problemen zou gaan geven (omdat de tekst me lijkt te verschillen per server) en heb de andere getallen weggehaald. Ik zal het even verbeteren.

Edit: falende spelling/woorkeuze
 
@gertmenkel
je hebt er nu een void van gemaakt:)
het moet een bool worden een void mag  niks returnen.

ik zou kwa errors gewoon "throw new exception();" gebruiken. dan kan de gebruiker met een try zijn eigen fouten opvangen en zelf bepalen wat die daar mee wil doen.
 
@LaugHawa. Nu dan :D ?
[Reactie plaatsen]

Details

Avatar gertmenkel
Door: gertmenkel
Taal: C#, VB.NET, F#, ...
12/10/2011 18:03
2357x bekeken

Opties

Ik vind dit: Leuk  Niet leuk
Leuk
2
Niet leuk
0
Naar boven