作者itoc, 信區: itoc
標題[修正] bmtad.c 用轉寄信來 mirror 其他站的板
時間04/01/14
作者: itoc (League) 看板: plan
標題: [修正] 改 bmtad 用轉寄信來 mirror 板
時間: 2004/01/14 Wed 09:48:49 Updated: 2005/05/14
甲站不提供打包看板/精華區的功能
而且甲站長也不願意提供看板/精華區的壓縮檔
這時候可以稍微改一下 bmtad 把該板整個 mirror 回來自己站
或者是即使你拿到甲站的壓縮檔
但是因為版本不合,又不知道如何轉換的話
: bmtad.c:change_hdr() 新增此函式於 bbs_brd() 的前面
static void
change_hdr(hdr, fpath) /* 由文章的第三列來找出原始發文日期 */
HDR *hdr;
char *fpath;
{
char months[12][4] =
{
"jan", "feb", "mar", "apr", "may", "jun",
"jul", "aug", "sep", "oct", "nov", "dec"
};
time_t datevalue;
struct tm ptime;
char buf[ANSILINELEN], *ptr, *str;
FILE *fp;
int i;
if (fp = fopen(fpath, "r"))
{
if (fgets(buf, sizeof(buf), fp))
{
if (ptr1 = strchr(buf, '\n'))
ptr1 = '\0';
if (!strncmp(buf, STR_AUTHOR1 " ", LEN_AUTHOR1 + 1))
ptr1 = buf + LEN_AUTHOR1 + 1;
else if (!strncmp(buf, STR_AUTHOR2 " ", LEN_AUTHOR2 + 1))
ptr1 = buf + LEN_AUTHOR2 + 1;
else
ptr1 = NULL;
if (ptr1 && *ptr1)
{
ptr2 = strchr(ptr1 + 1, '@');
ptr3 = strchr(ptr1 + 1, '(');
if (ptr2 && (!ptr3 || ptr2 < ptr3)) /* 在暱稱裡面的 @ 不算是 email */
{
str_from(ptr1, hdr->owner, hdr->nick);
hdr->xmode |= POST_INCOME; /* also MAIL_INCOME */
}
else if (ptr3)
{
ptr3[-1] = '\0';
str_ncpy(hdr->owner, ptr1, sizeof(hdr->owner));
if (ptr2 = strchr(ptr3 + 1, ')'))
{
*ptr2 = '\0';
str_ncpy(hdr->nick, ptr3 + 1, sizeof(hdr->nick));
}
}
}
if (fgets(buf, sizeof(buf), fp) &&
fgets(buf, sizeof(buf), fp) &&
strlen(buf) > 30 &&
(ptr = strchr(buf, ':')))
{
/* 若甲站文章格式不是這樣,要另外改 */
/* 時間: Sun Apr 24 18:21:52 2005 */
ptr[9] = ptr[12] = ptr[15] = ptr[18] = ptr[21] = ptr[26] = '\0';
for (i = 0; i < 12; i++)
{
if (!str_ncmp(ptr + 6, months[i], 3))
break;
}
ptime.tm_sec = atoi(ptr + 19);
ptime.tm_min = atoi(ptr + 16);
ptime.tm_hour = atoi(ptr + 13);
ptime.tm_mday = atoi(ptr + 10);
ptime.tm_mon = i;
ptime.tm_year = atoi(ptr + 22) - 1900;
ptime.tm_isdst = 0;
#ifndef CYGWIN
ptime.tm_zone = "CST";
ptime.tm_gmtoff = 0;
#endif
datevalue = mktime(&ptime);
str_stamp(hdr->date, &datevalue);
}
}
fclose(fp);
}
}
: bmtad.c:bbs_brd() 不要加入轉寄的檔頭
if (method == 'A')
{
if (!*title)
sprintf(title, "來自 %.64s", author);
- sprintf(buf, "發信人: %.50s 看板: %s\n標 題: %.72s\n發信站: %s\n\n",
- from, brdname, title, Btime(&hdr.chrono));
- write(fd, buf, strlen(buf));
write(fd, data, ap->data + ap->used - data);
close(fd);
}
- hdr.xmode = POST_INCOME;
str_ncpy(hdr.owner, author, sizeof(hdr.owner));
str_ncpy(hdr.title, title, sizeof(hdr.title));
+ hdr_fpath(buf, folder, &hdr);
+ change_hdr(&hdr, buf);
rec_bot(folder, &hdr, sizeof(HDR));
: bmtad.c
然後做這篇 patch
[修正] bmtad.c 寄信給精華區
: bmtad.c:bbs_gem() 不要加入轉寄的檔頭
if (method == 'A')
{
if (!*title)
sprintf(title, "來自 %.64s", author);
- sprintf(buf, "發信人: %.50s 看板: %s\n標 題: %.72s\n發信站: %s\n\n",
- from, brdname, title, Btime(&hdr.chrono));
- write(fd, buf, strlen(buf));
write(fd, data, ap->data + ap->used - data);
close(fd);
}
: bmtad.c:mta_mailer() 跳過 anti-spam 檢查,避免一次轉寄太多被 ban 了
/* --------------------------------------------------- */
/* check E-mail address for anti-spam first */
/* --------------------------------------------------- */
+ #if 0
uptime = ap->uptime;
...
...
+ #endif
/* --------------------------------------------------- */
/* mail post */
/* --------------------------------------------------- */
> ──────────────────────────────────── <
1. 改完 bmtad.c 以後,0Admin→BBSreset→指名及擋信 重開 bmtad
2. mirror 看板文章
登入甲站,進入該板,用 tag 一次把所有文章 F 轉寄到
brdname.brd@my.domain.name
(如果該站不提供 tag,那就只好一篇一篇轉)
3. mirror 精華區文章
登入甲站,進入該板精華區,用 tag 一次把所有文章 F 轉寄到
brdname.gem@my.domain.name
(巢狀結構要自己一層一層進去轉寄)
精華區 mirror 回來時,巢狀結構會消失
所以可以在每 mirror 一個目錄,就回自己的站收錄一個目錄
4. 這樣就可以整個 mirror 回來了
mirror 完以後,記得把 bmtad.c 改回原來的樣子,再重開 bmtad
--
□ 本文章由 itoc 從 itoc.Dorm11.NCTU.edu.tw 發表