获取路由器外网ip并email(从sina博客移入)

在网上找到了这个网页,它返回的html代码在body标签中只有访问者的ip,可以很方便的进行解析。下载的任务就交个了libcurl库,它是一个强大的下载库,支持很多不同的协议。根据官方的文档,能够很方便的将页面下载到内存中,而且正好只有body标签里面的数据,免去了字符处理的步骤。关键代码:

[cc lang='c' ]

char *fetchIP(char *url)

{

char *IP = (char*)malloc(20);

CURL *curl_handle;

struct memStruct memHtml =

{ NULL, 0 };

curl_global_init(CURL_GLOBAL_ALL);

curl_handle = curl_easy_init(); //初始化curl句柄

curl_easy_setopt(curl_handle, CURLOPT_URL, url); //设置url

curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, writeMemoryCallback); //设置回调函数

curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&memHtml); //设置保存的结构

curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); //设置agent

CURLcode ret = curl_easy_perform(curl_handle);

//返回了错误代码,打印错误,返回NULL指针

if (ret != CURLE_OK)

{

printf("error(%d): %s", ret, curl_easy_strerror(ret));

curl_easy_cleanup(curl_handle);

curl_global_cleanup();

return NULL;

}

curl_easy_cleanup(curl_handle);

strncpy(IP, memHtml.memory, memHtml.size - 1);

if (memHtml.memory)

{

free(memHtml.memory);

}

curl_global_cleanup();

return IP;

}

[/cc]

其中memStruct结构定义为:

[cc lang='c' ]

struct memStruct

{

char *memory;

size_t size;

};

[/cc]

回调函数主要是将获取到的值存入自定义的结构中:(其中第一个参数为实际下载的数据,后面两个size_t类型的参数的乘积是此次下载数据的总长度,最后一个参数为注册保存数据结构的指针)

[cc lang='c' ]

static size_t writeMemoryCallback(void *ptr, size_t size, size_t nmemb,

void *data)

{

size_t realsize = size * nmemb;

struct memStruct *mem = (struct memStruct*) data;

mem->memory = myrealloc(mem->memory, mem->size + realsize + 1);

if (mem->memory)

{

memcpy(&(mem->memory[mem->size]), ptr, realsize);

mem->size += realsize;

mem->memory[mem->size] = 0;

}

return realsize;

}

[/cc]

获取了ip地址之后,就是要发送邮件了。这里为了简单起见,直接调用了系统的mail命令发送邮件。

[cc lang='c' ]

int mail(char *destination, char *subject, char *content)

{

FILE *fp;

char command[1024];

fp = fopen("/tmp/letter", "w");

fputs(content, fp);

fclose(fp);

sprintf(command, "mail -s %s %s <letter", subject, destination);

int ret = system(command);

system("rm -f /tmp/letter");

return ret;

}

[/cc]

不过,即使是使用了mail命令,也需要在本地架设邮件服务器,因为在自己的笔记本电脑上装的是postfix,所以在龙芯电脑上装的也是postfix。安装非常方便,直接apt-get install postfix就可以了,后面设置成直接发送邮件。

但是这样的设置会有问题,mail命令发送到gmail的邮件都被认为是垃圾邮件,即使能够添加过滤器来阻止,但有时候gmail的smtp服务器会直接阻止邮件的发送。所以需要重新设置下postfix。我把postfix设置成了使用gmail的smtp发送邮件。具体设置方法比较麻烦,参考的是这里。不过里面的脚本因为写死了路径,不太好用,还是建议直接按照后面的手工操作步骤来执行。不过手工执行的时候还是要注意路径,特别是生成的认证文件的路径,如果签名或者其他步骤中提示有文件找不到,需要调整文件的路径。

设置之后重启postfix,在命令行中使用mail命令测试下,在收件箱里面可以看见,发件人编程了gmail自己定义的gmail了,这样邮件服务器就不会把这个邮件认为是垃圾邮件了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据