name: 新闻稿发布 description: 电子邮件新闻稿工作流,适用于记者和研究人员。用于创建、管理或优化电子邮件新闻稿,建立订阅者列表,设计电子邮件模板,分析参与度指标,或规划新闻稿内容日历。对于独立记者、学术传播者和媒体组织建立直接受众关系至关重要。
新闻稿发布
为新闻和学术构建和管理电子邮件新闻稿的实用工作流。
何时激活
- 从零开始创建新新闻稿
- 为新闻内容设计电子邮件模板
- 建立和细分订阅者列表
- 分析新闻稿性能指标
- 规划新闻稿编辑日历
- 在新闻稿平台间迁移
- 提高送达率和打开率
新闻稿架构
内容策略框架
## 新闻稿策略文档
### 核心身份
- **名称**:
- **标语**(一行):
- **读者获得**: [具体价值主张]
- **频率**: [ ] 每日 [ ] 每周 [ ] 每两周 [ ] 每月
### 目标受众
- 主要读者:
- 他们关心什么:
- 为什么他们会订阅:
- 他们会用这些信息做什么:
### 内容支柱
1. [核心主题 1] - [频率]
2. [核心主题 2] - [频率]
3. [重复特征] - [频率]
### 声音和语调
- 正式 ↔ 对话式: [1-5]
- 严肃 ↔ 轻松: [1-5]
- 报道式 ↔ 个人化: [1-5]
### 成功指标(前6个月)
- 订阅者目标:
- 目标打开率:
- 目标点击率:
问题结构模板
## [新闻稿名称] - 第#[XX]期
**日期**: [日期]
**主题行**: [主题]
**预览文本**: [读者看到的第一个50-90个字符]
---
### 开场钩子
[2-3个句子让读者想继续阅读]
### 主要故事
[您的主要内容 - 大多数新闻稿300-600字]
### 次要项(如适用)
- **快速点击 1**: [带链接的简短项]
- **快速点击 2**: [带链接的简短项]
### 重复部分
[每周专栏、数据点、推荐等]
### 结束语
[个人笔记、号召行动或下一期预览]
---
**退订** | **偏好设置** | **转发给朋友**
技术实现
HTML电子邮件模板(响应式)
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{newsletter_name}}</title>
<style>
/* 电子邮件客户端重置样式 */
body { margin: 0; padding: 0; width: 100%; }
table { border-collapse: collapse; }
img { border: 0; display: block; }
/* 响应式容器 */
.container {
max-width: 600px;
margin: 0 auto;
font-family: Georgia, serif;
font-size: 18px;
line-height: 1.6;
color: #333;
}
/* 黑暗模式支持 */
@media (prefers-color-scheme: dark) {
.container { background-color: #1a1a1a; color: #e0e0e0; }
a { color: #6db3f2; }
}
/* 移动端样式 */
@media only screen and (max-width: 480px) {
.container { padding: 15px !important; }
h1 { font-size: 24px !important; }
}
</style>
</head>
<body>
<table role="presentation" width="100%">
<tr>
<td align="center" style="padding: 20px;">
<div class="container">
<!-- 页眉 -->
<table width="100%">
<tr>
<td style="padding-bottom: 20px; border-bottom: 2px solid #333;">
<h1 style="margin: 0;">{{newsletter_name}}</h1>
<p style="margin: 5px 0 0; color: #666;">{{issue_date}}</p>
</td>
</tr>
</table>
<!-- 内容 -->
<table width="100%">
<tr>
<td style="padding: 30px 0;">
{{content}}
</td>
</tr>
</table>
<!-- 页脚 -->
<table width="100%">
<tr>
<td style="padding-top: 20px; border-top: 1px solid #ddd; font-size: 14px; color: #666;">
<p>您收到此邮件是因为您订阅了{{newsletter_name}}。</p>
<p>
<a href="{{unsubscribe_url}}">退订</a> |
<a href="{{preferences_url}}">更新偏好</a>
</p>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</body>
</html>
Python新闻稿发送器
from dataclasses import dataclass, field
from datetime import datetime
from typing import List, Dict, Optional
from enum import Enum
import hashlib
class SubscriberStatus(Enum):
ACTIVE = "active"
UNSUBSCRIBED = "unsubscribed"
BOUNCED = "bounced"
COMPLAINED = "complained"
@dataclass
class Subscriber:
email: str
name: Optional[str] = None
subscribed_at: datetime = field(default_factory=datetime.now)
status: SubscriberStatus = SubscriberStatus.ACTIVE
tags: List[str] = field(default_factory=list)
custom_fields: Dict = field(default_factory=dict)
@property
def hash_id(self) -> str:
"""为退订链接生成唯一ID。"""
return hashlib.md5(self.email.encode()).hexdigest()[:12]
@dataclass
class NewsletterIssue:
subject: str
preview_text: str
html_content: str
plain_text: str
scheduled_at: Optional[datetime] = None
sent_at: Optional[datetime] = None
issue_number: int = 0
# 指标
sent_count: int = 0
delivered_count: int = 0
opened_count: int = 0
clicked_count: int = 0
bounced_count: int = 0
unsubscribed_count: int = 0
@property
def open_rate(self) -> float:
if self.delivered_count == 0:
return 0.0
return (self.opened_count / self.delivered_count) * 100
@property
def click_rate(self) -> float:
if self.delivered_count == 0:
return 0.0
return (self.clicked_count / self.delivered_count) * 100
class NewsletterManager:
"""核心新闻稿操作。"""
def __init__(self, name: str):
self.name = name
self.subscribers: List[Subscriber] = []
self.issues: List[NewsletterIssue] = []
def add_subscriber(self, email: str, name: str = None,
tags: List[str] = None) -> Subscriber:
"""添加新订阅者,待双重确认。"""
sub = Subscriber(
email=email.lower().strip(),
name=name,
tags=tags or []
)
self.subscribers.append(sub)
return sub
def segment_subscribers(self, tags: List[str] = None,
min_engagement: float = None) -> List[Subscriber]:
"""获取匹配条件的订阅者。"""
active = [s for s in self.subscribers
if s.status == SubscriberStatus.ACTIVE]
if tags:
active = [s for s in active
if any(t in s.tags for t in tags)]
return active
def calculate_engagement_score(self, subscriber: Subscriber) -> float:
"""为订阅者参与度评分0-100。"""
# 实现应跟踪每个订阅者的打开/点击
return 50.0 # 占位符
订阅者管理
列表卫生工作流
from datetime import datetime, timedelta
def clean_subscriber_list(manager: NewsletterManager,
inactive_threshold_days: int = 180) -> dict:
"""识别和处理不活跃订阅者。"""
cutoff = datetime.now() - timedelta(days=inactive_threshold_days)
results = {
'total': len(manager.subscribers),
'active': 0,
'inactive': [],
'bounced': [],
'unsubscribed': []
}
for sub in manager.subscribers:
if sub.status == SubscriberStatus.BOUNCED:
results['bounced'].append(sub.email)
elif sub.status == SubscriberStatus.UNSUBSCRIBED:
results['unsubscribed'].append(sub.email)
elif sub.status == SubscriberStatus.ACTIVE:
# 检查上次参与度
engagement = manager.calculate_engagement_score(sub)
if engagement < 10: # 参与度非常低
results['inactive'].append(sub.email)
else:
results['active'] += 1
return results
def run_reengagement_campaign(inactive_subscribers: List[str]) -> None:
"""向不活跃订阅者发送赢回活动。"""
# 发送“我们想念您”活动
# 如果2次尝试后无参与度,标记为移除
pass
订阅者细分
## 推荐细分
### 按参与度
- **VIP**: 打开率 > 80%,总是点击
- **活跃**: 打开率 40-80%
- **偶尔**: 打开率 10-40%
- **有风险**: 90天内未打开
- **不活跃**: 180天内未打开
### 按兴趣(标签基础)
- 注册时的主题偏好
- 他们点击的内容
- 他们回答的调查/投票
### 按来源
- 有机(网站注册)
- 推荐(朋友转发)
- 社交媒体
- 付费墙/注册墙
主题行优化
高绩效模式
## 有效的主题行公式
### 用于新闻/新闻业
- **突发格式**: “突发: [简洁新闻]”
- **数字**: “[X]件关于[主题]我们学到的事”
- **问题**: “为什么[实体]做[事情]?”
- **直接**: “[主题]: 您需要知道的事”
### 用于分析/观点
- **见解**: “[事件]背后的真实故事”
- **反向**: “为什么每个人都错了关于[主题]”
- **内部**: “[行业]内部人士知道关于[主题]的事”
### 应避免的
- 全大写
- 过多标点符号!!!
- 不兑现的点击诱饵
- 垃圾邮件触发词(免费、紧急、立即行动)
- 误导性预览文本
A/B测试框架
import random
from typing import List, Tuple
def ab_test_subject_lines(subscribers: List[Subscriber],
subject_a: str,
subject_b: str,
test_percentage: float = 0.2) -> dict:
"""
在子集上测试两个主题行,然后全量发送。
"""
test_size = int(len(subscribers) * test_percentage)
test_group = random.sample(subscribers, test_size)
# 分割测试组
half = len(test_group) // 2
group_a = test_group[:half]
group_b = test_group[half:]
remaining = [s for s in subscribers if s not in test_group]
return {
'group_a': {
'subject': subject_a,
'subscribers': group_a,
'size': len(group_a)
},
'group_b': {
'subject': subject_b,
'subscribers': group_b,
'size': len(group_b)
},
'remaining': {
'subscribers': remaining,
'size': len(remaining),
'note': '测试期后向此组发送获胜者'
},
'test_duration_hours': 4
}
送达率最佳实践
电子邮件身份验证设置
## 送达率的DNS记录
### SPF记录
v=spf1 include:_spf.youresp.com ~all
### DKIM
- 通过ESP生成密钥
- 添加带公钥的TXT记录
- 验证签名应用于发出邮件
### DMARC
v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com
### 发送前清单
- [ ] SPF、DKIM、DMARC已配置
- [ ] 发送域名已预热
- [ ] 列表干净(无硬退回)
- [ ] 退订链接有效
- [ ] 页脚包含物理地址(CAN-SPAM)
- [ ] 测试邮件收到在收件箱(非垃圾邮件)
垃圾邮件分数清单
## 发送前
### 内容检查
- [ ] 无垃圾邮件触发词
- [ ] 文本到图像比例良好(主要为文本)
- [ ] 所有链接指向信誉良好的域名
- [ ] 无URL缩短器(使用完整链接)
- [ ] 包括纯文本版本
### 技术检查
- [ ] 发件人地址匹配发送域名
- [ ] 回复地址被监控
- [ ] 预览文本已设置
- [ ] 图像有替代文本
- [ ] 链接未损坏
分析和优化
关键指标仪表板
from dataclasses import dataclass
@dataclass
class NewsletterAnalytics:
"""随时间跟踪新闻稿性能。"""
issue: NewsletterIssue
def summary(self) -> dict:
return {
'issue_number': self.issue.issue_number,
'sent': self.issue.sent_count,
'delivered': self.issue.delivered_count,
'delivery_rate': self._pct(self.issue.delivered_count,
self.issue.sent_count),
'opens': self.issue.opened_count,
'open_rate': self.issue.open_rate,
'clicks': self.issue.clicked_count,
'click_rate': self.issue.click_rate,
'click_to_open': self._pct(self.issue.clicked_count,
self.issue.opened_count),
'unsubscribes': self.issue.unsubscribed_count,
'unsubscribe_rate': self._pct(self.issue.unsubscribed_count,
self.issue.delivered_count),
}
def _pct(self, numerator: int, denominator: int) -> float:
if denominator == 0:
return 0.0
return round((numerator / denominator) * 100, 2)
# 基准(新闻业新闻稿)
BENCHMARKS = {
'open_rate': {'good': 40, 'excellent': 55},
'click_rate': {'good': 4, 'excellent': 8},
'unsubscribe_rate': {'acceptable': 0.5, 'concerning': 1.0},
}
平台比较
| 平台 | 最适合 | 定价模式 | 关键功能 |
|---|---|---|---|
| Substack | 作者优先,付费订阅 | 收入分成 | 内置支付 |
| Buttondown | 开发者,简约 | 按订阅者 | 原生Markdown |
| Ghost | 出版商,会员制 | 固定费用 | 完整CMS包含 |
| beehiiv | 增长导向 | 免费增值 | 推荐工具 |
| ConvertKit | 创作者 | 按订阅者 | 自动化 |
| Mailchimp | 小型组织 | 分层 | 易用模板 |
法律合规
CAN-SPAM要求(美国)
- [ ] 准确的“发件人”名称和电子邮件
- [ ] 非欺骗性主题行
- [ ] 包括物理邮政地址
- [ ] 有效的退订机制
- [ ] 10天内处理退订
- [ ] 无购买列表
GDPR要求(欧盟订阅者)
- [ ] 获得明确同意(非预勾选)
- [ ] 链接清晰的隐私政策
- [ ] 简便的退订流程
- [ ] 应请求提供数据导出
- [ ] 应请求删除数据
- [ ] 存储同意记录
相关技能
- 网络爬取 - 为新闻稿自动化内容收集
- 数据新闻 - 在邮件中包含数据可视化
- 学术写作 - 撰写清晰、结构化的内容
技能元数据
| 字段 | 值 |
|---|---|
| 版本 | 1.0.0 |
| 创建 | 2025-12-26 |
| 作者 | Claude Skills for Journalism |
| 领域 | 发布,营销 |
| 复杂性 | 中级 |