tisdag 29 mars 2011

Sendmail med asp.net

Jag har problem med att få min applikation att sända mail och har därför sökt runt på nätet efter kloka råd. Dem ska jag nu ställa samman och testa lösningen lokalt och remote.

Först ska mailbiblioteket inkluderas.
Imports System.Net.Mail

Sedan följer den normala inledning på code behind:
Partial Class _Default Inherits System.Web.UI.Page

Mailforumuläret har en knapp som startar exekveringen av en subrutin som ha det
vanliga huvudet:
Protected Sub Send_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Send.Click

Meddelandet i formuläret tilldelas variabel Usermessage:
Dim usermessage As String = textcontent.Text

På samma sätt överförs avsändarens epostadress till variabeln UserAddress
Dim senderemailaddress As String = senderemail.Text

Skapa mailobjektet:
Dim mail As New MailMessage()

Ange avsändaradress
mail.From = New MailAddress("sender@gmail.com") 'sender ska givetvis ersättas med rätt adress

Ange mottagaradress
mail.[To].Add = New MailAddress("receiver@gmail.com") 'receiver ska givetvis ersättas med rätt adress

Ange rubrik (subject)
mail.Subject = sendersubject

Ange kopia till avsändaradressen
mail.CC.Add(senderemailaddress)

Sänd ren text, inte HTML
mail.IsBodyHtml = False

Lagra texten som ska sändas
mail.Body = usermessage

Ange SMTP-värdens adress och portnummer
Dim mailClient As New System.Net.Mail.SmtpClient("smtp.gmail.com", "587")

Ange dina inloggningsuppgifter till gmailkontot
Dim userCredential As New System.Net.NetworkCredential("användarnamn", "Lösenord")

Ange dina inloggningsuppgifter till gmailkontot
Dim userCredential As New System.Net.NetworkCredential("användarnamn", "Lösenord")

Ange SMTP-adressen igen (!!!)
mailClient.Host = "smtp.gmail.com"

Ange att standard inloggningsuppgifterna inte ska användas
mailClient.UseDefaultCredentials = False

Ange att inloggningsuppgifterna är angivna i userCredential
mailClient.Credentials = userCredential

Ange att SSL-kryptering används (krävs av gmail)
mailClient.Credentials = userCredential

Och sänd sedan meddelandet
mailClient.Send(message)

Meddela användaren att meddelandet sänt
mailClient.Send(message)

Avsluta subrutinen och klassen
End Sub
End Class


Denna kod, som är en bearbetning av kod från www.aspfree.com, fungerar när jag exekverar den lokalt, men timar ut remote. Varför?

Troligast är det att portnumret är fel. Men Stackoverflow säger liksom Aspfree att det ska vara 587. Google säger att portnr ska vara 587 alternativt 465 i en instruktion som gäller Thunderbird. Men 465 fungerar inte heller - time out. Men port 25 fungerar remote överraskande nog.

Lösningen blev alltså att ersätta
Dim mailClient As New System.Net.Mail.SmtpClient("smtp.gmail.com", "587")
med
If WebSite = "Production" Then
Portnr = "25"
Else
Portnr = "587"
End If
Dim mailClient As New System.Net.Mail.SmtpClient("smtp.gmail.com", Portnr)

Inga kommentarer:

Skicka en kommentar