如何将Firestore数据库数据通过Mailer嵌入邮件发送?
问题
已实现Flutter应用读取Firestore数据展示,且点击「¡Alertar!」按钮可通过Mailer发送邮件,但无法将对应卡片的症状数据嵌入邮件内容,当前仅发送固定HTML内容。
解决步骤
- 修改
sendEmail方法,添加参数接收当前卡片的Firestore文档数据 - 在按钮点击时传入对应文档数据
- 基于传入的数据动态生成邮件HTML内容
修改后的代码
数据展示部分(关键修改)
// ... 其他代码保持不变 TextButton( child: Text("¡Alertar!"), // 传入当前卡片对应的文档数据 onPressed: () => sendEmail(data.docs[index].data() as Map<String, dynamic>), ), // ... 其他代码保持不变
邮件发送方法(完整修改)
// 修改方法,添加参数接收文档数据 Future sendEmail(Map<String, dynamic> symptomData) async { final user = await GoogleAuthApi.signIn(); if (user == null) return; final email = user.email; final auth = await user.authentication; final token = auth.accessToken!; print('Authenticated: $email'); GoogleAuthApi.signOut(); final smtpServer = gmailSaslXoauth2(email, token); // 根据症状数据生成动态HTML内容 final htmlContent = ''' <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Alerta de Síntomas</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <h2>¡Alerta de Síntomas!</h2> <p><strong>Fecha ingreso sintoma:</strong> ${symptomData['Fecha ingreso sintoma']}</p> <ul> <li>Fatiga: ${symptomData['Fatiga'] ? "Si" : "No"}</li> <li>Miccion: ${symptomData['Miccion'] ? "Si" : "No"}</li> <li>Flujo Vaginal: ${symptomData['Flujo Vaginal'] ? "Si" : "No"}</li> <li>Estreñimiento: ${symptomData['Estreñimiento'] ? "Si" : "No"}</li> <li>Acidez Gastrica: ${symptomData['Acidez Gastrica'] ? "Si" : "No"}</li> <li>Sangrado Nasal: ${symptomData['Sangrado Nasal'] ? "Si" : "No"}</li> <li>Sangrado de encias: ${symptomData['Sangrado de encias'] ? "Si" : "No"}</li> <li>Hinchazon: ${symptomData['Hinchazon'] ? "Si" : "No"}</li> <li>Problemas respiratarios: ${symptomData['Problemas respiratarios'] ? "Si" : "No"}</li> </ul> </body> </html> '''; final message = Message() ..from = Address(email, 'Aplicacion contro embarazos alto riesgo!') ..recipients = ['gx_13@hotmail.com'] ..subject = '¡¡Alertar!! ' ..html = htmlContent; try { await send(message, smtpServer); showSnackBar('Alerta Enviada'); } on MailerException catch (e) { print(e); } } void showSnackBar(String text) { final snackBar = SnackBar( content: Text( text, style: TextStyle(fontSize: 20), ), backgroundColor: Colors.green, ); ScaffoldMessenger.of(context) ..removeCurrentSnackBar() ..showSnackBar(snackBar); }
说明
- 通过给
sendEmail添加参数,将当前卡片的症状数据传递到邮件发送逻辑中 - 动态生成HTML内容时,直接使用传入的
symptomData中的字段值,确保邮件内容与点击的卡片数据对应 - 修复了原SnackBar文本的拼写错误(
sAlerta改为Alerta)
内容的提问来源于stack exchange,提问作者jmichelena
相关产品推荐
相关产品推荐

