C# E-mailen via Gmail account

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mobstaa
  • Registratie: Juli 2010
  • Niet online
Hallo mensen,

Ik ben bezig met een applicatie en er moet een functie zijn om emails te kunnen sturen via die applicatie, dus heb ik met visual studio een form gemaakt om e-mails te kunnen sturen, er word via een substring gekeken of ik email via hotmail/live of via gmail.

Via hotmail werkt het gewoon goed, maar via gmail krijg ik een smtp exception: operation timed out.

Ik heb al meerdere verschillende ports gebruikt zoals: 25, 465 en 587, maar geen een van deze ports werkt.

Dit is de code die ik gebruik om te emailen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
       //nieuw bericht aanmaken
                MailMessage msg = new MailMessage();
                msg.To.Add(txtAan.Text);
                msg.From = new MailAddress(txtGebruikersnaam.Text);
                msg.Subject = txtOnderwerp.Text;
                msg.Body = txtBericht.Text;

                smtpcheck = txtGebruikersnaam.Text;
                smtpcheck = smtpcheck.Substring(Math.Max(0, smtpcheck.Length - 10));

                SmtpClient smtp = new SmtpClient();
                smtp.EnableSsl = true;

                //check of er gebruik word gemaakt van gmail, of van hotmail/live
                if (smtpcheck.ToLower() == "@gmail.com")
                {
                    smtp.Host = "smtp.gmail.com";
                    smtp.Port = 465;
                }
                else if(smtpcheck.ToLower() != "@gmail.com")
                {
                    smtp.Host = "smtp.live.com";
                    smtp.Port = 587;
                }
                smtp.Credentials = new NetworkCredential(txtGebruikersnaam.Text, txtWachtwoord.Text);
                smtp.Send(msg);


Hopelijk kan iemand mij vertellen, waarom het sturen van emails via gmail niet werkt.

Als iemand vragen heeft over mijn code, of over het probleem, reageer maar op dit topic, dan probeer ik z.s.m. antwoord te geven.

Alvast bedankt!

Nefit EnviLine 7400I AW 7 | Nefit HR 300 liter boiler | Nefit 50 liter buffervat | Nefit Moduline 1010H thermostaat | Buderus pomp | Home Assistant | BBQKees | Itho HRU 300R | Tibber


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
probeer het eens met ssl://smtp.gmail.com
wie weet maakt het uit.. verder zie ik zo 123 ook niet precies wat er is..
over het algemeen betekend een timeout dat je gewoon verkeerde ip/poort gebruikt

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • Chrotenise
  • Registratie: December 2011
  • Niet online
Met je poort probleem kan ik je niet helpen, maar wel even iets om over na te denken:

code:
1
2
3
4
else if(smtpcheck.ToLower() != "@gmail.com")
                {
                    smtp.Host = "smtp.live.com";
                    smtp.Port = 587;


Je zegt hier dat als iets ingevuld is dat niet eindigt op @gmailcom, het een hotmail/live adres moet zijn. Wat als ik mijnemail@provider.nl invoer? Ik zou een check inbouwen voor @hotmail / @live / @outlook en dan de domeinnamen niet meenemen, aangezien die nogal uitgebreid zijn bij Microsoft.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Weet je zeker dat je niet geblokkeerd word door een firewall/proxy o.i.d. Ik zie zo niet direct een fout in je code, en ik heb wel vaker op deze manier gemaild via gmail. Volgens mij is 465 ook de juiste poort.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Rutix
  • Registratie: Augustus 2009
  • Laatst online: 05-09-2024
Ten eerste zou ik ook zorgen dat smtp word gedisposed door het gebruik van using.
C#:
1
2
3
4
using (SmtpClient smtp = new SmtpClient())
{
    // stuff here
}


Verder zie ik niet waar het fout gaat. 465 is een valide poort (ik gebruik meestal 587 maar 465 moet ook werken). Heb je wel IMAP aangezet in je google account waarvan je probeert te zenden? Afaik moet die namelijk aan staan.

Nothing to see here!


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Rutix schreef op dinsdag 11 december 2012 @ 08:11:
Heb je wel IMAP aangezet in je google account waarvan je probeert te zenden? Afaik moet die namelijk aan staan.
Nee IMAP hoeft niet aan te staan, maar SMTP wel. Probeer het eerst eens met een losse SMTP client, dan weet je zeker of het goed werkt voordat je aan je code begint te twijfelen.

[ Voor 19% gewijzigd door Woy op 11-12-2012 08:17 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Rutix
  • Registratie: Augustus 2009
  • Laatst online: 05-09-2024
Woy schreef op dinsdag 11 december 2012 @ 08:17:
[...]

Nee IMAP hoeft niet aan te staan, maar SMTP wel. Probeer het eerst eens met een losse SMTP client, dan weet je zeker of het goed werkt voordat je aan je code begint te twijfelen.
Je hebt gelijk inderdaad. Ik had de support page van gmail verkeerd geïnterpreteerd :p

Nothing to see here!


Acties:
  • 0 Henk 'm!

  • mobstaa
  • Registratie: Juli 2010
  • Niet online
BasieP schreef op maandag 10 december 2012 @ 23:01:
probeer het eens met ssl://smtp.gmail.com
wie weet maakt het uit.. verder zie ik zo 123 ook niet precies wat er is..
over het algemeen betekend een timeout dat je gewoon verkeerde ip/poort gebruikt
Dat is nu afgevangen en word de grootte van de substring veranderd, dus als er moet worden vergeleken met hotmail staat er substring(Math.Max(0, smtpcheck.Length - 12)

daar ligt het ook niet aan.

Kan het zijn dat toevallig mijn werk deze poort blokkeerd via het netwerk?

Nefit EnviLine 7400I AW 7 | Nefit HR 300 liter boiler | Nefit 50 liter buffervat | Nefit Moduline 1010H thermostaat | Buderus pomp | Home Assistant | BBQKees | Itho HRU 300R | Tibber


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dat kan je natuurlijk makkelijk testen met een gewonen SMTP client.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 20:39

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Levert het volgende stukje code niet juist het eerste deel van het adres op, in plaats van het stuk achter de @ :?
[code]smtpcheck = smtpcheck.Substring(Math.Max(0, smtpcheck.Length - 10));[/code]

Dat verklaart ook waarom het met hotmail wel werkt, want als dat substring doet wat ik denk dat het doet, dan is dat dus nooit gelijk aan gmail.com en wordt dus altijd de "else" tak uitgevoerd.

Dat werkt als er ook daadwerkelijk een hotmail/live adres staat, maar werkt niet als er een gmail adres staat.


Blijkbaar levert substring(x) alles na karakter nummertje x.

Anyway: om zeker te zijn dat het niet mis gaat met het checken van de string: kijk even of hij bij het gebruik van een gmail adres wel het juiste deel van de if uitvoert. Wellicht gaat daar toch ergens iets niet helemaal jofel en komt hij altijd in de "else" terecht waardoor er geprobeerd wordt om met gmail credentials op de live smtp in te loggen.

Anders even een netwerksniffer zoals wireshark laten meelopen tijdens het testen, om te zien of en zo ja, wat voor respons je van de smtp server krijgt.

[ Voor 80% gewijzigd door Orion84 op 11-12-2012 15:24 ]

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • Mint
  • Registratie: Mei 2005
  • Laatst online: 22:01
Met Orion84, maar ik ben ook benieuwd wat voor exception er optreedt. Of krijg je een timeout bij het verbinding maken?

Acties:
  • 0 Henk 'm!

Anoniem: 372738

Bij mij werkt jouw code wel met poort 587 voor Gmail.

offtopic:
Jouw 'domein check' is apart, waarom niet:
C#:
1
2
3
4
5
6
7
8
9
10
        if (txtGebruikersnaam.Text.ToLower().EndsWith("@gmail.com"))
        {
            smtp.Host = "smtp.gmail.com";
            smtp.Port = 587;
        }
        else
        {
            smtp.Host = "smtp.live.com";
            smtp.Port = 587;
        }


of beter nog (zoiets, heb ik niet getest)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        string domein = txtGebruikersnaam.Text.ToLower().Split('@')[1];

        switch (domein)
        {
            case "gmail.com":
                smtp.Host = "smtp.gmail.com";
                smtp.Port = 587;
                break;
            case "hotmail.com":
            case "live.com":
                smtp.Host = "smtp.live.com";
                smtp.Port = 587;
                break;
            default:
                throw new Exception("Unsupported mail domain");
        }

[ Voor 11% gewijzigd door Anoniem: 372738 op 11-12-2012 20:29 ]


Acties:
  • 0 Henk 'm!

  • Chrotenise
  • Registratie: December 2011
  • Niet online
Anoniem: 372738 schreef op dinsdag 11 december 2012 @ 20:23:
Bij mij werkt jouw code wel met poort 587 voor Gmail.

offtopic:
Jouw 'domein check' is apart, waarom niet:
C#:
1
2
3
4
5
6
7
8
9
10
        if (txtGebruikersnaam.Text.ToLower().EndsWith("@gmail.com"))
        {
            smtp.Host = "smtp.gmail.com";
            smtp.Port = 587;
        }
        else
        {
            smtp.Host = "smtp.live.com";
            smtp.Port = 587;
        }


of beter nog (zoiets, heb ik niet getest)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        string domein = txtGebruikersnaam.Text.ToLower().Split('@')[1];

        switch (domein)
        {
            case "gmail.com":
                smtp.Host = "smtp.gmail.com";
                smtp.Port = 587;
                break;
            case "hotmail.com":
            case "live.com":
                smtp.Host = "smtp.live.com";
                smtp.Port = 587;
                break;
            default:
                throw new Exception("Unsupported mail domain");
        }
Je vergeet hierbij dat Microsoft ook landspecifieke domeinen heeft uitgebracht zoals hotmail.nl en live.nl. Daarnaast hebben ze laatst ook natuurlijk outlook.com geopend. In het kort: als je alle domeinen van Microsoft wil gaan afvangen krijg je toch een redelijk lange lijst. Beter om gewoon op hotmail / live / outlook te zoeken en de extensie achterwege te laten. Dan is je code direct weer wat toekomstbestendiger. Denk bijvoorbeeld aan de nieuwe domeinnamen die eraan zitten te komen.

Acties:
  • 0 Henk 'm!

  • Rutix
  • Registratie: Augustus 2009
  • Laatst online: 05-09-2024
Chrotenise schreef op woensdag 12 december 2012 @ 02:38:
[...]


Je vergeet hierbij dat Microsoft ook landspecifieke domeinen heeft uitgebracht zoals hotmail.nl en live.nl. Daarnaast hebben ze laatst ook natuurlijk outlook.com geopend. In het kort: als je alle domeinen van Microsoft wil gaan afvangen krijg je toch een redelijk lange lijst. Beter om gewoon op hotmail / live / outlook te zoeken en de extensie achterwege te laten. Dan is je code direct weer wat toekomstbestendiger. Denk bijvoorbeeld aan de nieuwe domeinnamen die eraan zitten te komen.
Sowieso lijkt me niet handig om naar de mail zelf te kijken om te bepalen welke smtp server je nodig hebt. Zou me veel beter lijken om gewoon zelf een dropdown lijstje (noem maar iets) te hebben waar je die keuze kan maken.

Nothing to see here!


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
Anoniem: 372738 schreef op dinsdag 11 december 2012 @ 20:23:
C#:
1
        string domein = txtGebruikersnaam.Text.ToLower().Split('@')[1];
ik hoop dan voor je dat ze ook een '@' invullen ;)

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Rutix schreef op woensdag 12 december 2012 @ 08:30:
[...]

Sowieso lijkt me niet handig om naar de mail zelf te kijken om te bepalen welke smtp server je nodig hebt. Zou me veel beter lijken om gewoon zelf een dropdown lijstje (noem maar iets) te hebben waar je die keuze kan maken.
Technisch gezien zou je simpelweg het beste naar MX-records kunnen kijken en dan de FQDN daarvan (alhoewel ik gok dat het hier overkill is).
Aangezien gmail etc ook voor je eigen account kan gelden.

Anoniem: 372738

lol, ja, jullie hebben gelijk... ik had mijn bek moeten houden... ;)

Het ging mij in het begin om deze code:
C#:
1
2
3
4
5
6
smtpcheck = txtGebruikersnaam.Text;
smtpcheck = smtpcheck.Substring(Math.Max(0, smtpcheck.Length - 10));

 //check of er gebruik word gemaakt van gmail, of van hotmail/live
 if (smtpcheck.ToLower() == "@gmail.com")
{

Ik moest er goed naar kijken voordat ik precies doorhad wat de bedoeling was, zelfs Orion struikelde hierover, daarom de melding waarom niet EndsWith() gebruiken, en toen sloeg ik door..; 8)7

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Chrotenise schreef op woensdag 12 december 2012 @ 02:38:
Beter om gewoon op hotmail / live / outlook te zoeken en de extensie achterwege te laten. Dan is je code direct weer wat toekomstbestendiger.
livestream@gmail.com en bats je gebruikt de verkeerde mailserver (live.xxx terwijl je gmail.xxx wil gebruiken).
Als TS nou eens gewoon bouwt wat er in de spec staat zonder helemaal te verzanden in 't aanleggen van lijsten van (mogelijke) domeinen, vage matching algoritmes enz. Gebruik een dropdown, en als je "luxe" wil gaan desnoods een config file oid (een .ini, regkey, i-don't-care) om nieuwe mailservers te definiëren. Done. Next task.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Gmail moet op port 587, rest is goed volgens mij (zo gebruik ik het ook namelijk). Je email check is wel erg vreemd, ik zou gewoon de .Contains (bv "@gmail.", "@hotmail.") method gebruiken.

'You like a gay cowboy and you look like a gay terrorist.' - James May

Pagina: 1