Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Além das chamadas telefónicas, os Serviços de Comunicação do Azure também podem enviar mensagens de correio eletrónico e SMS. Isso pode ser útil quando você deseja enviar uma mensagem para um cliente ou outro usuário diretamente do aplicativo.
Neste exercício, você irá:
- Explore como as mensagens de e-mail e SMS podem ser enviadas a partir da aplicação.
- Percorra o código para saber como a funcionalidade de e-mail e SMS é implementada.
Usando os recursos de e-mail e SMS
Em um exercício anterior , você criou um recurso dos Serviços de Comunicação do Azure (ACS) e iniciou o banco de dados, o servidor Web e o servidor de API. Você também atualizou os seguintes valores no arquivo .env .
ACS_CONNECTION_STRING=<ACS_CONNECTION_STRING> ACS_PHONE_NUMBER=<ACS_PHONE_NUMBER> ACS_EMAIL_ADDRESS=<ACS_EMAIL_ADDRESS> CUSTOMER_EMAIL_ADDRESS=<EMAIL_ADDRESS_TO_SEND_EMAIL_TO> CUSTOMER_PHONE_NUMBER=<UNITED_STATES_BASED_NUMBER_TO_SEND_SMS_TO>Certifique-se de ter concluído o exercício anterior antes de continuar.
Volte para o navegador (http://localhost:4200) e selecione Entrar em contato com o cliente seguido de E-mail/SMS Cliente na primeira linha.
Selecione a guia E-mail/SMS e execute as seguintes tarefas:
- Insira um assunto e corpo do e-mail e selecione o botão Enviar e-mail.
- Insira uma mensagem SMS e selecione o botão Enviar SMS .
Observação
A verificação por SMS para números gratuitos é agora obrigatória nos Estados Unidos e no Canadá. Para habilitar as mensagens SMS, você deve enviar a verificação após a compra do número de telefone. Embora este tutorial não passe por esse processo, você pode selecionar Telefonia e SMS -->Documentos Regulatórios do recurso Serviços de Comunicação do Azure no portal do Azure e adicionar a documentação de validação necessária.
Verifique se recebeu o e-mail e as mensagens SMS. A funcionalidade SMS só funcionará se você enviar os documentos regulamentares mencionados na nota anterior. Como lembrete, a mensagem de e-mail será enviada para o valor definido para
CUSTOMER_EMAIL_ADDRESSe a mensagem SMS será enviada para o valor definido paraCUSTOMER_PHONE_NUMBERo arquivo .env . Se você não foi capaz de fornecer um número de telefone baseado nos Estados Unidos para usar para mensagens SMS, você pode pular essa etapa.Observação
Se não vir a mensagem de e-mail na sua caixa de entrada para o endereço que definiu
CUSTOMER_EMAIL_ADDRESSno ficheiro .env , verifique a sua pasta de spam.
Explorando o código de e-mail
Sugestão
Se você estiver usando o Visual Studio Code, poderá abrir arquivos diretamente selecionando:
- Windows/Linux: Ctrl + P
- Mac: Cmd + P
Em seguida, digite o nome do arquivo que deseja abrir.
Abra o arquivo customers-list.component.ts . O caminho completo para o arquivo é client/src/app/customers-list/customers-list.component.ts.
Quando você selecionou Entrar em contato com o cliente seguido de E-mail/SMS Cliente na grade de dados, o
customer-listcomponente exibiu uma caixa de diálogo. Isso é tratado pelaopenEmailSmsDialog()função no arquivo customer-list.component.ts .openEmailSmsDialog(data: any) { if (data.phone && data.email) { // Create the data for the dialog let dialogData: EmailSmsDialogData = { prompt: '', title: `Contact ${data.company}`, company: data.company, customerName: data.first_name + ' ' + data.last_name, customerEmailAddress: data.email, customerPhoneNumber: data.phone } // Open the dialog const dialogRef = this.dialog.open(EmailSmsDialogComponent, { data: dialogData }); // Subscribe to the dialog afterClosed observable to get the dialog result this.subscription.add( dialogRef.afterClosed().subscribe((response: EmailSmsDialogData) => { console.log('SMS dialog result:', response); if (response) { dialogData = response; } }) ); } else { alert('No phone number available.'); } }A
openEmailSmsDialog()função executa as seguintes tarefas:- Verifica se o
dataobjeto (que representa a linha da grade de dados) contém umaphonepropriedade andemail. Se isso acontecer, ele criará umdialogDataobjeto que contém as informações a serem passadas para a caixa de diálogo. - Abre a
EmailSmsDialogComponentcaixa de diálogo e passa odialogDataobjeto para ela. - Inscreve-se no
afterClosed()evento da caixa de diálogo. Esse evento é acionado quando a caixa de diálogo é fechada. Oresponseobjeto contém as informações que foram inseridas na caixa de diálogo.
- Verifica se o
Abra o arquivo email-sms-dialog.component.ts . O caminho completo para o arquivo é client/src/app/email-sms-dialog/email-sms-dialog.component.ts.
Localize a
sendEmail()função:sendEmail() { if (this.featureFlags.acsEmailEnabled) { // Using CUSTOMER_EMAIL_ADDRESS instead of this.data.email for testing purposes this.subscription.add( this.acsService.sendEmail(this.emailSubject, this.emailBody, this.getFirstName(this.data.customerName), CUSTOMER_EMAIL_ADDRESS /* this.data.email */) .subscribe(res => { console.log('Email sent:', res); if (res.status) { this.emailSent = true; } }) ); } else { this.emailSent = true; // Used when ACS email isn't enabled } }A
sendEmail()função executa as seguintes tarefas:- Verifica se o sinalizador de
acsEmailEnabledrecurso está definido comotrue. Esse sinalizador verifica se aACS_EMAIL_ADDRESSvariável de ambiente tem um valor atribuído. - Se
acsEmailEnabledfor true, aacsService.sendEmail()função é chamada e o assunto do e-mail, corpo, nome do cliente e endereço de e-mail do cliente são passados. Como o banco de dados contém dados de exemplo, aCUSTOMER_EMAIL_ADDRESSvariável de ambiente é usada em vez dethis.data.email. Em um aplicativo do mundo real, othis.data.emailvalor seria usado. - Subscreve a
sendEmail()função noacsServiceserviço. Esta função retorna um RxJS observável que contém a resposta do serviço do lado do cliente. - Se o e-mail foi enviado com êxito, a
emailSentpropriedade é definida comotrue.
- Verifica se o sinalizador de
Para fornecer melhor encapsulamento e reutilização de código, serviços do lado do cliente, como acs.service.ts são usados em todo o aplicativo. Isso permite que todas as funcionalidades do ACS sejam consolidadas em um único local.
Abra acs.service.ts e localize a
sendEmail()função. O caminho completo para o arquivo é client/src/app/core/acs.service.ts.sendEmail(subject: string, message: string, customerName: string, customerEmailAddress: string) : Observable<EmailSmsResponse> { return this.http.post<EmailSmsResponse>(this.apiUrl + 'sendEmail', { subject, message, customerName, customerEmailAddress }) .pipe( catchError(this.handleError) ); }A
sendEmail()função emAcsServiceexecuta as seguintes tarefas:- Chama a
http.post()função e passa o assunto do e-mail, a mensagem, o nome do cliente e o endereço de e-mail do cliente para ela. Ahttp.post()função retorna um RxJS observável que contém a resposta da chamada de API. - Manipula quaisquer erros retornados
http.post()pela função usando o operador RxJScatchError.
- Chama a
Agora vamos examinar como o aplicativo interage com o recurso de e-mail ACS. Abra o arquivo acs.ts e localize a
sendEmail()função. O caminho completo para o arquivo é server/typescript/acs.ts.A
sendEmail()função executa as seguintes tarefas:Cria um novo
EmailClientobjeto e passa a cadeia de conexão ACS para ele (esse valor é recuperado daACS_CONNECTION_STRINGvariável de ambiente).const emailClient = new EmailClient(connectionString);Cria um novo
EmailMessageobjeto e passa as informações do remetente, assunto, mensagem e destinatário.const msgObject: EmailMessage = { senderAddress: process.env.ACS_EMAIL_ADDRESS as string, content: { subject: subject, plainText: message, }, recipients: { to: [ { address: customerEmailAddress, displayName: customerName, }, ], }, };Envia o e-mail usando a
emailClient.beginSend()função e retorna a resposta. Embora a função esteja enviando apenas para um destinatário neste exemplo, abeginSend()função também pode ser usada para enviar para vários destinatários.const poller = await emailClient.beginSend(msgObject);Aguarda que o
pollerobjeto sinalize que está feito e envia a resposta para o chamador.
Explorando o código SMS
Volte ao ficheiro email-sms-dialog.component.ts que abriu anteriormente. O caminho completo para o arquivo é client/src/app/email-sms-dialog/email-sms-dialog.component.ts.
Localize a
sendSms()função:sendSms() { if (this.featureFlags.acsPhoneEnabled) { // Using CUSTOMER_PHONE_NUMBER instead of this.data.customerPhoneNumber for testing purposes this.subscription.add( this.acsService.sendSms(this.smsMessage, CUSTOMER_PHONE_NUMBER /* this.data.customerPhoneNumber */) .subscribe(res => { if (res.status) { this.smsSent = true; } }) ); } else { this.smsSent = true; } }A
sendSMS()função executa as seguintes tarefas:- Verifica se o sinalizador de
acsPhoneEnabledrecurso está definido comotrue. Esse sinalizador verifica se aACS_PHONE_NUMBERvariável de ambiente tem um valor atribuído. - Se
acsPhoneEnabledfor verdade, aacsService.SendSms()função é chamada e a mensagem SMS e o número de telefone do cliente são passados. Como o banco de dados contém dados de exemplo, aCUSTOMER_PHONE_NUMBERvariável de ambiente é usada em vez dethis.data.customerPhoneNumber. Em um aplicativo do mundo real, othis.data.customerPhoneNumbervalor seria usado. - Subscreve a
sendSms()função noacsServiceserviço. Esta função retorna um RxJS observável que contém a resposta do serviço do lado do cliente. - Se a mensagem SMS foi enviada com êxito, ela define a
smsSentpropriedade comotrue.
- Verifica se o sinalizador de
Abra acs.service.ts e localize a
sendSms()função. O caminho completo para o arquivo é client/src/app/core/acs.service.ts.sendSms(message: string, customerPhoneNumber: string) : Observable<EmailSmsResponse> { return this.http.post<EmailSmsResponse>(this.apiUrl + 'sendSms', { message, customerPhoneNumber }) .pipe( catchError(this.handleError) ); }A
sendSms()função executa as seguintes tarefas:- Chama a
http.post()função e passa a mensagem e o número de telefone do cliente para ela. Ahttp.post()função retorna um RxJS observável que contém a resposta da chamada de API. - Manipula quaisquer erros retornados
http.post()pela função usando o operador RxJScatchError.
- Chama a
Finalmente, vamos examinar como o aplicativo interage com o recurso ACS SMS. Abra o arquivo acs.ts . O caminho completo para o arquivo é server/typescript/acs.ts e localize a
sendSms()função.A
sendSms()função executa as seguintes tarefas:Cria um novo
SmsClientobjeto e passa a cadeia de conexão ACS para ele (esse valor é recuperado daACS_CONNECTION_STRINGvariável de ambiente).const smsClient = new SmsClient(connectionString);Chama a
smsClient.send()função e passa o número de telefone ACS (from), número de telefone do cliente (to) e mensagem SMS:const sendResults = await smsClient.send({ from: process.env.ACS_PHONE_NUMBER as string, to: [customerPhoneNumber], message: message }); return sendResults;Retorna a resposta ao chamador.
Você pode saber mais sobre a funcionalidade de e-mail e SMS do ACS nos seguintes artigos:
Antes de passar para o próximo exercício, vamos rever os principais conceitos abordados neste exercício:
- O arquivo acs.service.ts encapsula a funcionalidade de e-mail e SMS ACS usada pelo aplicativo do lado do cliente. Ele lida com as chamadas de API para o servidor e retorna a resposta para o chamador.
- A API do lado do servidor usa o ACS e
EmailClientobjetos para enviar mensagens deSmsCliente-mail e SMS.
Agora que você já aprendeu como as mensagens de e-mail e SMS podem ser enviadas, vamos mudar nosso foco para a integração de dados organizacionais no aplicativo.