ASP.NET MVC发送简单电子邮件,IIS7

4

我正在尝试发送一些简单的电子邮件,例如test@blabla.com。

首先,我已经在我的本地主机上尝试过它,并且它可以工作,问题出现在我将其上传到服务器时。

我使用的服务器是Windows Server 2012 R2,带有IIS 7(不确定版本,但我相信它是7及以上版本),成功托管,没有问题,只是发送电子邮件方法不起作用...

我已经添加了SMTP功能,设置了SMTP电子邮件(是的,在IIS 7及以上版本中没有SMTP虚拟服务器)。

这是我的控制器

public ActionResult SendTestEmail()
{
    var test_address = "test@blabla.com";
    try
    {
        // Initialize WebMail helper
        WebMail.SmtpServer = "localhost";
        WebMail.SmtpPort = 25;   // Or the port you've been told to use
        WebMail.EnableSsl = false;
        WebMail.UserName = "";
        WebMail.Password = "";
        WebMail.From = "admin@testserver.com"; // random email

        WebMail.Send(to: test_address,
            subject: "Test email message",
            body: "This is a debug email message"
        );
    }
    catch (Exception ex)
    {
        ViewBag.errorMessage = ex.Message; // catch error
    }

    return View();
}

这是我的SMTP电子邮件设置:

enter image description here

错误信息为:邮箱不可用。服务器响应为:5.7.1无法中继到test@blabla.com(当我将电子邮件地址文本框留空时,或者输入任何电子邮件格式,例如sample@email.com / my primary e-mail时,都会出现此问题)。


这通常是由于登录信息不正确引起的。是否为SMTP指定了用户? - user1666620
嗯...你是指我用来访问服务器的用户名和密码吗?如果是这样,我有,但是对于SMTP我想我没有。 - user3848402
有时候需要根据设置指定域用户。另外,也可以参考这个链接:https://dev59.com/t3A75IYBdhLWcg3wrbG_ - user1666620
当您执行WebMail.Send(to: test_address)时,您设置了test@blabla.com,因此不要感到惊讶,它总是尝试发送到它...猜猜怎么着...它不存在! - Paul Zahra
@PaulZahra:测试@blabla.com 这里只是一个样例,我实际上已经发送到了我的存在的第二个电子邮件。 - user3848402
@user1666620:我已经阅读了您的参考资料,并使用IIS 6.0设置了我的虚拟SMTP服务器,但它返回“发送邮件失败”。 - user3848402
2个回答

4
您需要将smtp设置为真实的smtp服务器。如果您没有自己的服务器,可以从这个列表中尝试一些smtp服务器...
这是一段很棒的代码,取自此处MailModel.cs
public class MailModel
{
    public string From { get; set; }
    public string To { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }
}

SendMailerController.cs - 注意smtp设置的位置

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Web;
using System.Web.Mvc; 

namespace SendMail.Controllers
{
    public class SendMailerController : Controller
    {
        // GET: /SendMailer/ 
        public ActionResult Index()
        {
            return View();
        } 

        [HttpPost]
        public ViewResult Index(SendMail.Models.MailModel _objModelMail)
        {
            if (ModelState.IsValid)
            {
                MailMessage mail = new MailMessage();
                mail.To.Add(_objModelMail.To);
                mail.From = new MailAddress(_objModelMail.From);
                mail.Subject = _objModelMail.Subject;
                string Body = _objModelMail.Body;
                mail.Body = Body;
                mail.IsBodyHtml = true;

                SmtpClient smtp = new SmtpClient();
                smtp.Host = "smtp.gmail.com";
                smtp.Port = 587;
                smtp.UseDefaultCredentials = false;
                smtp.Credentials = new System.Net.NetworkCredential
                ("username", "password");// Enter senders User name and password
                smtp.EnableSsl = false;
                smtp.Send(mail);

                return View("Index", _objModelMail);
            }
            else
            {
                return View();
            }
        }
    }
}

Index.cshtml

@model SendMail.Models.MailModel
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
<fieldset>
    <legend>Send Email</legend>
    @using (Html.BeginForm())
    {
        @Html.ValidationSummary()
        <p>From: </p>
        <p>@Html.TextBoxFor(m=>m.From)</p>
        <p>To: </p>
        <p>@Html.TextBoxFor(m=>m.To)</p>
        <p>Subject: </p>
        <p>@Html.TextBoxFor(m=>m.Subject)</p>
        <p>Body: </p>
        <p>@Html.TextAreaFor(m=>m.Body)</p>
        <input type ="submit" value ="Send" />
    }
</fieldset>

更新 如何在IIS7上设置SMTP服务器

  1. 开始->管理工具->服务器管理器,进入功能,选择“添加功能”,勾选“SMTP服务器”(如果尚未安装),选择安装所需的“远程服务器管理工具”

  2. 确认“简单邮件传输协议(SMTP)”服务正在运行,如果是,则可以继续。

  3. 开始->管理工具>Internet信息服务(IIS)6.0

  4. 确保SMTP虚拟服务器/默认SMTP服务器正在运行,如果没有,请右键单击,然后选择“启动”

  5. 在IIS7中,进入网站/虚拟目录,双击“SMTP电子邮件”,单击“将电子邮件发送到SMTP服务器”,选中“使用本地主机”复选框


非常感谢您的回答,我非常感激。我已经尝试了这些方法,并且它们有效,但是它使用的是 Gmail SMTP,而我想使用我的服务器 SMTP...不过我不知道我的服务器是否实际上有 SMTP 服务器...无论如何,谢谢 :D - user3848402
但是我以为你说你没有你的SMTP服务器的详细信息? - Paul Zahra
抱歉回复晚了,经过与我的经理讨论,他同意使用Gmail SMTP,但是暂时我会使用你的代码,按照所有步骤进行,但是出现了异常:SMTP服务器需要安全连接或客户端未经身份验证。服务器响应为:5.5.1需要身份验证。请在Learn more at...中了解更多信息。 - user3848402
@user3848402 基本上...你需要一个Gmail帐户才能发送邮件...https://accounts.google.com/SignUp?service=mail&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fpc%3Dtopnav-about-en - Paul Zahra
抱歉,因为周末我最终休了假。我尝试了你的方法,我认为问题在于我的服务器,我尝试了我的公司SMTP,它确实发送了邮件,但需要相当长的时间,大约2个小时...谢谢Paul,我使用了你的方法:D - user3848402

1
为什么不尝试使用Gmail作为邮件发送方?它易于使用。
我一直在构建简单的方法。
public void SendEmail()
{
    MailMessage mail = new MailMessage("xxx@gmail.com", "sendTo", "mailSubject", "mailBody");
    mail.From = new MailAddress("xxx@gmail.com", "nameEmail");
    mail.IsBodyHtml = true; // necessary if you're using html email

    NetworkCredential credential = new NetworkCredential("xxx@gmail.com", "xxxxx");
    SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
    smtp.EnableSsl = true;
    smtp.UseDefaultCredentials = false;
    smtp.Credentials = credential;
    smtp.Send(mail);
}

如果您想等待电子邮件发送,请使用async/await

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接