1# 拉起邮件类应用(mailto方式)
2
3## 使用场景
4
5通过mailto电子邮件协议,可以创建指向电子邮件地址的超链接,方便用户通过网页或应用中的超链接直接跳转电子邮件应用。同时,支持在`mailto:`的相关字段中定义邮件的收件人、主题、正文内容等,节省用户编辑邮件的时间。
6
7常见的应用场景举例如下:
8
9- 从网页拉起:
10    - 用户在购物网站浏览产品页面时,看到“联系我们”按钮,点击后会拉起默认邮件客户端。收件人自动填写为客服邮箱,邮件主题设定为产品咨询。
11    - 在招聘岗位页面,点击“申请职位”按钮,会拉起邮件客户端。收件人地址为招聘邮箱,邮件主题为“应聘某职位”,正文可以预先填入申请模板。
12- 从应用拉起:
13    - 移动应用中,用户点击“反馈”按钮时,应用调用系统功能,拉起默认邮件客户端,预先填写反馈邮箱、问题描述等信息。
14    - 移动应用中,当用户点击“通过邮件分享”按钮时,应用会通过 `mailto` 调用邮件客户端,预填邮件主题和正文。
15
16## mailto协议格式
17
18mailto协议标准格式如下:
19
20```
21mailto:someone@example.com?key1=value1&key2=value2
22```
23
24+ `mailto:`:mailto scheme,必填。
25+ `someone@example.com`:收件人地址,选填。如果存在多个地址,用英文逗号分隔。
26+ `?`:邮件头声明开始符号。如果带邮件头参数,则必填。
27+ `key-value`:邮件头参数,详细参数见下表。
28
29  | 邮件头| 含义| 数据类型 | 是否必填|
30  | --- | --- | --- | --- |
31  | subject | 邮件主题 | string | 否 |
32  | body | 邮件正文 | string | 否 |
33  | cc| 抄送人,多个用逗号分隔 | string | 否 |
34  | bcc| 密送人,多个用逗号分隔 | string | 否 |
35
36## 拉起方开发步骤
37
38### 从网页拉起
39
40网页中的超链接需要满足mailto协议。示例如下:
41
42
43```
44<a href="mailto:support@example.com?subject=Product Inquiry&body=I am interested in...">联系我们</a>
45```
46实际开发时,需要将邮箱地址替换为真实的邮箱,邮件内容可以根据需要进行配置。
47
48实现效果如下:
49![image](figures/mailto-html.gif)
50
51### 从应用拉起
52
53保证mailto字符串传入uri参数即可,在应用中page页面可通过 getContext(this) 获取context,在ability中可通过this.context获取context。
54
55```ts
56@Entry
57@Component
58struct Index {
59
60  build() {
61    Column() {
62      Button('反馈')
63        .onClick(() => {
64          let ctx = getContext(this) as common.UIAbilityContext;
65          ctx.startAbility({
66            action: 'ohos.want.action.sendToData',
67            uri: 'mailto:feedback@example.com?subject=App Feedback&body=Please describe your feedback here...'
68          })
69
70        })
71    }
72  }
73}
74```
75
76实现效果如下:
77![image](figures/mailto-app.gif)
78
79## 目标方开发步骤
80
811. 为了能够支持被其他应用通过mailto协议拉起,目标应用需要在[module.json5配置文件](../quick-start/module-configuration-file.md)中声明mailto。
82
83    ```json
84    {
85      "module": {
86        // ...
87        "abilities": [
88          {
89            // ...
90            "skills": [
91              {
92              "actions": [
93                  'ohos.want.action.sendToData'
94                ],
95                "uris": [
96                  {
97                    "scheme": "mailto",
98                    // linkFeature 用于适配垂类面板拉起
99                    "linkFeature": 'ComposeMail'
100                  }
101                ]
102              }
103            ]
104          }
105        ]
106      }
107    }
108    ```
109
1102. 目标应用在代码中取出uri参数进行解析。
111
112    ```ts
113    export default class EntryAbility extends UIAbility {
114      onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
115        // 应用冷启动生命周期回调,其他业务处理...
116        parseMailto(want);
117      }
118
119      onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
120        // 应用热启动生命周期回调,其他业务处理...
121        parseMailto(want);
122      }
123
124      public parseMailto(want: Want) {
125        const uri = want?.uri;
126        if (!uri || uri.length <= 0) {
127          return;
128        }
129        // 开始解析 mailto...
130      }
131    }
132
133    ```
134