0

不想使问题过于复杂,但我认为我需要发布与此错误相关的所有代码。

使用MvcMailer并引入了一个单独的Send机制(用于 Orchard CMS 自己的电子邮件)。

MvcMailer 代码:

1) AskUsMailer.cs:

public class AskUsMailer : MailerBase, IAskUsMailer
{
    public AskUsMailer()
        : base()
    {
        //MasterName = "_Layout";
    }

    public virtual MvcMailMessage EMailAskUs(AskUsViewModel model)
    {
        var mailMessage = new MvcMailMessage { Subject = "Ask Us" };
        ViewData.Model = model;
        this.PopulateBody(mailMessage, viewName: "EMailAskUs");
        return mailMessage;
    }
}

2) IAskUsMailer.cs:

public interface IAskUsMailer : IDependency
{
    MvcMailMessage EMailAskUs(AskUsViewModel model);
}

3) AskUsController.cs: (GETTING NULL REFERENCE ERROR BELOW)

[Themed]
    public ActionResult Submitted()
    {
        //This is the new call (see new code below):
        //Note: Debugging steps through eMailMessagingService,
        //then shows the null reference error when continuing to
        //SendAskUs
        eMailMessagingService.SendAskUs(askUsData);
        //Below is normal MvcMailer call:
        //AskUsMailer.EMailAskUs(askUsData).Send();
        return View(askUsData);
    }

注意: askUsData 在控制器的单独块中定义:

    private AskUsViewModel askUsData;
    protected override void OnActionExecuting(ActionExecutingContext 
        filterContext)
    {
        var serialized = Request.Form["askUsData"];
        if (serialized != null) //Form was posted containing serialized data
        {
            askUsData = (AskUsViewModel)new MvcSerializer().
                Deserialize(serialized, SerializationMode.Signed);
            TryUpdateModel(askUsData);
        }
        else
            askUsData = (AskUsViewModel)TempData["askUsData"] ?? 
                new AskUsViewModel();
        TempData.Keep();
    }
    protected override void OnResultExecuted(ResultExecutedContext 
        filterContext)
    {
        if (filterContext.Result is RedirectToRouteResult)
            TempData["askUsData"] = askUsData;
    }

我不知道如何让我的 EMailMessagingService.cs(见下文)调用到控制器中,所以在控制器的一个单独块中我这样做了:

    private IEMailMessagingService eMailMessagingService;

    public AskUsController(IEMailMessagingService eMailMessagingService)
    {
        this.eMailMessagingService = eMailMessagingService;
    }

我认为这是我问题的一部分。

现在,新代码试图连接到 Orchard 的电子邮件:

1)电子邮件消息服务.cs:

public class EMailMessagingService : IMessageManager
{
    private IAskUsMailer askUsMailer;
    private IOrchardServices orchardServices;
    public EMailMessagingService(IAskUsMailer askUsMailer, 
        IOrchardServices orchardServices)
    {
        this.orchardServices = orchardServices;
        this.askUsMailer = askUsMailer;
        this.Logger = NullLogger.Instance;
    }

    public ILogger Logger { get; set; }

    public void SendAskUs(AskUsViewModel model)
    {
        var messageAskUs = this.askUsMailer.EMailAskUs(model);
        messageAskUs.To.Add("email@email.com");
        //Don't need the following (setting up e-mails to send a copy anyway)
        //messageAskUs.Bcc.Add(AdminEmail);
        //messageAskUs.Subject = "blabla";

        Send(messageAskUs);
    }
    ....
}

EMailMessagingService.cs 还包含 Send 方法:

    private void Send(MailMessage messageAskUs)
    {
        var smtpSettings = orchardServices.WorkContext.
            CurrentSite.As<SmtpSettingsPart>();

        // can't process emails if the Smtp settings have not yet been set
        if (smtpSettings == null || !smtpSettings.IsValid())
        {
            Logger.Error("The SMTP Settings have not been set up.");
            return;
        }

        using (var smtpClient = new SmtpClient(smtpSettings.Host, 
            smtpSettings.Port))
        {
            smtpClient.UseDefaultCredentials = 
                !smtpSettings.RequireCredentials;
            if (!smtpClient.UseDefaultCredentials &&
                !String.IsNullOrWhiteSpace(smtpSettings.UserName))
            {
                smtpClient.Credentials = new NetworkCredential
                    (smtpSettings.UserName, smtpSettings.Password);
            }

            if (messageAskUs.To.Count == 0)
            {
                Logger.Error("Recipient is missing an email address");
                return;
            }

            smtpClient.EnableSsl = smtpSettings.EnableSsl;
            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;

            messageAskUs.From = new MailAddress(smtpSettings.Address);
            messageAskUs.IsBodyHtml = messageAskUs.Body != null &&
                messageAskUs.Body.Contains("<") && 
                messageAskUs.Body.Contains(">");

            try
            {
                smtpClient.Send(messageAskUs);
                Logger.Debug("Message sent to {0} with subject: {1}",
                   messageAskUs.To[0].Address, messageAskUs.Subject);
            }
            catch (Exception e)
            {
                Logger.Error(e, "An unexpected error while sending 
                    a message to {0} with subject: {1}", 
                    messageAskUs.To[0].Address, messageAskUs.Subject);
            }
        }
    }

现在,在 EMailMessagingService.cs 中,我收到了一个错误,表明事情没有被实现,所以我自动生成了以下内容(不知道这是否是我的错误的一部分):

    public void Send(Orchard.ContentManagement.Records.ContentItemRecord recipient, string type, string service, System.Collections.Generic.Dictionary<string, string> properties = null)
    {
        throw new NotImplementedException();
    }

    public void Send(System.Collections.Generic.IEnumerable<Orchard.ContentManagement.Records.ContentItemRecord> recipients, string type, string service, System.Collections.Generic.Dictionary<string, string> properties = null)
    {
        throw new NotImplementedException();
    }

    public void Send(System.Collections.Generic.IEnumerable<string> recipientAddresses, string type, string service, System.Collections.Generic.Dictionary<string, string> properties = null)
    {
        throw new NotImplementedException();
    }

    public bool HasChannels()
    {
        throw new NotImplementedException();
    }

    public System.Collections.Generic.IEnumerable<string> GetAvailableChannelServices()
    {
        throw new NotImplementedException();
    }

2) IEMailMessagingServices.cs

public interface IEMailMessagingService
{
    MailMessage SendAskUs(AskUsViewModel model);
}

MvcMailer 可以在没有这个添加的情况下正常工作(在 Orchard 之外),但我正试图让一切在 Orchard 内工作。

我只是无法弄清楚我做错了什么。有什么想法吗?

抱歉代码过多。

4

1 回答 1

2

IEmailMessaginService 没有实现 IDependency,所以 Orchard 找不到它作为依赖项。这就是为什么它是空的。

于 2012-11-25T22:32:05.810 回答