如何从 Angular .Netcore 应用程序发送带有附件的电子邮件?
How to send email from Angular .Netcore application with attachment?
所以我得到了一个 MVC 应用程序,我试图在 DotNet 服务器上从 Angular 表单 运行 发送电子邮件。我看到的主要问题是当我从 Angular 组件调用服务时,它 returns 404(可能 URL 未找到)。
现在,我的控制器中有一条消息应该打印出来,但它并没有打印出来,这意味着我的 Angular 无法与我的后端控制器通信。
这是我的发送-Email.component.ts 提交功能
submit() {
if (this.EmailForm.valid) {
this.eServ.sendEmail(this.EmailForm.getRawValue()).subscribe(result => {
console.log("Email sent!");
});
this.ref.close(this.EmailForm.getRawValue())
}
}
这是我的email.service
export class EmailService {
constructor(private http: HttpClient) { }
headers = new HttpHeaders().set('Content-Type', 'application/json; charset=utf-8');
sendEmail(mailMessage: any) {
return this.http.post('api/mail/sendmail', JSON.stringify(mailMessage), { headers: this.headers })
}
}
最后,这是我的控制器:
[Route("api/mail/sendmail")]
[ApiController]
public class EmailController : ControllerBase
{
[HttpPost]
public async Task<IActionResult> SendMail([FromBody] Email email)
{
Console.WriteLine("Sending email");
var client = new System.Net.Mail.SmtpClient("smtp.example.com", 111);
client.UseDefaultCredentials = false;
client.EnableSsl = true;
client.Credentials = new System.Net.NetworkCredential(emailid, password);
var mailMessage = new System.Net.Mail.MailMessage();
mailMessage.From = new System.Net.Mail.MailAddress(senderemail);
mailMessage.To.Add(email.To);
mailMessage.Body = email.Text;
await client.SendMailAsync(mailMessage);
return Ok();
}
}
}
现在,我不明白为什么它不能与控制器对话。有什么我想念的吗?
TIA!!
您的 API 调用中没有 URL 的域部分。
sendEmail(mailMessage: any) {
return this.http.post('https://example.com/api/mail/sendmail',
JSON.stringify(mailMessage), { headers: this.headers })
}
看起来服务需要发送电子邮件对象而不是“任何”对象。在组件中,使用 Object.Assign 创建一个新的电子邮件对象。
Email.service
sendEmail(mailMessage: Email) {
return this.http.post<Email>('api/email/sendmail', JSON.stringify(mailMessage), { headers: this.headers })
}
发送-Email.Component
submit() {
if (this.EmailForm.valid) {
let dataToSend: Email = Object.assign(new Email(), this.EmailForm.getRawValue())// add this
// then the rest of the code
}
}
控制器看起来不错。让我知道它是否有效。
--更新--
在你的控制器中,路由应该是:
[Route("api/email/sendmail")]
因为您的控制器名称是电子邮件而不是邮件。
所以我得到了一个 MVC 应用程序,我试图在 DotNet 服务器上从 Angular 表单 运行 发送电子邮件。我看到的主要问题是当我从 Angular 组件调用服务时,它 returns 404(可能 URL 未找到)。
现在,我的控制器中有一条消息应该打印出来,但它并没有打印出来,这意味着我的 Angular 无法与我的后端控制器通信。
这是我的发送-Email.component.ts 提交功能
submit() {
if (this.EmailForm.valid) {
this.eServ.sendEmail(this.EmailForm.getRawValue()).subscribe(result => {
console.log("Email sent!");
});
this.ref.close(this.EmailForm.getRawValue())
}
}
这是我的email.service
export class EmailService {
constructor(private http: HttpClient) { }
headers = new HttpHeaders().set('Content-Type', 'application/json; charset=utf-8');
sendEmail(mailMessage: any) {
return this.http.post('api/mail/sendmail', JSON.stringify(mailMessage), { headers: this.headers })
}
}
最后,这是我的控制器:
[Route("api/mail/sendmail")]
[ApiController]
public class EmailController : ControllerBase
{
[HttpPost]
public async Task<IActionResult> SendMail([FromBody] Email email)
{
Console.WriteLine("Sending email");
var client = new System.Net.Mail.SmtpClient("smtp.example.com", 111);
client.UseDefaultCredentials = false;
client.EnableSsl = true;
client.Credentials = new System.Net.NetworkCredential(emailid, password);
var mailMessage = new System.Net.Mail.MailMessage();
mailMessage.From = new System.Net.Mail.MailAddress(senderemail);
mailMessage.To.Add(email.To);
mailMessage.Body = email.Text;
await client.SendMailAsync(mailMessage);
return Ok();
}
}
}
现在,我不明白为什么它不能与控制器对话。有什么我想念的吗?
TIA!!
您的 API 调用中没有 URL 的域部分。
sendEmail(mailMessage: any) {
return this.http.post('https://example.com/api/mail/sendmail',
JSON.stringify(mailMessage), { headers: this.headers })
}
看起来服务需要发送电子邮件对象而不是“任何”对象。在组件中,使用 Object.Assign 创建一个新的电子邮件对象。
Email.service
sendEmail(mailMessage: Email) {
return this.http.post<Email>('api/email/sendmail', JSON.stringify(mailMessage), { headers: this.headers })
}
发送-Email.Component
submit() {
if (this.EmailForm.valid) {
let dataToSend: Email = Object.assign(new Email(), this.EmailForm.getRawValue())// add this
// then the rest of the code
}
}
控制器看起来不错。让我知道它是否有效。
--更新--
在你的控制器中,路由应该是:
[Route("api/email/sendmail")]
因为您的控制器名称是电子邮件而不是邮件。