将ASP经典电子邮件代码翻译为C#ASP.NET代码

时间:2016-06-21 18:30:27

标签: c# asp.net email asp-classic

我有几个经典ASP页面通过本地用户的Lotus Notes电子邮件客户端发送电子邮件。该脚本基本上抓取用户的数据库文件并通过它发送电子邮件。这工作正常,但现在我需要将整个过程迁移到ASP.NET。 (顺便说一下,使用.NET Framework 4.0。)

问题是,当我在开发机器上运行时,我所拥有的代码(我发现here on SO)工作得很好,但是当部署到服务器时,它找不到用户的数据库。我想基本上将这个特定的子程序作为一个脚本运行在页面上,这样就不会从后面的代码中调用它,但我无法弄清楚如何去做。

在服务器上安装Notes不是一个选项,我不允许使用SMTP通过我们的服务器执行此操作。我可以使用谷歌的SMTP服务器,使用Gmail帐户,但是如果流量上的某个“你是商业用户,那么这是你的每月账单”的事情,这也不是一个选择。我们也不希望将我们的Gmail邮箱标记为垃圾邮件来源,因此我对使用Gmail作为SMTP犹豫不决。 (如果上述条件要明确,我愿意这样做,但此时,我们每天通过Notes客户端发送和接收数百封电子邮件,而且数量只会增加。)

每当点击发送电子邮件的按钮时,我都会看到一个丑陋的黄色死亡画面。我的第一次尝试是在一个带有代码隐藏页面的ASP.NET Web应用程序中,但是当我在服务器上测试它时,我无法使用它。我可以使用较旧的单页格式(我们现在仍在运行Windows 2K3服务器,但很快就会升级),但我仍然想知道是否有更现代的解决方案来执行此操作。

如何在客户端的页面上运行此特定脚本,就像经典ASP脚本一样?我缺少一些技术吗?

这是电子邮件代码;它是通过点击.aspx页面上的按钮调用的。

    static void SendEmail()
    {

        // code adapted from https://stackoverflow.com/questions/18600262/creating-fields-in-lotus-notes-document'

        // create/initialize a notes session
        NotesSession sess = new NotesSession();
        sess.Initialize("database_Name");

        // get the database (?)
        NotesDatabase ndb = sess.GetDatabase("", "nsffile.nsf", false);

        // get the username
        string username = sess.UserName;

        // create the document to send
        var doc = ndb.CreateDocument();

        // set document properties
        doc.ReplaceItemValue("Form", "Memo");
        doc.ReplaceItemValue("SentTo", to);
        doc.ReplaceItemValue("Principal", "MAILBOXNAME");
        doc.ReplaceItemValue("INetFrom", "MAILBOXNAME <mailboxname@domain.com>");
        doc.ReplaceItemValue("Subject", sub);

        // remove the body and add it back as a rich text item
        doc.RemoveItem("Body");
        var rtitem = doc.CreateRichTextItem("Body");

        //  figure out how to include the attachments without magic string; Server.MapPath?
        rtitem.EmbedObject(EMBED_TYPE.EMBED_ATTACHMENT, "", @"path\to\attachments\" + atch[0].ToString(), atch[0].ToString());

        // add the bod string to the rtitem
        rtitem.AppendText(bod);

        // now, replace the doc body field with the rtitem obj
        doc.ReplaceItemValue("Body", rtitem);

        // send and save
        doc.SaveMessageOnSend = false;
        doc.Send(false, to);

        // clear atch for consecutive sends
        atch.Clear();

    }

变量在代码隐藏页面中声明为类变量,并从From,To,Subject和Attachment文本框中指定值(附件是文件选择器)。消息正文是textarea控件中的文本。

就像我说的,如果我在本地机器上运行它,一切正常。从服务器,我立即单击“发送”按钮,该错误表示该页面无法找到要使用的数据库。 (这是真的。)

我没有发布.aspx代码,因为它是一个使用母版页的内容页面,也许这就是问题,但是要发布的代码很多。如果它变得很重要,我将使用.aspx和母版页代码进行编辑。

编辑:这是ASP页面上的现有脚本。这仅适用于IE,并且在IE11中,必须以兼容模式运行该站点才能使此(以及其他脚本)正常工作。我应该注意,我不是原始的页面作者,所以我一直在试图弄清楚这些东西,并在我可以的时候用(更多)现代Web应用程序替换它。

无论如何,这是原始剧本:

<script language="VBScript">

'on error goto 0: sendLNMail()
dim s
dim db
dim doc
dim rtitem
dim subj
dim bdy
dim recips(10) 
'File System Object Decs
Dim Addy
Dim Cnt 
dim fs
dim fName
dim path

sub sendLNMail()
    On Error Resume Next
    '     ////////////////////////////////
    'Get subject...if no subject, exit sub
    'subj = inputbox("Please enter a subject for your mail memo.","Email Subject Text")
    RepAdd = document.all("RepAdd").value
    Whoto = document.all("Whoto").value
    if Whoto = "" then
    msgbox "You need a Name that this e-mail will be sent to"
    exit sub
    end if
    AtAdd = document.all("AtAdd").value
    if  AtAdd  = "" then
    msgbox "You need an address that this e-mail should go to"
    exit sub
    end if
    subj = document.all("Subj").value
    if subj = "" then
    msgbox "You need a subject"
    exit sub
    end if
    'Get body text...if no body text, exit sub
    'bdy = inputbox("Please enter text for your body mail memo.","Email Body Text")
    bdy = document.all("bdy").value
    if bdy = "" then
    msgbox "You need body text"
    exit sub
    end if
    set fs = createobject("Scripting.FileSystemObject")
    if fs Is Nothing then
    msgbox "Could Not Create FileSystemObject",16,"File System Object Error."
    endMe
    exit sub
    end if 

    '     ////////////////////////////////

    set s = createobject("Notes.NotesSession")
    if s Is Nothing then
    msgbox "Could Not Create A Session Of Notes",16,"Notes Session Error."
    endMe
    exit sub
    end if 
    'See if we can create the main object (session)
    If Err.Number <> 0 Then
    On Error GoTo 0
    msgbox "Could not create session 'Lotus Notes' from object"
    exit sub
    end if 
    set db = s.getdatabase(s.getenvironmentstring("MailServer",True),s.getenvironmentstring("Mailfile",true))
    'See if we can a handle on the mail file'     
    If Err.Number <> 0 Then
    On Error GoTo 0
    msgbox "Could find or get a handle on the mail file"
    exit sub
    end if
    set doc = db.createdocument
    set rtitem = doc.createrichtextitem("BODY")

    Addy = AtAdd
    Cnt = 1
    Do Until Addy = ""
    If InStr(1, Addy, ",") <> 0 Then
    recips(Cnt) = Left(Addy, (InStr(1, Addy, ",") - 1))
    Addy = Replace(Addy, recips(Cnt), "")
    Addy = Trim(Right(Addy, Len(Addy) - 1))
    Cnt = Cnt + 1
    Else
    recips(Cnt) = Addy
    Addy = Replace(Addy, recips(Cnt), "")
    End If
    Loop

    with doc
    .form = "Memo"
    .subject = subj
    .sendto = AtAdd
    ' the Principal field overrides the FROM name:
    ' (creates problems for Gmail recipients - removing "@domain.com" seems to resolve)
    '.Principal = "emailtouse@domain.com" 
    .Principal = "EMAILALIAS"
    '.replyto = RepAdd
    .replyto = "EMAILALIAS@domain.com"
    '.blindcopyto = "emailaddress@domain.com"
    '.copyto = 
    .body = bdy
    .postdate = Date
    .savemessageonsend = True
    end with
    doc.visible = true
    doc.send false, recips
    Call doc.Save(True, False)

    'if we made it this far, alert the user 
    '     the mail memo has been created and sent
    msgbox "Your message has been created and sent." & chr(13) & "Thank you.",64,"Message Sent Notification."
    endMe

end sub

(...)

在我插入省略号(...)的地方,在子程序关闭之前,还有几个与此一个或多或少相同的例程(显示的消息不同,一个允许添加电子邮件的附件)并处理对象。

希望这段代码有助于确定当前的工作方式,以及如何编写替换例程。

欢迎任何和所有见解,再次感谢。

0 个答案:

没有答案