/* base64编码 */
static const char* base64_enc_map = \
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int base64_encode( char* dst, size_t* dlen, const unsigned char* src, size_t slen )
{
size_t i, n;
int C1, C2, C3;
char* p; if ( slen == )
{
return ;
} n = ( slen << ) / ; switch ( ( slen << ) - ( n * ) )
{
case :
n += ;
break;
case :
n += ;
break;
default:
break;
} if ( *dlen < n + )
{
*dlen = n + ;
return -;
} n = ( slen / ) * ;
for ( i = , p = dst; i < n; i += )
{
C1 = *src++;
C2 = *src++;
C3 = *src++;
*p++ = base64_enc_map[( C1 >> ) & 0x3F];
*p++ = base64_enc_map[( ( ( C1 & ) << ) + ( C2 >> ) ) & 0x3F];
*p++ = base64_enc_map[( ( ( C2 & ) << ) + ( C3 >> ) ) & 0x3F];
*p++ = base64_enc_map[C3 & 0x3F];
} if ( i < slen )
{
C1 = *src++;
C2 = ( ( i + ) < slen ) ? *src++ : ;
*p++ = base64_enc_map[( C1 >> ) & 0x3F];
*p++ = base64_enc_map[( ( ( C1 & ) << ) + ( C2 >> ) ) & 0x3F];
( i + ) < slen ? ( *p++ = base64_enc_map[( ( C2 & ) << ) & 0x3F] ) : ( *p++ = '=' );
*p++ = '=';
} *dlen = p - dst;
*p = ; return ;
} /* 主动连接 */
static SOCKET tcp_connect( const char* host, unsigned short port = , int msec = )
{
int ret;
SOCKET fd;
struct sockaddr_in sin;
struct hostent* h;
unsigned long ul;
struct timeval tv;
struct linger lg;
int nodelay;
fd_set fdset; /* 填充服务器地址 */
memset( &sin, , sizeof( sin ) );
sin.sin_family = AF_INET;
if ( ( h = gethostbyname( host ) ) == NULL || h->h_addrtype != AF_INET )
{
return INVALID_SOCKET;
}
memcpy( &sin.sin_addr.S_un.S_addr, h->h_addr, h->h_length );
sin.sin_port = htons( port ); /* 建socket */
if ( ( fd = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ) ) == INVALID_SOCKET )
{
return INVALID_SOCKET;
} /* 设置非阻塞 */
ul = ;
if ( ioctlsocket( fd, FIONBIO, &ul ) != )
{
closesocket( fd );
return INVALID_SOCKET;
} /* 主动连接 */
if ( connect( fd, ( const struct sockaddr* ) &sin, sizeof( sin ) ) != )
{
FD_ZERO( &fdset );
FD_SET( fd, &fdset ); memset( &tv, , sizeof( tv ) );
tv.tv_sec = msec / ;
tv.tv_usec = ( msec % ) * ; /* 超时或报错 */
if ( select( fd + , , &fdset, , &tv ) != )
{
closesocket( fd );
return INVALID_SOCKET;
}
} /* 置为阻塞 */
ul = ;
ret = ioctlsocket( fd, FIONBIO, &ul );
assert( ret == ); /*消除滞留*/
memset( &lg, , sizeof( lg ) );
ret = setsockopt( fd, SOL_SOCKET, SO_LINGER, ( const char* ) &lg, sizeof( lg ) );
assert( ret == ); /*禁用合并*/
nodelay = ;
ret = setsockopt( fd, IPPROTO_TCP, TCP_NODELAY, ( const char* ) &nodelay, sizeof( nodelay ) );
assert( ret == ); return fd;
} #define RECV(fd, buff, suc) do { \
if (recv( (fd), (buff), sizeof( (buff) ), ) <= || \
memcmp((buff), (suc), )) \
{ \
closesocket((fd)); \
return -; \
} \
}while() #define SEND(fd, buff, len) do { \
register size_t i = (len); \
if (send( (fd), (buff), i, ) < (int)i) \
{ \
closesocket((fd)); \
return -; \
} \
}while() /* 发邮件 */
int send_mail( const char* server,
const char* user, const char* pwd, \
const char* sender, const char* receiver, \
const char* str, const unsigned char* data, size_t datalen )
{
SOCKET fd;
char buff[];
size_t len;
size_t pos; /* 连接SMTP服务器 */
fd = tcp_connect( server );
if ( fd == INVALID_SOCKET )
{
::MessageBox( NULL, "无法连接服务器,请检查网络设备!", "错误", MB_OK );
return -;
} /* 邮件问答 */
RECV( fd, buff, "" ); sprintf( buff, "HELO %s\r\n", server );
SEND( fd, buff, strlen( buff ) );
RECV( fd, buff, "" ); /* 登录过程 */
SEND( fd, "AUTH LOGIN\r\n", ); /* 请求登录 */
RECV( fd, buff, "" ); len = sizeof( buff );
base64_encode( buff, &len, ( const unsigned char* )user, strlen( user ) );
strcat( buff, "\r\n" );
SEND( fd, buff, len + ); /* 用户名 */
RECV( fd, buff, "" ); len = sizeof( buff );
base64_encode( buff, &len, ( const unsigned char* )pwd, strlen( pwd ) );
strcat( buff, "\r\n" );
SEND( fd, buff, len + ); /* 密码 */
RECV( fd, buff, "" ); /* 邮件头 */
sprintf( buff, "MAIL FROM:<%s>\r\n", sender );
SEND( fd, buff, strlen( buff ) ); /* 发送者 */
RECV( fd, buff, "" ); /* 250 Ok... */ sprintf( buff, "RCPT TO:<%s>\r\n", receiver );
SEND( fd, buff, strlen( buff ) ); /* 接收者 */
RECV( fd, buff, "" ); SEND( fd, "DATA\r\n", ); /* 请求发送数据 */
RECV( fd, buff, "" ); sprintf( buff, "From:\"javadotest\"<%s>\r\n"
"To:\"javado\"<%s>\r\n"
"Subject:邮件标题\r\n"
"MIME-Version: 1.0\r\n"
"Content-Type: multipart/mixed; boundary=\"o0o0o0o0o\"\r\n\r\n", \
sender, receiver );
SEND( fd, buff, strlen( buff ) ); /* 发送邮件内容 */
sprintf( buff, "--o0o0o0o0o\r\n"
"Content-Type: text/plain; charset=\"gb2312\"\r\n\r\n"
"%s\r\n\r\n", str );
SEND( fd, buff, strlen( buff ) ); /* 发送附件 */
strcpy( buff, "--o0o0o0o0o\r\n"
"Content-Type: application/octet-stream; name=\"附件.doc\"\r\n"
"Content-Transfer-Encoding: base64\r\n"
"Content-Disposition: attachment; filename=\"附件.doc\"\r\n\r\n" );
SEND( fd, buff, strlen( buff ) );
if ( datalen > )
{
for ( pos = ; pos < datalen; )
{
len = sizeof( buff );
memset( buff, , sizeof( buff ) ); if ( datalen - pos >= )
{
base64_encode( buff, &len, data + pos, );
strcat( buff, "\r\n" );
SEND( fd, buff, );
pos += ;
}
else
{
base64_encode( buff, &len, data + pos, datalen - pos );
strcat( buff, "\r\n" );
SEND( fd, buff, strlen( buff ) );
break;
}
}
} /* 完成发送 */
SEND( fd, "--o0o0o0o0o--\r\n.\r\nQUIT\r\n", ); /* 请求退出 */
RECV( fd, buff, "" ); /* 250 Ok */ closesocket( fd );
return ;
}

c发邮件的更多相关文章

  1. # PHP - 使用PHPMailer发邮件

    PHPMailer支持多种邮件发送方式,使用起来非常简单 1.下载PHPMailer https://github.com/PHPMailer/PHPMailer,下载完成加压后, 把下边的两个文件复 ...

  2. Linux发邮件之mail命令

    一.mail命令 1.配置 vim /etc/mail.rc 文件尾增加以下内容 set from=1968089885@qq.com smtp="smtp.qq.com" set ...

  3. 测试MailUtils,作用是发邮件

    package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...

  4. SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享

    SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...

  5. 学习linux之用mail命令发邮件

    背景 这两天工作比较闲,网上各种冲浪(这个词暴露我的网龄了).看到一位大神的文章更闲 <>.端详一番,原来是用R语言拼接字符串后用shell命令发出去.发现shell命令既然还能直接发邮件 ...

  6. linux mail利用外部邮箱地址发邮件

    mail命令发送邮件需要sendmail或postfix服务 三种常用格式发信 mail -s "标题" xxx@xxx.xxx #第一种方法,你可以把当前shell当成编辑器来用 ...

  7. 打电话,发短信,发邮件,app跳转

    1.打电话 - (IBAction)callPhone1:(id)sender { NSURL *url = [NSURL URLWithString:@"tel://18500441739 ...

  8. iOS中如何切换到发短信、打电话、发邮件

    我们在做APP的时候,难免会遇到需要调用短信,电话等程序的时候.如美团. 当然,这些都只是一些简单的方法就可以实现,但是时间久了也会淡忘,所以想写这边博客.一是为了再捡起来复习一下,另一个相当于留个备 ...

  9. 发邮件 和 excel导出中文文件名

    /** * 发邮件 * @param email * @param subject * @param body * @throws UnsupportedEncodingException */ pu ...

  10. 【知识积累】JavaMail实现发邮件功能

    一.前言 今天闲来没事,想着通过程序来给别人发邮件.于是,上网搜了一下,相应的资料也很多,刚开始完成了邮件的简单发送,后来想如何能发送附件,继续寻找 答案,但是遇到了一个问题是当我使用txt类型作为附 ...

随机推荐

  1. QT信号槽与Delphi事件的对比

    最近学QT,对信号槽机制感到有点新鲜: QObject::connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int))); 自己 ...

  2. Android中静态变量的生命周期

    静态变量的生命周期,起始于类的加载,终止于类的释放.什么时候类会加载呢?我们知道,在app打开时,会创建一个进程,然后初始化一个dvm的实例,负责类的加载释放 和 垃圾回收等.换句话说,在进程创建之后 ...

  3. 【POJ 1275】 Cashier Employment

    [题目链接] 点击打开链接 [算法] 设Ti为第i小时有多少个出纳员开始工作,Vi表示第i小时有多少个来应聘的出纳员 那么,有 : 1. 0 <= Ti <= Vi 2. Ti + Ti- ...

  4. B1277 [HNOI2002]Tinux系统 树形dp

    这个题bzoj上没有图,luogu上样例有问题...其实这个题代码不难,但是思考起来还是有一定难度的,其实这些题的重点都在于思考.我就不写了,洛谷上唯一的题解写的挺好,大家可以看一看. 题干: 在do ...

  5. linux下.a/.so/.la目标库区别

    在linux平台上编译时,常会遇到目标库的疑问,有静态库也有动态库,单个理解都不太难,但是对复杂的工程而言,一旦混合到一起去,对整个工程的理解和调用,将会造成很大困扰,本文就汇总这几种常见编译结果文件 ...

  6. oracle基础学习---------1

    1.SQL执行时间的开关 set timing on --->开         set timing off--->关 2.创建数据表.以已存在的表创建(也就是复制一个表.但表内没有数据 ...

  7. [转]android使用全局变量的两种方法

    本文转自:http://blog.csdn.net/feiyangxiaomi/article/details/9966215 在我们使用android编写程序的时候,少不了想利用全局变量,但是面向对 ...

  8. vue-cli的创建、基本配置和遇到的问题总结

    vue-cli的创建及基本配置 1. 创建 vue-cli 项目 确保本地安装了最新版本的nodejs环境(会自带npm环境); 全局安装vue-cli,命令:npm i -g vue-cli 创建项 ...

  9. Java系列学习(十四)-集合

    1.java中的集合学习 2.Collection中常用方法 1.添加功能 boolean add(E e):添加一个元素 boolean addAll(Collection<? extends ...

  10. dedecms:解析Robots.txt 协议标准

    Robots.txt 是存放在站点根目录下的一个纯文本文件.虽然它的设置很简单,但是作用却很强大.它可以指定搜索引擎蜘蛛只抓取指定的内容,或者是禁止搜索引擎蜘蛛抓取网站的部分或全部内容. 下面我们就来 ...