linux下用c发邮件

http://www.etpan.org/

https://github.com/dinhviethoa/libetpan/blob/master/tests/smtpsend.c



 
   

该用户从未签到

阅读权限
10
积分
0
主题
12
帖子
2910
日志
0
沙发
  发表于 2003-7-5 21:24:54  | 只看该作者

如何在linux下用C实现自动发送邮件?

可以调用外部的mail命令呀。不需要本机是mail server
 
 
   
caohongxin  该用户已被删除
板凳
  发表于 2003-7-5 21:43:27  | 只看该作者

如何在linux下用C实现自动发送邮件?

提示:  作者被禁止或删除 内容自动屏蔽
 
 
   

该用户从未签到

阅读权限
10
积分
0
主题
12
帖子
2910
日志
0
4
  发表于 2003-7-5 22:06:26  | 只看该作者

如何在linux下用C实现自动发送邮件?

一般是你先生成信件,然后用这种方式。

printf(command, "sendmail %s <%s", receiver, mail_file_name);
system(command);
 
 
   
caohongxin  该用户已被删除
5
  发表于 2003-7-6 15:24:05  | 只看该作者

如何在linux下用C实现自动发送邮件?

提示:  作者被禁止或删除 内容自动屏蔽
 
 
   

该用户从未签到

阅读权限
10
积分
0
主题
146
帖子
4574
日志
0
6
  发表于 2003-7-6 18:53:59  | 只看该作者

如何在linux下用C实现自动发送邮件?

1
应该先配好你的mail命令
让可以用mail命令发信

2
system *发信命令"  
发信命令和你自己想发一封信时敲的命令一样
 
 
   

该用户从未签到

阅读权限
10
积分
0
主题
41
帖子
473
日志
0
7
  发表于 2003-7-6 19:03:49  | 只看该作者

如何在linux下用C实现自动发送邮件?

记得好象有现成的库吧.晚上有空帮你找找,找不着可别怪我 :)
 
 
   

该用户从未签到

阅读权限
10
积分
0
主题
28
帖子
342
日志
0
8
  发表于 2003-7-6 19:09:51  | 只看该作者

如何在linux下用C实现自动发送邮件?

orient 类库中提供了利用smtp协议发送邮件的类TSmtp。
TSmtp支持附件,同时发给多个用户。
定义的头文件 smtp.h
下面是一段例子程序:
  1. TSmtp smtp;

  2.   //设置邮件主机
  3.   smtp.Set_Host("smtp.263.net");
  4.   //设置邮件主机接收端口
  5.   smtp.Set_Port(25);
  6.   //设置验证用户名
  7.   smtp.Set_User("menang");
  8.   //设置验证用户密码
  9.   smtp.Set_Passwd("xxxxx");
  10.   //设置发送邮箱
  11.   smtp.Set_Sender("menang @263.net");
  12.   //设置接收邮箱
  13.   smtp.Set_Target("hdssz@263.net");
  14.   //增加接收邮箱
  15.   smtp.Add_Target("h2ds3sz@163.net");
  16.   //附上一个文件
  17.   smtp.Attach_File("c:\\vwd.log");
  18.   //设置邮件正文
  19.   smtp.Set_Msg_Body("这是一份测试maill");
  20.   //设置邮件标题
  21.   smtp.Set_Subject("这是测试123");
  22.   //发送邮件
  23.   if(smtp.Send())
  24.     printf("send ok\n");
  25.   else
  26.    printf("send failure\n");
复制代码
 
 
   

该用户从未签到

阅读权限
10
积分
0
主题
41
帖子
473
日志
0
9
  发表于 2003-7-6 19:26:33  | 只看该作者

如何在linux下用C实现自动发送邮件?

有人已经帮你找到了。
 
 
   
caohongxin  该用户已被删除
10
  发表于 2003-7-6 19:30:25  | 只看该作者

如何在linux下用C实现自动发送邮件?

提示:  作者被禁止或删除 内容自动屏蔽
 
 
   

该用户从未签到

阅读权限
10
积分
0
主题
41
帖子
473
日志
0
11
  发表于 2003-7-6 19:35:42  | 只看该作者

如何在linux下用C实现自动发送邮件?

标准C也有关于邮件的库啊 :)
 
 
   

该用户从未签到

阅读权限
10
积分
0
主题
41
帖子
473
日志
0
12
  发表于 2003-7-6 19:44:34  | 只看该作者

如何在linux下用C实现自动发送邮件?

换了台机器帮你找到了,你看是不是你想要的

http://libetpan.sourceforge.net/
 
 
   

该用户从未签到

阅读权限
10
积分
0
主题
15
帖子
70
日志
0
13
  发表于 2003-7-6 19:59:06  | 只看该作者

如何在linux下用C实现自动发送邮件?

我查了一下,在标准C中好像没有MAIL函数库
 
 
   

该用户从未签到

阅读权限
10
积分
0
主题
146
帖子
4574
日志
0
14
  发表于 2003-7-6 20:02:50  | 只看该作者

如何在linux下用C实现自动发送邮件?

不是标准C的吧

而是另外的函数库
另外也可以使用mengwg的中间件实现或是夜未眠推荐的地址开发
 
 
   
caohongxin  该用户已被删除
15
  发表于 2003-7-6 20:18:46  | 只看该作者

如何在linux下用C实现自动发送邮件?








linux下c发送邮件socket验证问题

下面是一个linux下c写的发送邮件的程序。
我想在SendMail函数中加一些判断。就是与smtp服务器数据交换的每一步加一个验证。比如认证失败了。然后就停止发送邮件。返回一个错误的代号。现在是失败了函数也一直执行。返回结果都是0。不知道是否成功失败。只有看调试信息。我是一个新手。请高手帮忙。先谢了。

[code]
#include "smtp.h"

#ifdef WIN32

#include <windows.h>
#include <winsock.h>
#include <stdio.h>

#else
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>

#endif

int sock_connect(const char *pHostName,  unsigned short nPort)
{
    int  nSock;
    struct hostent *host;
    struct sockaddr_in client_addr;

    if ((host = gethostbyname(pHostName)) == NULL)
    {
#ifdef _DEBUG
        printf("sock_connect gethostbyname() error!\r\n");
#endif
        return 0;
    }

    if ((nSock = (int) socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
#ifdef _DEBUG
        printf("sock_connect socket() error!\r\n");
#endif
        return 0;
    }

    client_addr.sin_family = AF_INET;
    client_addr.sin_port = htons(nPort);
    client_addr.sin_addr = * ((struct in_addr *) host->h_addr);

    memset(&(client_addr.sin_zero), 0, 8) ;
    if (connect(nSock, (struct sockaddr *) &client_addr, sizeof(struct sockaddr)) == -1)
    {
#ifdef _DEBUG
        printf("sock_connect connect() error!\r\n");
#endif
        return 0;
    }

    return (nSock);
}

int sock_close(int nSock)
{
#ifdef WIN32
    return closesocket(nSock);
#else
    return close(nSock);
#endif
}

int sock_send(int nSock, char *pFormat, ...)
{
        char szBuffer[1024];

        va_list argptr;
        va_start(argptr, pFormat);
        vsnprintf(szBuffer, sizeof(szBuffer), pFormat, argptr);
        va_end(argptr);

#ifdef _DEBUG
        printf("%s\r\n",szBuffer);
#endif
        return send(nSock, szBuffer, (int) strlen(szBuffer), 0) ;
}

int sock_read(int nSock, const char *pStop)
{
    int iResult = 0;
    const int nSize = 256;
    char szBuf[256 + 1];

    while  ((iResult = recv(nSock, szBuf, nSize, 0)) > 0) 
    {
        szBuf[iResult] = '\0';

#ifdef _DEBUG
        printf("%s\r\n",szBuf);
#endif

        if  ((pStop) && (strstr(szBuf, pStop) != NULL))
        {
            break;
        }
    }

    return iResult;
}

int SendMail(const char *pHostName, unsigned short nPort, SMTP_MAIL *pMail)
{
    int nSock;
    char szBase64UserName[256];        
    char szBase64Password[256];
    
    sock_start();

    nSock = sock_connect(pHostName, nPort);

    if (nSock)
    {
        sock_read(nSock, "220");
        
        sock_send(nSock, "HELO host_name\r\n");
        sock_read(nSock, "250");

        sock_send(nSock, "EHLO\r\n");
        sock_read(nSock, "250");

        sock_send(nSock, "AUTH LOGIN\r\n") ;
        sock_read(nSock, "334");

        Base64Enc(szBase64UserName, pMail->stHeader.szUserName) ;
        sock_send(nSock, "%s\r\n", szBase64UserName);

        Base64Enc(szBase64Password, pMail->stHeader.szPassword) ;
        sock_send(nSock, "%s\r\n", szBase64Password);

        sock_read(nSock, "235");


        sock_send(nSock, "MAIL FROM: <%s> \r\n", pMail->stHeader.szMailFrom);
        sock_read(nSock, "250") ;

        sock_send(nSock, "RCPT TO: <%s> \r\n", pMail->stHeader.szMailTo);
        sock_read(nSock, "250") ;

        sock_send(nSock,"DATA\r\n") ;
        sock_read(nSock,"354") ;

        sock_send(nSock, "From:%s\r\nTo: %s \r\n", pMail->stHeader.szMailFrom, pMail->stHeader.szMailTo);

        sock_send(nSock, "Subject: %s \r\n", pMail->szSubject);

        sock_send(nSock, "Content-type: %s;charset=%s\r\n", pMail->szContentType, pMail->szCharSet);
        
        sock_send(nSock, "\r\n%s\r\n", pMail->szMailBody);

        sock_send(nSock,"\r\n.\r\n") ; /*end data */
        sock_read(nSock,"250") ;


        sock_send(nSock, "QUIT\r\n") ;
        sock_read(nSock, "221");

        sock_close(nSock);
    }

    sock_end();

    return 0;
}

[/code]

[[i] 本帖最后由 m_lm 于 2007-3-23 13:06 编辑 [/i]]

dajun 发表于 2007-03-23 09:13

sock_read(nSock, "250");

在这个sock_read里处理
如果read的相应不是250就表示出错,其他类似

m_lm 发表于 2007-03-23 11:05

回复 2楼 dajun 的帖子

dajun谢了。这么简单,我怎么没想到:)。

peterdocter 发表于 2008-02-29 11:57

一位楼主可以提供一个完整发邮件代码吗?我参考很多网站的代码都不成功,不知道可否分享大客代码供像我这样的菜的小C初学者做参考学习用?发现大客的不但在linux下能用好像在windows下也可以用?是C还是C++代码?

flw 发表于 2008-02-29 12:12

SMTP 协议要求每条指令的 TCP 包带 push flag。

peterdocter 发表于 2008-02-29 15:07

typedef struct { 
char szUserName[256]="";
char szPassword[256]="";
char szMailFrom[256]="";
char szMailTo[256]="";
char szSubject[256]="";
char szContentType[256]="";
char szContentType[256]="";
char szCharSet[256]="";
char szMailBody[256]="";
}stHeader;
楼主的数据大至结构是这样吗?
SMTP_MAIL *pMail 
^^^^^^^这个是什么?是用define声明?其它大客们有否类似的stmp发送邮件的代码!
我在网上只找到一个:
[url]http://blog.linuxpk.com/8571/viewspace-890[/url]
163/126/tom等没有一个通得过!

flw 发表于 2008-02-29 15:14

呵呵,想要练习收发邮件,强烈建议先从 sohu 的开始,sohu 的邮箱真好啊。
感谢 sohu!

柳五随风 发表于 2008-03-03 11:33

1.HELO/EHLO部分处理的不对
2。对于扩展的ESMTP command,比如AUTH需要验证SMTP Server是否支持该命令。SERVER 支持的ESMTP commands在EHLO命令的返回星系里面可以读到。


因工作需要在Linux环境中用C++编写个发送邮件的程序,着实费了点周折,最终得以满意解决,现将历程与成果与大家分享! 一、刚开始网上一通逛搜,发现Linux环境下,发邮件使用较多的方法是libesmtp包,网上也有示例,按照相关章的指引,很容易就实现的邮件的发送,但问题是不知道如何实现SSL。 二、发现libesmtp文件中有个smtp_starttls_set_ctx接口,似乎是可以解决ssl问题的,逛搜libesmtp解决SSL发送邮件的解决办法,几乎无任何信息,后来下载了个libesmtp的源代码包libesmtp-1.0.6.tar.bz2,内含examples示例目录,可以直接编译成功,但似乎是只支持tls邮件发送,而不支持ssl邮件的发送,百思不得其解。 三、接着寻找别的解决办法,在CSDN搜到一个csmtp说可以解决SSL邮件发送问题的资源,但下载需要50积分,说心里话能解决问题50积分也是值得的,但没有呀,提供资源者还比较仁义,告知资来源于https://www.codeproject.com,于是乎在codeproject找到了csmtp的资源,有两个版本,v2.4版本包CSmtp_v2_4_ssl.zip,v1.8版本分为window(CSmtp_v1_8a.zip)和linux(CSmtp_v1_8b.zip)两个包。 四、为了能省点精力,就直接用版较低的linux版吧,解压后发现有makefile文件,可直接编译通过,一般的邮件能发送成功,但可惜的是v1.8版本也不支持ssl协议。 五、其实从包的名字上就能看出来v2.4版本开始支持 ssl协议,但v2.4并不分windows版本和linux版本,是否能支持linux呢,查看源代码发现有对linux的支持,只是包内没有makefile文件,似乎没有在linux目录下编译过,于是编写了个makefile文件尝试编译,竞然编通过,而且发送文件成功,经过测试可以支持ssl邮件的发送,因暂无需求tls未做测试。 六、现将程序重新打包成csmtp_v2.4_linux.tar文件,与大家分享,文中所提到的相关资源包都一并打包到资源中了。 最后感谢原创christopher w. backen提供的代码资源!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值