我使用Postal来呈现MVC Razor视图并通过电子邮件发送它们.我有一个我专门为电子邮件视图定义的自定义CSS.目前我将它们包括在内如下:
@Styles.Render("~/Content/EmailStyles.css")
Run Code Online (Sandbox Code Playgroud)
但是,这仅包括样式表的相对链接,这在电子邮件中不起作用:
<link href="/Content/EmailStyles.css" rel="stylesheet"/>
Run Code Online (Sandbox Code Playgroud)
我希望将样式表内联,以便它在电子邮件中正常运行.在MVC视图中呈现基于文件的资源的内容的最佳方法是什么?
似乎当我使用Postal使用Layout发送电子邮件时,标题未被解析并包含在邮件消息中.
查看/电子邮件/ _ViewStart.cshtml
@{ Layout = "~/Views/Emails/_EmailLayout.cshtml"; }
Run Code Online (Sandbox Code Playgroud)
查看/电子邮件/ _EmailLayout.cshtml
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>ViewEmails</title>
</head>
<body>
<div>
@RenderBody()
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
查看/电子邮件/ ResetPassword.cshtml
To: @ViewBag.To
From: @ViewBag.From
Subject: Reset Password
Views: Html
Run Code Online (Sandbox Code Playgroud)
查看/电子邮件/ ResetPassword.html.cshtml
Content-Type: text/html; charset=utf-8
Here is your link, etc ...
Run Code Online (Sandbox Code Playgroud)
当我收到邮件时,所有标题To,From,Subject和Views都包含在正文中.
有谁知道如何正确地做到这一点?
更新(感谢安德鲁),这工作:
查看/电子邮件/ _EmailLayout.cshtml
@RenderSection("Headers", false)
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>ViewEmails</title>
</head>
<body>
<div>
@RenderBody()
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
查看/电子邮件/ ResetPassword.cshtml
@section Headers {
To: @ViewBag.To
From: @ViewBag.From
Subject: Reset …
Run Code Online (Sandbox Code Playgroud) 需求:
每天在特定时间(例如早上6点)动态地向所有用户发送电子邮件.
到目前为止我做了什么:
我使用Nuget的第三方库Quartz.net.
public class TaskScheduler : IJob
{
public void Execute(IJobExecutionContext context)
{
try {
UserRepository userRepo = new UserRepository();
var users = userRepo.GetUsers();
DashBoardRepository repo = new DashBoardRepository();
foreach (var rec in users)
{
var tasks = repo.GetIncompleteTasks(rec.UserID);
var appointments = repo.GetUpcomingAppointments(rec.UserID);
if (tasks.Count > 0 || appointments.Count > 0)
{
dynamic email = new Email("TaskEmail");
email.To = rec.Email;
email.From = "no-reply@xyz.com";
email.Subject = "Pending items in XYZ";
email.Tasks = tasks;
email.Appointments = appointments;
email.Send();
}
} …
Run Code Online (Sandbox Code Playgroud) 我有一个使用ASP.NET MVC3构建的网站,其分层如下:
这实际上是我最近在重构之后想出的结构.不幸的是,UI和我的业务层之间没有完全分离,因此这个领域可能会使用更多的重构 - 我现在无法做到这一点,因为我的时间紧迫.
至于现在,我的客户已经请求了一些新功能,包括在发生某些事件后向用户发送电子邮件.网站目前发送电子邮件的方式是使用到目前为止表现很好的邮政图书馆.这发生在MVC Web应用程序中,这与我对新功能的情况不同...
问题:
我有这样的情况,我需要让我的业务层内的私人方法向用户发送电子邮件.我之所以无法在Action方法中执行此操作,是因为有许多代码路径最终会调用此私有方法.所以它并不是特定于一个Action方法.
建议的解决方案:
我的想法是创建一个EmailsController,我可以通过业务层内的HTTP-POST调用来调用它的方法.然后,我将传递通过Action方法的参数发送电子邮件所需的参数.
但我觉得这个解决方案有点瑕疵和黑客.所以我真的想听听一些关于如何解决这个问题的想法.
我有一个MVC应用程序,正在尝试使用Hangfire和邮政发送电子邮件。该电子邮件必须在注册后发送。注册工作正常,但是我运行的作业仍然排队,并且我没有收到任何电子邮件。所以在我的MVC控制器中,我有以下代码:
public async Task<ActionResult> Register(RegisterViewModel model)
{
//register correctly the user
//I send the email
BackgroundJob.Enqueue(() =>
NotifyRegistration(user.Id, user.UserName, user.Email)
);
...
}
[AutomaticRetry(Attempts = 5)]
public async Task NotifyRegistration(string userId, string username, string email)
{
//I calculate callbackUrl
var viewsPath = Path.GetFullPath(HostingEnvironment.MapPath(@"~/Views/Emails"));
var engines = new ViewEngineCollection();
engines.Add(new FileSystemRazorViewEngine(viewsPath));
var emailService = new EmailService(engines);
var emailToSend = new NewRegisteredUserEmail
{
To = email, UserName = username, CallbackUrl = callbackUrl
};
emailService.Send(emailToSend);
}
Run Code Online (Sandbox Code Playgroud)
我无法调试NotifyRegistration方法。我不知道为什么 我正在使用邮政,所以EmailService不是我的实现。这里是我如何配置smtp服务:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network">
<network …
Run Code Online (Sandbox Code Playgroud) 我想使用我的Gmail帐户发送一封电子邮件,邮政:
dynamic email = new Email("Appointment");
email.To = "sergiotapia@outlook.com";
email.Send();
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
System.Net.Mail.SmtpException:{"SMTP服务器需要安全连接或客户端未经过身份验证.服务器响应为:5.7.0必须首先发出STARTTLS命令.
发送这封电子邮件的任何想法我需要做什么?
这是我的web.config设置:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="asdf@adsf.ly.com">
<network host="smtp.gmail.com" port="587" defaultCredentials="false" userName="asdf@adsf.ly" password="asdf" />
</smtp>
</mailSettings>
</system.net>
Run Code Online (Sandbox Code Playgroud) 在我的项目中使用 POSTAL MVC 时遇到问题。我的托管服务公司要求我在代码中而不是在 web 配置中设置 smtp 客户端配置。
怎么做 ?
我希望有人能给我一个解决方案
谢谢你。
我的项目托管在Azure上,我想每天早上向忘记在我的应用程序中完成某些任务的用户发送电子邮件.
我建立了电子邮件(使用Postal发送).如果我自己运行该功能,电子邮件将按预期发送.
我已将Azure调度程序配置为运行HTTPs操作,获取方法,[ https://www.example.com/Email/EmailReminder].预定的作业报告成功,但没有电子邮件发出.
我之前没有这么做过,所以我怀疑我的函数>调度程序作业之间缺少一个链接.我已经搜索了如何设置它的代码示例,但我还没有找到解决方案.什么是调度程序期望我不给它?
public void EmailReminder()
{
var remCheckOuts = // query code here
into grouped
select new Reminder
{
/// populate viewmodel
});
// send emails
foreach (var i in remCheckOuts)
{
string Full = i.Full;
string FirstName = i.FirstName;
var CheckOutCt = i.CheckOutCt;
dynamic email = new Email("emReminder");
email.FromAdd = "test@test.com";
email.To = "test2@test2.com";
email.NPFirstName = NPFirstName;
email.CheckOutCt = CheckOutCt;
email.Send();
}
}
Run Code Online (Sandbox Code Playgroud) 在我的MVC4应用程序中,我使用邮政包发送电子邮件.
我试图通过<img>
标签包含徽标,但它不起作用.
我如何加入公司徽标?
控制器动作:
public ActionResult Index()
{
dynamic email = new Email("Example");
email.To = "xxxxx@xxxxxx";
email.FunnyLink = "haiii";
email.Send();
return View();
}
Run Code Online (Sandbox Code Playgroud)
查看:
To: @ViewBag.To From: lolcats@website.com
Subject: Important Message
<div style="background-color:aqua;">
Hello, You wanted important web links right?
Check out this: @ViewBag.FunnyLink
<br />
<img src="~/Images/Logo.png" />
</div>
Run Code Online (Sandbox Code Playgroud) postal ×10
asp.net-mvc ×5
c# ×5
.net ×1
asp.net-mail ×1
azure ×1
controller ×1
email ×1
gmail ×1
hangfire ×1
quartz.net ×1
razor ×1