Как отправить электронное письмо от angular на конечную точку, используя angular 5 и asp.net core - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь отправить электронное письмо с информацией о заголовке и деталях электронной почты, а также отправить сообщение электронной почты в виде основного текста.

Это код, который я уже пробовал:

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 несанкционированный.

1 Ответ

2 голосов
/ 29 марта 2019

Это может не решить проблему полностью для вас, и я предполагаю, что вы не разместили свой полный контроллер, что вы используете контроллер 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] в класс или метод?

...