PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASP.net SmtpMail.Send(mail)


stefagner
2005-03-09, 23:14:46
hi ich hab ein problem siehe Bild, woran liegt des?

http://dual-opteron.dnsalias.net/grounded/fehler1.gif

grakaman
2005-03-09, 23:44:57
Hast du mal den Smtp Server zuvor festgelegt?

SmtpMail.SmtpServer = "Servername oder IP";

stefagner
2005-03-10, 06:55:16
hier mal der Quellcode von contactform1.aspx

<% @Page Language="C#" Debug="true" %>
<% @Assembly src="MailParser.cs" %>
<% @Import Namespace="System.Web.Mail" %>

<script runat="server">

void bt_click(object sender, EventArgs e)
{
ph1.Visible = false;
ph2.Visible = true;

MailMessageExt mail = new MailMessageExt(Server.MapPath("contact.txt"), Request.Form);
SmtpMail.Send(mail);
}

</script>

<form runat="server">

<ASP:PlaceHolder id="ph1" runat="server">

<h1>Kontaktformular</h1>
<p> Vielen Dank für Ihr Interesse! Sehr gerne beantworten wir Ihre Fragen. Bitte füllen Sie einfach die folgenden Felder aus. Mit * versehene Felder sind zur Bearbeitung Ihrer Anfrage obligatorisch. </p>

<table width="300">

<tr>
<td width="25%"> Vorname:</td>
<td width="65%"> <ASP:TextBox id="tb_firstname" runat="server" width="100%"/> </td>
<td width="10%"> &nbsp; </td>
</tr>

<tr>
<td width="25%"> Name*: </td>
<td width="65%"> <ASP:TextBox id="tb_lastname" runat="server" width="100%"/> </td>
<td width="10%">
<ASP:RequiredFieldValidator runat="server"
ControlToValidate="tb_lastname"
display="dynamic"
ErrorMessage="Bitte geben Sie Ihren Namen ein">
<img src="exclamation.gif"/>
</ASP:RequiredFieldValidator>
</td>
</tr>

<tr>
<td width="25%"> Email*: </td>
<td width="65%"> <ASP:TextBox id="tb_email" runat="server" width="100%"/> </td>
<td width="10%">
<ASP:RequiredFieldValidator runat="server"
ControlToValidate="tb_email"
display="dynamic"
ErrorMessage="Bitte geben Sie Ihre Email-Adresse ein">
<img src="exclamation.gif"/>
</ASP:RequiredFieldValidator>

<ASP:RegularExpressionValidator id="valEmail" runat="server"
ControlToValidate="tb_email"
ValidationExpression="^[\w\.\-]+@([\w\-]+\.)*[\w\-]{2,63}\.[a-zA-Z]{2,4}$"
display="dynamic"
ErrorMessage="Bitte geben Sie eine korrekte Email-Adresse ein">
<img src="exclamation.gif"/>
</ASP:RegularExpressionValidator>
</td>
</tr>

<tr>
<td width="25%" valign="top"> Anfrage*: </td>
<td width="65%"> <ASP:TextBox id="tb_text" runat="server" textmode="multiline" width="100%"/> </td>
<td width="10%">
<ASP:RequiredFieldValidator runat="server"
ControlToValidate="tb_text"
display="dynamic"
ErrorMessage="Bitte geben Sie Ihre Anfrage ein">
<img src="exclamation.gif"/>
</ASP:RequiredFieldValidator>
</td>
</tr>

</table>

<ASP:ValidationSummary runat="server"/>

<p> <ASP:Button runat="server" onclick="bt_click" text="Formular absenden"/> </p>

</ASP:PlaceHolder>

<ASP:PlaceHolder id="ph2" runat="server" visible="false">
<h1> Vielen Dank! </h1>
<p> Ihre Anfrage wurde weitergeleitet. Wir werden uns in Kürze mit Ihnen in Verbindung setzen. </p>
</ASP:PlaceHolder>

</form>

stefagner
2005-03-10, 06:56:01
und hier der Mailparser.cs:

using System;
using System.Collections;
using System.Collections.Specialized;
using System.IO;
using System.Web;
using System.Web.Mail;

public class MailMessageExt : MailMessage
{
public MailMessageExt(string filename, NameValueCollection variables)
{
this.ParseTemplate(filename, variables);
}

public void ParseTemplate(string filename, NameValueCollection variables)
{
StreamReader reader = File.OpenText(filename);
string template = reader.ReadToEnd();
reader.Close();

foreach(string key in variables.Keys)
{
string placeholder = "<" + key + ">";
string content = variables[key];
template = template.Replace(placeholder, content);
}

string reduced = template.Replace("\r", "");
string[] lines = reduced.Split(new char[] {'\n'});
for(int i=0; i<lines.Length; i++)
{
string line = lines[i].ToLower();

if(line.StartsWith("from:")) this.From = lines[i].Substring(6);
if(line.StartsWith("to:")) this.To = lines[i].Substring(4);
if(line.StartsWith("cc:")) this.Cc = lines[i].Substring(4);
if(line.StartsWith("bcc:")) this.Bcc = lines[i].Substring(5);
if(line.StartsWith("subject:")) this.Subject = lines[i].Substring(9);

if(line == string.Empty)
{
this.Body = string.Join("\n", lines, i+1, lines.Length-i-1);
return;
}
}

this.Body = template;
}
}

grakaman
2005-03-10, 08:59:02
Die Fehlermeldung deutet aber eher darauf hin, dass du den Namen des Smtp Server nicht festgelegt hast. Zumindest habe ich das so auch im Web gefunden, vor allem im Zusammenhang mit dem 1.1er Framework. Füge doch mal das Statement einfach vor dem Absenden hinzu, zum Bsp.:

SmtpMail.SmtpServer = "localhost"; //Smtp liegt auf lokalen Rechner
SmtpMail.Send(mail);

Der Rest sieht eigentlich ok aus, nur finde ich das dynamische Ersetzen mit den Werten aus der Request.Form Collection irgendwie umständlich, da die Wertezuweisung an die MailMessage Eigenschaften unten sowieso fest kodiert ist.

stefagner
2005-03-10, 13:56:03
supi :biggrin: etz gehts, aber nicht mit localhost sonder ich musste erst nen smtp-server installieren. Hab mal gegooglet und fand den postcastserver funzt einwandfrei :rolleyes: nochmal Vielen dank ;D

stefagner
2005-03-10, 15:11:39
hey, hab mal noch ne sehr dumme frage: :biggrin: sorry, aber ich bin Anfänger! =) wie kann man nen Wert einer Variablen in ein foglendes textfeld schreiben:


<input id="tb_text" value="tb_text123" runat="server" type="hidden">

und dann müsste ich noch wissen wie man den value eines Textfeldes in eine Variable schreiben kann :D

grakaman
2005-03-10, 18:32:47
hey, hab mal noch ne sehr dumme frage: :biggrin: sorry, aber ich bin Anfänger! =) wie kann man nen Wert einer Variablen in ein foglendes textfeld schreiben:


<input id="tb_text" value="tb_text123" runat="server" type="hidden">

und dann müsste ich noch wissen wie man den value eines Textfeldes in eine Variable schreiben kann :D

Mit hidden Felder arbeitet man selbst bei ASP.NET nicht mehr, wobei dich freilich niemand abhält das zu machen (ist nur unheimlich unprofessionell). In dem Fall gibt es den ViewState, den ASP.NET in einem hidden Feld speichert. Alle Server Controls, nämlich jene, deren Status nicht über HTTP übertragen werden können, speichern ihren Status standardmäßig im ViewState (kann man disabeln). Das ganze ist einfach eine Collection und die Daten werden dann im entsprechenden hidden Feld ("__ViewState") serialisiert und mit base64 kodiert gespeichert. Da noch standardmäßig EnableViewStateMac der Page Klasse (Webform) true ist, ist es auch nicht möglich den ViewState zu manipulieren, da hinter dem serialisierten ViewState, bevor dieser mit base64 kodiert wird, selbst noch einmal ein Hash hängt, der sich aus dem ViewState und einem Salt zusammensetzt. Letzteres ist für den Client ja unbekannt, also auch unmöglich den richtigen Hash zu errechnen.
Da Benutzen von hidden Feldern zum Speichern von Werten, wie man es bisher immer getan hat, ist ja eine äußerst große Angriffsfläche, vor allem, da die meisten Entwickler recht unbedacht die Werte in Plain Text darin gespeichert haben.
Lange Rede kurzer Sinn, wenn du jetzt manuelle Objekte in den ViewState ablegen willst, machst du das so:

ViewState["meinName"] = 4;

wenn du darauf dann wieder zugreifen willst, geht das so:

int i = (int) ViewState["meinName"];


Im übrigen würde ich dir empfehlen für ASP.NET ausschließlich nur Codebehind zu verwenden. Das was du machst, also den Code per inline Script in die Webform schreiben, ist eigentlich eher für Migrationszwecke von bestehenden ASP classic gedacht.