免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5108 | 回复: 19
打印 上一主题 下一主题

发送邮件编程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-18 09:37 |只看该作者 |倒序浏览
最近很郁闷,编写好了发邮件的程序,在国内的邮箱间发邮件是可以,但是用一个日本的邮箱来发邮件,邮件能发出去,但是邮件总是没有被收到,不知道是什么原因,请有经验的高手指点下。
另外在foxmail新建一个账户,用这个日本邮箱来发,邮件就能被收到。不知道我写的邮件有什么不当,每次发完报文后,我都有getresponse,没有报错,一直到发完。用国内的邮箱来发就没有这个问题

论坛徽章:
0
2 [报告]
发表于 2009-03-18 09:53 |只看该作者
看看。。看看对方提示什么信息过来

[ 本帖最后由 maxxfire 于 2009-3-18 10:02 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-03-18 10:03 |只看该作者
既然你都能编个写邮件的程序,哪肯定懂得原理了,懂得原理就一定会调试了,也一定懂得看文档了。

论坛徽章:
0
4 [报告]
发表于 2009-03-18 10:07 |只看该作者
我每发送一次数据都用getresponse获取返回信息,如下:
1::::::250-ATHENE.ssp.ne.jp

1::::::250-AUTH LOGIN PLAIN

1::::::250-AUTH=LOGIN PLAIN

1::::::250-PIPELINING

1::::::250 8BITMIME

auth_base64_flag = 1
2::::::334 VXNlcm5hbWU6

username:::
3::::::334 UGFzc3dvcmQ6

password:::
4::::::235 ok, go ahead (#2.0.0)

01......after send MAIL FROM:250 ok

02......after send RCPT TO:250 ok

03......after send DATA:354 go ahead

04......after send from:::
05......after send To:::
06......after send MIME:::
07......after send SUBJECT:::
08......after send CONTENT:::
09......after send BOUNDARY:::
10......after send first body:::
11......after send BODY:::
write_image_buf: encrypt_b64 ok, after encypt len=91412
12......after send image:::
13......after send BOUNDARY:::
14......after send <.>:::250 ok 1237340559 qp 30575

15......after send quit:::221 ATHENE.ssp.ne.jp

ret=0

论坛徽章:
0
5 [报告]
发表于 2009-03-18 10:21 |只看该作者
发送邮件的函数如下:
int send_mail(char *smtp_server, char *passwd, char *send_from, const char *send_to, char *body)
{
        struct timeval tv;
        int sockfd;
        int i,cnt,rt;
        int auth_base64_flag;
        unsigned char buffer[100*1024], *ptr, username[MAXLINE];
        int first_auth = FALSE;
       
        struct hostent *hent;
       
        char *cmdSMTP = NULL;
       
        if ( (NULL == smtp_server) || (NULL == send_from) ||
                (NULL == body) || ( NULL == passwd ) || (NULL == send_to) )
        {
                printf("smtp_server=%s send_from=%s body=%s passwd=%s send_to=%s\n", \
                                        smtp_server,send_from,body,passwd,send_to);
                return -1;
        }
       


        strncpy(username, send_from, MAXLINE);

        sockfd = ConnectServer(smtp_server, 25, 20);
        if (SOCKET_ERROR == sockfd)
        {
                mail_error("open socket");
                goto error;
        }
       
        tv.tv_sec = 10;
        tv.tv_usec = 0;       
        if ( setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0)
        {
                mail_error("setsockopt");
                goto error;
        }       
       

        getresponse(sockfd, buffer, MAXLINE);
        if ( strncmp(buffer, "220", 3) )
        {               
                mail_error("not smtp server");
                goto error;
        }

        sprintf(buffer, "EHLO %s\r\n", smtp_server);
        if (write(sockfd, buffer, strlen(buffer)) < 0)
        {
                mail_error("EHLO");
                 goto error;
        }


        auth_base64_flag = 0;
        do
        {
                rt = getresponse(sockfd, buffer, MAXLINE);               
                if (rt <= 0)
                {
                        mail_error("getresponse");
                        goto error;
                }
                printf("1::::::%s\n", buffer);
                if ( !strncmp("250-AUTH", buffer, 8) && strstr(buffer, "LOGIN") )
                        auth_base64_flag = 1;
        } while (strncmp(buffer, "250 ", 4) != 0) ;
       
        printf("auth_base64_flag = %d\n", auth_base64_flag);
        if (auth_base64_flag != 0)
        {
                cmdSMTP = "AUTH LOGIN\r\n";
                if ( write(sockfd,"AUTH LOGIN\r\n", 12)  < 0 )       
                        goto error;

                if ( getresponse(sockfd, buffer, MAXLINE) < 0)
                        goto error;
                printf("2::::::%s\n", buffer);

                if ( 0 != strncmp("334 ", buffer,4) )
                        goto error;

                //write the base64 crypted username
                printf("username:::%s\n", username);
                encrypt_b64(buffer, username, strlen(username) );
                strcat(buffer, "\r\n");
                if ( write(sockfd, buffer, strlen(buffer)) < 0)
                        goto error;
                if ( getresponse(sockfd, buffer, MAXLINE) < 0)
                        goto error;
                printf("3::::::%s\n", buffer);

                if ( 0 != strncmp("334 ", buffer, 4) )
                {
                        first_auth = FALSE;
                }
                else
                {
                        first_auth = TRUE;
                }

                //write the base64 crypted passwd
                printf("password:::%s\n", passwd);
                encrypt_b64(buffer, passwd, strlen(passwd) );
                strcat(buffer, "\r\n");
                if ( write(sockfd, buffer, strlen(buffer)) < 0)
                        goto error;
                if ( getresponse(sockfd, buffer, MAXLINE) < 0)
                        goto error;
                printf("4::::::%s\n", buffer);

                if ( 0 != strncmp("235 ", buffer, 4) )
                {
                        first_auth = FALSE;
                }
                else
                {
                        first_auth = TRUE;
                }
                        // auth ok!
        }


        // the first auth failed , try use the send_from as the email account
        if ( auth_base64_flag != 0  && first_auth == FALSE )
        {
                printf("login as email account...\n\n");
                if ( write(sockfd, "AUTH LOGIN\r\n", 12)  < 0 )
                {
                        printf("%d: error\n", __LINE__);
                        goto error;
                }
                if ( getresponse(sockfd, buffer, MAXLINE) < 0)
                {
                        printf("%d: error\n", __LINE__);
                        goto error;
                }
                if ( 0 != strncmp("334 ",buffer,4) )
                {
                        printf("buffer content:%s\n", buffer);
                        printf("%d: error\n", __LINE__);
                        goto error;
                }
                //write the base64 crypted username
                encrypt_b64(buffer, send_from, strlen(send_from) );
                strcat(buffer,"\r\n");
                if ( write(sockfd, buffer, strlen(buffer)) < 0)
                {
                        printf("%d: error\n", __LINE__);
                        goto error;
                }
                if ( getresponse(sockfd, buffer, MAXLINE) < 0)
                {
                        printf("%d: error\n", __LINE__);
                        goto error;
                }
                if ( 0 != strncmp("334 ",buffer,4) )
                {
                        printf("%d: error\n", __LINE__);
                        goto error;
                }
               
                //write the base64 crypted passwd
                encrypt_b64(buffer, passwd, strlen(passwd) );
                strcat(buffer, "\r\n");
                if ( write(sockfd, buffer, strlen(buffer)) < 0)
                {
                        printf("%d: error\n", __LINE__);
                        goto error;
                }
                if ( getresponse(sockfd, buffer, MAXLINE) < 0)
                {
                        printf("%d: error\n", __LINE__);
                        goto error;
                }
                if ( 0 != strncmp("235 ",buffer,4) )
                {
                        printf("%d: error\n", __LINE__);
                        goto error;
                }
                // auth ok!
        }

        sprintf(buffer, "MAIL FROM: <%s>\r\n", send_from);
        write(sockfd, buffer, strlen(buffer));                                //2008-12-01 modify
        getresponse(sockfd, buffer, MAXLINE);
        if (strncmp(buffer, "250", 3))
        {
                printf("The smtp server didn't accept sender name(%s) \n", send_from);
                goto error;
        }
#ifdef MAIL_DEBUG
        printf("01......after send MAIL FROM:%s\n", buffer);
#endif

        memset(buffer, 0, sizeof(buffer));
        sprintf(buffer, "RCPT TO: <%s>\r\n", send_to);
        write(sockfd, buffer, strlen(buffer));
        getresponse(sockfd, buffer, MAXLINE);
        if (strncmp(buffer, "250", 3))
        {
                printf("The smtp server didn't accept the send_to(%s) ret=%s\n", send_to, buffer);
                goto error;
        }
#ifdef MAIL_DEBUG
        printf("02......after send RCPT TO:%s\n", buffer);
#endif


        write(sockfd, "DATA\r\n", 6);
        getresponse(sockfd, buffer, MAXLINE);
        if (strncmp(buffer, "354", 3))
        {
                printf("send \"DATA\" command error:%s\n", buffer);         
                goto error;
        }         
#ifdef MAIL_DEBUG
        printf("03......after send DATA:%s\n", buffer);
#endif

        //next we will write the header
        //To: example@hotmail.com
        //From: in4s@in4s.com
        //Subject: e-Home Security
        //MIME-Version: 1.0
        //Content-Type: multipart/mixed; boundary="PtErOdAcTyL2285248"
        //#define MIME                "MIME-Version: 1.0"
        //#define CONTENT_TYPE        "Content-Type: multipart/mixed"               
       
       
        memset(buffer, 0, sizeof(buffer));  
        sprintf(buffer, "From: %s\r\n", send_from);
        if (write(sockfd, buffer, strlen(buffer)) < 0)
                goto error;
#ifdef MAIL_DEBUG
        memset(buffer, 0, sizeof(buffer));
        getresponse(sockfd, buffer, MAXLINE);
        printf("04......after send from:::%s\n", buffer);
#endif


        memset(buffer, 0, sizeof(buffer));  
        sprintf(buffer, "To: %s\r\n", send_to);
        if (write(sockfd, buffer, strlen(buffer)) < 0)
                goto error;
#ifdef MAIL_DEBUG
        memset(buffer, 0, sizeof(buffer));
        getresponse(sockfd, buffer, MAXLINE);
        printf("05......after send To:::%s\n", buffer);
#endif


        memset(buffer, 0, sizeof(buffer));  
        sprintf(buffer, "%s" "\r\n", MIME);
        if (write(sockfd, buffer, strlen(buffer)) < 0)
                goto error;
#ifdef MAIL_DEBUG
        memset(buffer, 0, sizeof(buffer));
        getresponse(sockfd, buffer, MAXLINE);
        printf("06......after send MIME:::%s\n", buffer);
#endif


        memset(buffer, 0, sizeof(buffer));         
        sprintf(buffer, "Subject: %s\r\n", MAIL_SUBJECT);
        if (write(sockfd, buffer, strlen(buffer)) < 0)
                goto error;
#ifdef MAIL_DEBUG
        memset(buffer, 0, sizeof(buffer));
        getresponse(sockfd, buffer, MAXLINE);
        printf("07......after send SUBJECT:::%s\n", buffer);
#endif

       
        memset(buffer, 0, sizeof(buffer));  
        sprintf(buffer, "%s\r\n", CONTENT_TYPE);
        if (write(sockfd, buffer, strlen(buffer)) < 0)
                goto error;
#ifdef MAIL_DEBUG
        memset(buffer, 0, sizeof(buffer));
        getresponse(sockfd, buffer, MAXLINE);
        printf("08......after send CONTENT:::%s\n", buffer);
#endif

       
        memset(buffer, 0, sizeof(buffer));  
        sprintf(buffer, "\r\n%s\r\n", "--" BOUNDARY);
        write(sockfd, buffer, strlen(buffer));
#ifdef MAIL_DEBUG
        memset(buffer, 0, sizeof(buffer));
        getresponse(sockfd, buffer, MAXLINE);
        printf("09......after send BOUNDARY:::%s\n", buffer);
#endif


        memset(buffer, 0, sizeof(buffer));  
        sprintf(buffer, "%s", FIRST_BODY);
        write(sockfd, buffer, strlen(buffer));
#ifdef MAIL_DEBUG
        memset(buffer, 0, sizeof(buffer));
        getresponse(sockfd, buffer, MAXLINE);
        printf("10......after send first body:::%s\n", buffer);
#endif


        if (write(sockfd, body, strlen(body)) < 0)
                goto error;
#ifdef MAIL_DEBUG
        memset(buffer, 0, sizeof(buffer));
        getresponse(sockfd, buffer, MAXLINE);
        printf("11......after send BODY:::%s\n", buffer);
#endif


        if(-1 == write_image_buf(sockfd))
                goto error;
#ifdef MAIL_DEBUG
        memset(buffer, 0, sizeof(buffer));  
        getresponse(sockfd, buffer, MAXLINE);
        printf("12......after send image:::%s\n", buffer);
#endif


        memset(buffer, 0, sizeof(buffer));  
        sprintf(buffer, "\r\n%s\r\n", "--" BOUNDARY);
        rt = write(sockfd, buffer, strlen(buffer));
#ifdef MAIL_DEBUG
        memset(buffer, 0, sizeof(buffer));  
        getresponse(sockfd, buffer, MAXLINE);
        printf("13......after send BOUNDARY:::%s\n", buffer);
#endif


        rt = write(sockfd, "\r\n.\r\n", 5);
#ifdef MAIL_DEBUG
        memset(buffer, 0, sizeof(buffer));  
        getresponse(sockfd, buffer, MAXLINE);
        printf("14......after send <.>:::%s\n", buffer);
#endif


        rt = write(sockfd, "quit\r\n", 6);
#ifdef MAIL_DEBUG
        memset(buffer, 0, sizeof(buffer));  
        getresponse(sockfd, buffer, MAXLINE);
        printf("15......after send quit:::%s\n", buffer);
#endif
       
        close(sockfd);
        return 0;       

error:
        close(sockfd);
        return -1;       
}

论坛徽章:
0
6 [报告]
发表于 2009-03-18 11:06 |只看该作者
原帖由 chealim 于 2009-3-18 10:07 发表
我每发送一次数据都用getresponse获取返回信息,如下:
1::::::250-ATHENE.ssp.ne.jp

1::::::250-AUTH LOGIN PLAIN

1::::::250-AUTH=LOGIN PLAIN

1::::::250-PIPELINING

1::::::250 8BITMIME
...


从这个看是发送成功了:15......after send quit:::221 ATHENE.ssp.ne.jp
但是又和foxmail表现的不一样,难道用了foxmail的快递模式么。。
smtp服务器设多少

论坛徽章:
0
7 [报告]
发表于 2009-03-18 11:10 |只看该作者
SMTP是mail.asmec.co.jp

论坛徽章:
0
8 [报告]
发表于 2009-03-18 11:28 |只看该作者
看不出什么问题,

论坛徽章:
0
9 [报告]
发表于 2009-03-18 11:43 |只看该作者
请问maxxfire 快递模式是什么模式,怎么设置?

论坛徽章:
0
10 [报告]
发表于 2009-03-18 11:51 |只看该作者
原帖由 chealim 于 2009-3-18 11:43 发表
请问maxxfire 快递模式是什么模式,怎么设置?


邮件特快专递模式就是直接根据收件人的域名,查找它的DNS MX记录,直接连接到该记录指定的SMTP服务器发邮件。。特快专递只能发给一个收件人,即在收信人处只能填写一个邮件地址。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP