【问题标题】:How do I send an email from angular to the endpoint using angular 5 and asp.net core如何使用 angular 5 和 asp.net core 从 angular 向端点发送电子邮件
【发布时间】:2019-03-28 22:24:52
【问题描述】:

我要做的是发送一封电子邮件,添加标题信息和电子邮件详细信息,然后将电子邮件作为正文发送。

这是我已经尝试过的代码:

The typescript.
/// <summary> 
/// Send email to the client.
/// </summary>
sendEmail() {
    if (this.email.userId) {
        let headers = new Headers();
        headers.append('Content-Type', 'application/json');
        headers.append('Authorization', 'Bearer ' + abp.auth.getToken());

        let url = `${AppConsts.remoteServiceBaseUrl}/EmailComponents/SendEmail?`;

        if (this.email.recipientEmailAddress) {
            url += `recipientEmail=${encodeURIComponent("" + this.email.recipientEmailAddress)}&`;
        }

        if (this.email.subject) {
            url += `subject=${encodeURIComponent("" + this.email.subject)}&`;
        }

        if (this.name) {
            url += `emailTemplate=${encodeURIComponent("" + this.name)}`;
        }

        this.http.post(url, 
        {
            headers: headers,
            message: this.email.body
        })
        .subscribe(result => {
            this.notify.info(`Email sent successfully.`);
        });
    }
}

    The endpoint controller
    /// <summary>
    /// Sends an email to the recipient email address.
    /// </summary>
    /// <param name="recipientEmail">The recipientEmail.</param>
    /// <param name="subject">The subject.</param>
    /// <param name="message">The message.</param>
    /// <param name="emailTemplate">The email template.</param>
    /// <returns>The asynchronous result.</returns>
    [HttpPost]
    public async Task SendEmail(string recipientEmail, string subject, [FromBody] string message, string emailTemplate)
    {
        var userId = _abpSession.GetUserId();
        var user = await GetCurrentUser(userId);

        if (!string.IsNullOrEmpty(user.EmailAddress))
        {
            //Get smtp details.
            var smtpHost = _emailSmtpSetting.FirstOrDefault(a => a.Name == "SMTP Host");
            var smtpPort = _emailSmtpSetting.FirstOrDefault(b => b.Name == "SMTP Port");
            var fromAddress = _emailSmtpSetting.FirstOrDefault(c => c.Name == "From Address");
            var useSsl = _emailSmtpSetting.FirstOrDefault(d => d.Name == "Use SSL");
            var useDefaultCredential = _emailSmtpSetting.FirstOrDefault(e => e.Name == "Use default credentials");
            var username = _emailSmtpSetting.FirstOrDefault(f => f.Name == "SMTP Username");
            var pwd = _emailSmtpSetting.FirstOrDefault(g => g.Name == "SMTP Password");

            Dictionary<string, string> smtpSettings = new Dictionary<string, string>
            {
                { "SMTP Host", smtpHost.Detail },
                { "SMTP Port", smtpPort.Detail },
                { "From Address", fromAddress.Detail },
                { "Use SSL", useSsl.Detail },
                { "Use default credentials", useDefaultCredential.Detail },
                { "SMTP Username", username.Detail },
                { "SMTP Password", pwd.Detail }
            };

            await _userEmailer.TryToSendEmail(user, message, subject, recipientEmail, AbpSession.GetTenantId(), emailTemplate, smtpSettings);
        }
    }

预期结果是电子邮件参数成功到达端点。我得到的实际结果是 401 unauthorized。

【问题讨论】:

    标签: c# asp.net-mvc angular typescript asp.net-core


    【解决方案1】:

    这可能无法完全为您解决问题,并且我假设您尚未发布完整的控制器,您正在使用 api 控制器,并且您的控制器是这样的:

    [Route("[controller]")]
    [ApiController]
    public class EmailComponentsController : ControllerBase
    {
        [HttpPost]
        public async Task SendEmail(string recipientEmail, string subject, [FromBody] string message, string emailTemplate)
        {
           // your code here...
        }
    }
    

    当你 POST 时,MVC 管道会根据 HTTP 动词匹配方法,在这种情况下是 POST,所以你不应该把方法名放在你的 URL...

    这行得通:

    somedomain.com/EmailComponents?recipientEmail=testEmail&subject=testSubject
    

    这不会:

    somedomain.com/EmailComponents/sendemail?recipientEmail=testEmail&subject=testSubject
    

    这应该会产生 404,而不是 401 响应。

    您是否尝试过删除控制器的身份验证表单以使其无需身份验证即可访问,以缩小问题范围?给类或方法添加[AllowAnnonymous]属性?

    【讨论】:

    • 我会测试 AllowAnnonymous 看看能否到达终点。
    • 仍然无法正常工作@Dave0504 我现在收到 Http status 400 bad request。
    • 感谢您的帮助。我添加了一个链接来帮助解决这个问题。 stackoverflow.com/questions/42352854/…
    猜你喜欢
    • 1970-01-01
    • 2014-10-02
    • 2020-07-20
    • 2018-07-14
    • 2017-08-28
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    相关资源
    最近更新 更多