如何在 angular 应用程序中显示电子邮件,就像它在电子邮件客户端中显示一样
How to display emails in an angular app like it gets displayed in an email client
我目前正在尝试开发一个网络应用程序来向用户显示电子邮件。对我来说重要的是,电子邮件的显示方式就像在电子邮件客户端(例如 gmail)中一样。
我使用 gmail api 将电子邮件导入我的数据库,然后我从电子邮件中获取消息部分到我的 angular 应用程序中。
问题是我无法显示具有适当样式的 html 电子邮件。 html 标签似乎得到了正确使用,但原始样式似乎丢失了
我正在使用 angular 7 和 spring 启动。为了收集电子邮件,我使用 gmail api 并将它们导入到 postgresql 数据库中。我尝试使用 iframe,因此我的应用程序样式不会妨碍电子邮件样式,但它会以相同的方式显示。
我如何准备电子邮件
private String getMessageContent(Message message) {
StringBuilder stringBuilder = new StringBuilder();
try {
if(message.getPayload().getParts() != null) {
handleEmailMainContent(message.getPayload().getParts(), stringBuilder);
byte[] bodyBytes = Base64.decodeBase64(stringBuilder.toString());
return new String(bodyBytes, "UTF-8");
} else {
return "";
}
} catch (UnsupportedEncodingException e) {
System.out.println("UnsupportedEncoding: " + e.toString());
return message.getSnippet();
}
}
private void handleEmailMainContent(List<MessagePart> messageParts, StringBuilder stringBuilder) {
for (MessagePart messagePart : messageParts) {
switch (messagePart.getMimeType()) {
case "text/plain":
handleMimeTypeTextPlain(messagePart, stringBuilder);
break;
case "text/html":
handleMimeTypeTextHtml(messagePart, stringBuilder);
break;
default:
break;
}
}
}
注意:selectedEmail.mainContent是我上面构建的String
例子
mainContent 里面的内容是我试图收集和展示的钓鱼邮件。该示例是我尝试显示的 html 电子邮件。
我省略了 link 和大部分垃圾邮件内容。
------------转发的消息--------
冯:电子邮件地址
日期:2019 年 5 月 10 日星期五 um 22:06 Uhr
主题:姓名,给妈妈她想要的礼物
收件人:电子邮件地址
图片
在 Facebook 上成为 Heally 家族的一员
link
!
- 让我们谈谈
庆祝妈妈
...
妈妈 运行 全世界。他们从字面上给了我们生命,承担了最艰难的任务之一
角色,并在不结束工作日或任何休息时间的情况下完成所有工作。尽管
妈妈们全年都值得庆祝,母亲节是一个特殊的时刻
确保他们知道他们受到爱戴和赞赏。
学到更多
link
寻找仅限 CBD 的产品?
促销代码:SAVECBD20
link
中央商务区 20% OFF
link
给妈妈她真正想要的礼物。
在 Marketplace 购物
-省略垃圾邮件-
您收到这封电子邮件是因为您或您的医疗服务提供者有
注册了 Heally 帐户。
退订
link
版权所有 (C) 2019 Heally Inc。保留所有权利。
退订
自己的例子
我试图向自己发送一封包含以下内容的简约 html 电子邮件:
*dummy*
<div dir="ltr"><i>dummy</i></div>
而且效果很好。也许问题是外部 class 没有得到 displayed/loaded and/or 没有被 gmail api
导出
我是如何尝试显示它的
<mat-card>
<mat-card-title>
Current Email
</mat-card-title>
<mat-card-content [innerHTML]="selectedEmail.mainContent">
</mat-card-content>
</mat-card>
我想像在 gmail 中一样显示电子邮件,而我只能通过 html 标签显示纯文本和基本样式。
我不明白在我的哪个步骤中样式丢失了,或者我是否没有正确显示电子邮件。
Angular security 阻止 HTML 和其他脚本的动态呈现。您需要使用 DOM Sanitizer 绕过它们。
在此处阅读更多内容:Angular Security
对您的代码进行以下更改:
// in your component.ts file
//import this
import { DomSanitizer } from '@angular/platform-browser';
export class TestComponent{
public htmlData :any ;
// in constructor create object
constructor(
...
private sanitizer: DomSanitizer
...
){
}
someMethod(){
/* this method must be called after getting the value of selectedEmail.mainContent
from service */
this.htmlData = this.sanitizer.bypassSecurityTrustHtml(selectedEmail.mainContent); // this line bypasses angular security
}
}
并在 compoenent.html
<div [innerHtml]="htmlData"> </div>
这是工作中的 StackBlitz:Working Demo
我目前正在尝试开发一个网络应用程序来向用户显示电子邮件。对我来说重要的是,电子邮件的显示方式就像在电子邮件客户端(例如 gmail)中一样。 我使用 gmail api 将电子邮件导入我的数据库,然后我从电子邮件中获取消息部分到我的 angular 应用程序中。 问题是我无法显示具有适当样式的 html 电子邮件。 html 标签似乎得到了正确使用,但原始样式似乎丢失了
我正在使用 angular 7 和 spring 启动。为了收集电子邮件,我使用 gmail api 并将它们导入到 postgresql 数据库中。我尝试使用 iframe,因此我的应用程序样式不会妨碍电子邮件样式,但它会以相同的方式显示。
我如何准备电子邮件
private String getMessageContent(Message message) {
StringBuilder stringBuilder = new StringBuilder();
try {
if(message.getPayload().getParts() != null) {
handleEmailMainContent(message.getPayload().getParts(), stringBuilder);
byte[] bodyBytes = Base64.decodeBase64(stringBuilder.toString());
return new String(bodyBytes, "UTF-8");
} else {
return "";
}
} catch (UnsupportedEncodingException e) {
System.out.println("UnsupportedEncoding: " + e.toString());
return message.getSnippet();
}
}
private void handleEmailMainContent(List<MessagePart> messageParts, StringBuilder stringBuilder) {
for (MessagePart messagePart : messageParts) {
switch (messagePart.getMimeType()) {
case "text/plain":
handleMimeTypeTextPlain(messagePart, stringBuilder);
break;
case "text/html":
handleMimeTypeTextHtml(messagePart, stringBuilder);
break;
default:
break;
}
}
}
注意:selectedEmail.mainContent是我上面构建的String
例子
mainContent 里面的内容是我试图收集和展示的钓鱼邮件。该示例是我尝试显示的 html 电子邮件。 我省略了 link 和大部分垃圾邮件内容。
------------转发的消息-------- 冯:电子邮件地址 日期:2019 年 5 月 10 日星期五 um 22:06 Uhr 主题:姓名,给妈妈她想要的礼物 收件人:电子邮件地址
图片 在 Facebook 上成为 Heally 家族的一员 link ! - 让我们谈谈 庆祝妈妈 ... 妈妈 运行 全世界。他们从字面上给了我们生命,承担了最艰难的任务之一 角色,并在不结束工作日或任何休息时间的情况下完成所有工作。尽管 妈妈们全年都值得庆祝,母亲节是一个特殊的时刻 确保他们知道他们受到爱戴和赞赏。 学到更多 link
寻找仅限 CBD 的产品? 促销代码:SAVECBD20 link 中央商务区 20% OFF link 给妈妈她真正想要的礼物。 在 Marketplace 购物
-省略垃圾邮件-
您收到这封电子邮件是因为您或您的医疗服务提供者有 注册了 Heally 帐户。 退订 link 版权所有 (C) 2019 Heally Inc。保留所有权利。 退订
自己的例子
我试图向自己发送一封包含以下内容的简约 html 电子邮件:
*dummy*
<div dir="ltr"><i>dummy</i></div>
而且效果很好。也许问题是外部 class 没有得到 displayed/loaded and/or 没有被 gmail api
导出我是如何尝试显示它的
<mat-card>
<mat-card-title>
Current Email
</mat-card-title>
<mat-card-content [innerHTML]="selectedEmail.mainContent">
</mat-card-content>
</mat-card>
我想像在 gmail 中一样显示电子邮件,而我只能通过 html 标签显示纯文本和基本样式。 我不明白在我的哪个步骤中样式丢失了,或者我是否没有正确显示电子邮件。
Angular security 阻止 HTML 和其他脚本的动态呈现。您需要使用 DOM Sanitizer 绕过它们。
在此处阅读更多内容:Angular Security
对您的代码进行以下更改:
// in your component.ts file
//import this
import { DomSanitizer } from '@angular/platform-browser';
export class TestComponent{
public htmlData :any ;
// in constructor create object
constructor(
...
private sanitizer: DomSanitizer
...
){
}
someMethod(){
/* this method must be called after getting the value of selectedEmail.mainContent
from service */
this.htmlData = this.sanitizer.bypassSecurityTrustHtml(selectedEmail.mainContent); // this line bypasses angular security
}
}
并在 compoenent.html
<div [innerHtml]="htmlData"> </div>
这是工作中的 StackBlitz:Working Demo