如何在MVC Mailer中动态更改SMTP客户端,用户和密码?

时间:2012-06-13 22:58:56

标签: smtpclient mvcmailer

在分步指南中: https://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide

声明使用.net邮件库(System.Net.Mail)。

在医疗交易中,需要根据国家/地区区域更改服务器,并记录邮件是否以状态发送。

.net mail lib会这样做但我在使用MVC Mailer时无法理解在哪里放置以下代码:

.net Mail Lib - >

SmtpClient client = new SmtpClient(server, port);
client.credentials = CredentialCache.DefaultNetworkCredentials;

MVC Mailer - >

public ActionResult SendWelcomeMessage()
{
    UserMailer.SmtpClient(server, port);
    UserMailer.credentials = CredentialCache.DefaultNetworkCredentials;
    UserMailer.Welcome().SendAsync();


    return RedirectToAction("Index");
}

    static bool mailSent = false;
    private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
    {
        // Get the unique identifier for this asynchronous operation.
         String token = (string) e.UserState;

        if (e.Cancelled)
        {
             Console.WriteLine("[{0}] Send canceled.", token);
        }
        if (e.Error != null)
        {
             Console.WriteLine("[{0}] {1}", token, e.Error.ToString());
        } else
        {
            Console.WriteLine("Message sent.");
        }
        mailSent = true;
    }

如果MailSent为false,则写入Critical Log Error。

我不确定.net设置的客户端设置应该去哪里。 他们应该像我上面或Mailer方法那样进入控制器。

感谢您的任何建议。

此致 维克

1 个答案:

答案 0 :(得分:0)

我有同样的需要。

为此,我创建了一个自定义邮件发件人类:

 Public Class CustomMailSender
        Inherits System.Net.Mail.SmtpClient
        Implements ISmtpClient       

    Public Sub Init(senderEmail As String, password As String)
        Me.Credentials = New System.Net.NetworkCredential(senderEmail, password)
    End Sub

    Public Overloads Sub SendAsync(mail As MailMessage) Implements ISmtpClient.SendAsync
        MyBase.SendAsync(mail, Nothing)
    End Sub

    Public Overloads Sub SendAsync(mail As MailMessage, userToken As Object) Implements ISmtpClient.SendAsync
        MyBase.SendAsync(mail, userToken)
    End Sub

    Public Overloads Sub Send(mail As MailMessage) Implements ISmtpClient.Send
        MyBase.Send(mail)
    End Sub

    Public Shadows Event SendCompleted(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs) Implements ISmtpClient.SendCompleted

End Class

然后在你的电子邮件控制器中,你就像那样使用它

Public Class EmailController
        Inherits MailerBase

    Public Sub New()
        MyBase.New()
        Me.CustomMailSender = New CustomMailSender
    End Sub

    Public Property CustomMailSender As CustomMailSender

    Public Sub Sample()
        Dim mvcMailMessage As MvcMailMessage = Populate(Sub(i)
                                                            i.ViewName = "Sample"
                                                            i.To.Add("some1@somewhere.org")
                                                            i.Subject = "Boo!"
                                                        End Sub)
        mvcMailMessage.Send(Me.CustomMailSender)
    End Sub
End Class

是的,我知道那个VB,但我是一个VB家伙!产品:> 希望这会有所帮助:)