表概述

mail 表是魔兽世界邮件系统的核心表,记录所有玩家之间发送的邮件信息。每条记录包含一封邮件的发送者、接收者、主题内容、正文、附件金币、COD(付款取信)金额以及过期时间等完整信息。

主键为 id,每封邮件有唯一标识。通过 idx_receiver 索引可以快速查询指定角色的所有邮件。

表结构

字段名类型默认值说明
idint UNSIGNED0邮件ID(主键,唯一标识)
messageTypetinyint UNSIGNED0邮件类型(0=普通,1=角色创建,2=拍卖,3=生物,4=游戏对象,5=物品)
stationerytinyint41信纸样式(41=默认信纸)
mailTemplateIdsmallint UNSIGNED0邮件模板ID
senderint UNSIGNED0发件人角色GUID
receiverint UNSIGNED0收件人角色GUID
subjectlongtextNULL邮件主题
bodylongtextNULL邮件正文内容
has_itemstinyint UNSIGNED0是否包含附件物品(0=无,1=有)
expire_timeint UNSIGNED0邮件过期时间(Unix时间戳,默认30天)
deliver_timeint UNSIGNED0邮件投递时间(Unix时间戳)
moneyint UNSIGNED0附带的金币数量(铜币单位)
codint UNSIGNED0COD付款取信金额(铜币单位,>0表示需要付款)
checkedtinyint UNSIGNED0邮件是否已读(0=未读,1=已读)

实际案例

案例1:查询指定角色的所有收件

SELECT m.id, m.messageType, m.subject, m.money / 10000 AS gold, m.cod / 10000 AS cod_gold, m.has_items, m.checked, FROM_UNIXTIME(m.deliver_time) AS deliver_date, FROM_UNIXTIME(m.expire_time) AS expire_date FROM mail m WHERE m.receiver = 100 ORDER BY m.deliver_time DESC;

案例2:查询过期未读的邮件

SELECT m.id, c.name AS receiver_name, m.subject, m.money, m.has_items, FROM_UNIXTIME(m.expire_time) AS expire_date FROM mail m JOIN characters c ON c.guid = m.receiver WHERE m.expire_time < UNIX_TIMESTAMP() AND m.checked = 0 ORDER BY m.expire_time;

案例3:统计系统邮件的每日发送量

SELECT DATE(FROM_UNIXTIME(m.deliver_time)) AS date, SUM(CASE WHEN m.messageType = 2 THEN 1 ELSE 0 END) AS auction_mail, SUM(CASE WHEN m.messageType = 0 THEN 1 ELSE 0 END) AS player_mail FROM mail m WHERE m.deliver_time > UNIX_TIMESTAMP() - 30 * 86400 GROUP BY DATE(FROM_UNIXTIME(m.deliver_time)) ORDER BY date DESC;

常见问题

Q1: messageType 字段的取值含义是什么?
0=普通玩家邮件,1=角色创建时的欢迎邮件,2=拍卖行发送的邮件,3=生物/NPC发送的邮件,4=游戏对象发送的邮件,5=物品触发的邮件。
Q2: cod 和 money 有什么区别?
money 是直接附在邮件中的金币(收件人直接领取),cod 是"货到付款"(COD)金额,收件人需要支付该金额才能取走邮件。
Q3: 邮件过期后会自动删除吗?
是的。邮件在 expire_time 到达后,服务器会自动清理该邮件。如果邮件有附件(has_items=1),过期时物品也会一并删除。