Anleitung zum Lesen einer Webseite HTML aus und verwenden Sie sie als Körper von HTML-Auto-Responder-E-Mail

StackOverflow https://stackoverflow.com/questions/1507351

  •  19-09-2019
  •  | 
  •  

Frage

Ich arbeite an einer HTML-Auto-Responder-E-Mail. Wenn es eine einfachere Art und Weise als das, was ich tue lass es mich wissen.

Bisher habe ich gebaut habe „pagename.aspx“ und wir lesen Sie diese Seite in ein String-Variable, dann verwenden Sie diese Variable als den Körper der Mail. Dies funktioniert.

Die Seite akzeptiert optional eine Abfrage-Zeichenfolge namens „leadID“. Dies wird verwendet, um Daten aus einer Datenbank zu ziehen, und füllen Sie Felder auf dieser Seite. Dies funktioniert auch gut, wenn ich manuell auf der Seite sehen - pagename.aspx leadid = xyz

Mein Problem / Frage ist , wie ich diese Abfragezeichenfolgeflag auf der Seite hindurchgehen und die daraus gewonnenen Ergebnisse HTML-Ausgabe der Seite in eine Zeichenfolge, die dann wie der Körper meiner E-Mail verwendet werden.

Auch wenn es eine bessere Art und Weise ist lass es mich wissen. Ich bin mit LINQ to SQL, VB.NET und ASP.NET 3.5.

Dank einer Million.

War es hilfreich?

Lösung

Der einfachste Weg ist einfach ein WebRequest, um es zu tun:

string url = "...";
string result;

HttpWebRequest webrequest = (HttpWebRequest) HttpWebRequest.Create(url);
webrequest.Method        = "GET";
webrequest.ContentLength = 0;

WebResponse response = webrequest.GetResponse();

using(StreamReader stream = new StreamReader(response.GetResponseStream())){
    result = stream.ReadToEnd();
}

Andere Tipps

Wie beschrieben in diesem Artikel , könnten Sie die HttpWebRequest Klasse den Strom von Daten von Ihrer Seite „pagename.aspx? leadID = 1“ abgerufen werden. Aber das ein wenig Overhead zu Ihrer Anwendung führen könnte aufgrund der zusätzlichen HTTP-Anforderung.

Wäre es nicht möglich sein, / besser Ihre HTML-Inhalte von einer einfachen Klasse zu generieren? Welche Inhalte generiert Ihre Seite?

Edit: Wie von Khalid fragte hier ist eine einfache Klasse eine dynamische HTML-Datei mit Ihrem leadID Parameter und ein Gridview-Steuerelement zu generieren. Es ist nur ein Beispiel, würden Sie es zur Gewohnheit benötigen und machen mehr wiederverwendbar:

using System;
using System.Text;
using System.IO;
using System.Web.UI.WebControls;
using System.Web.UI;

public class PageBroker
{

    /*
     * How to use PageBroker:
     * 
     *  string leadID = "xyz"; // dynamic querystring parameter
     *  string pathToHTML = Server.MapPath(".") + "\\HTML\\leadForm.html"; //more detail about this file below
     *  PageBroker pLeadBroker = new PageBroker(pathToHTML, leadID);  
     *  Response.Write(pLeadBroker.GenerateFromFile()); // will show content of generated page
     */

    private string _pathToFile;
    private StringBuilder _fileContent;
    private string _leadID;

    public PageBroker(string pathToFile, string leadID)
    {
        _fileContent = new StringBuilder();
        _pathToFile = pathToFile;
        _leadID = leadID;
    }

    public string GenerateFromFile() {
        return LoadFile();
    }
    private string LoadFile()
    {
        // Grab file and load content inside '_fileContent'
        // I used an html file to create the basic structure of your page
        // but you can also create
        // a page from scratch.
        if (File.Exists(_pathToFile))
        {
            FileStream stream = new FileStream(_pathToFile, FileMode.Open, FileAccess.Read);
            StreamReader reader = new StreamReader(stream);
            while (reader.Peek() > -1)
                _fileContent.Append(reader.ReadLine() + "\n");
            stream.Close();
            reader.Close();

            InjectTextContent();
            InjectControlsContent();
        }        
        return _fileContent.ToString();
    }

    // (Ugly) method to inject dynamic values inside the generated html
    // You html files need to contain all the necesary tags to place your
    // content (for example: '__USER_NAME__')
    // It would be more OO if a dictionnary object was passed to the 
    // constructor of this class and then used inside this method 
    // (I leave it hard-coded for the sake of understanding but 
    // I can give you a more detailled code if you need it).
    private void InjectTextContent() {
        _fileContent.Replace("__USER_NAME__", "Khalid Rahaman");
    }

    // This method add the render output of the controls you need to place
    // on the page. At this point you will make use of your leadID parameter,
    // I used a simple array with fake data to fill the gridview.
    // You can add whatever control you need.
    private void InjectControlsContent() {
        string[] products = { "A", "B", "C", "D" };
        GridView gvProducts = new GridView();
        gvProducts.DataSource = products;
        gvProducts.DataBind();

        // HtmlTextWriter is used to write HTML programmatically. 
        // It provides formatting capabilities that ASP.NET server 
        // controls use when rendering markup to clients 
        // (http://msdn.microsoft.com/en- us/library/system.web.ui.htmltextwriter.aspx)
        // This way you will be able to inject the griview's 
        // render output inside your file.
        StringWriter gvProductsWriter = new StringWriter();
        HtmlTextWriter htmlWrit = new HtmlTextWriter(gvProductsWriter);
        gvProducts.RenderControl(htmlWrit);
        _fileContent.Replace("__GRIDVIEW_PRODUCTS__", gvProductsWriter.ToString());
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top