/* 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. 尊重百度的api语音合成规则

    屏幕显示字幕内容与形式 和  字幕的播放时长分离 : 去除标点符号的影响 # 设置分句的标志符号:可以根据实际需要进行修改 # cutlist = ".!?".decode('ut ...

  2. js 实现二叉排序树

    二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值: ...

  3. shell 字符串拼接 获取自身文件名 日志记录

    shell  字符串拼接 获取自身文件名 日志记录 [root@hadoop2 xiaole_chk_url]# sh a.sh123.loga.sh[root@hadoop2 xiaole_chk_ ...

  4. JPA学习笔记(13)——查询缓存

    使用hibernate的查询缓存 运行下面代码: String jpql = "FROM User u WHERE u.id = ?"; Query query = entityM ...

  5. ios2--UIView的常见属性

    // // ViewController.m // 06-UIView的常见属性 // #import "ViewController.h" @interface ViewCont ...

  6. Fragmen的onAttach方法

    现在Android开发多使用一个Activity管理多个Fragment进行开发,不免需要两者相互传递数据,一般是给Fragment添加回调接口,让Activity继承并实现. 回调接口一般都写在Fr ...

  7. Maven远程中央仓库地址

    阿里云 - http://maven.aliyun.com/nexus/content/groups/public/ Apache Snapshots - https://repository.apa ...

  8. codeforces——贪心

    codeforces 804A Find Amir   http://codeforces.com/problemset/problem/804/A /* 题意:给定n个学校,需要遍历所有学校,可从任 ...

  9. P2924 [USACO08DEC]大栅栏Largest Fence

    传送门 反正我是看不出来这题和凸包有什么关系--大佬们是怎么想到的-- 不准确一点的说,本题就是要我们求一个边上点数最多的凸包 我们可以先把所有的边都取出来,然后按极角排序.枚举这个凸包的起点,然后做 ...

  10. 不定长数组 Vector的 应用

    #include<cstdio> #include<vector> using namespace std; vector<int>a; int main() { ...