processmail.c
上传用户:knt0001
上传日期:2022-01-28
资源大小:264k
文件大小:6k
源码类别:

Email客户端

开发平台:

C/C++

  1. /**
  2.     eMail is a command line SMTP client.
  3.     Copyright (C) 2001 - 2008 email by Dean Jones
  4.     Software supplied and written by http://www.cleancode.org
  5.     This file is part of eMail.
  6.     eMail is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.     eMail is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.     You should have received a copy of the GNU General Public License
  15.     along with eMail; if not, write to the Free Software
  16.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17. **/
  18. #if HAVE_CONFIG_H
  19. # include "config.h"
  20. #endif
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include <unistd.h>
  24. #include <sys/stat.h>
  25. #include "email.h"
  26. #include "dnet.h"
  27. #include "utils.h"
  28. #include "smtpcommands.h"
  29. #include "processmail.h"
  30. #include "progress_bar.h"
  31. #include "error.h"
  32. #define CHUNK_BYTES 1500
  33. /**
  34.  * will invoke the path specified to sendmail with any 
  35.  * options specified and it will send the mail via sendmail...
  36. **/
  37. int
  38. processInternal(const char *sm_bin, dstrbuf *msgcon)
  39. {
  40. int written_bytes=0, bytes = 0;
  41. struct prbar *bar;
  42. FILE *open_sendmail;
  43. char *ptr = msgcon->str;
  44. dstrbuf *smpath;
  45. bar = prbarInit(msgcon->len);
  46. smpath = expandPath(sm_bin);
  47. open_sendmail = popen(smpath->str, "w");
  48. dsbDestroy(smpath);
  49. if (!open_sendmail) {
  50. fatal("Could not open internal sendmail path: %s", smpath->str);
  51. return ERROR;
  52. }
  53. /* Loop through getting what's out of message and sending it to sendmail */
  54. while (*ptr != '') {
  55. bytes = strlen(ptr);
  56. if (bytes > CHUNK_BYTES) {
  57. bytes = CHUNK_BYTES;
  58. }
  59. written_bytes = fwrite(ptr, sizeof(char), bytes, open_sendmail);
  60. if (Mopts.verbose && bar != NULL) {
  61. prbarPrint(written_bytes, bar);
  62. }
  63. ptr += written_bytes;
  64. }
  65. fflush(open_sendmail);
  66. fclose(open_sendmail);
  67. prbarDestroy(bar);
  68. return SUCCESS; 
  69. }
  70. /**
  71.  * Prints a user friendly error message when we encounter and 
  72.  * error with SMTP communications.
  73. **/
  74. static void
  75. printSmtpError()
  76. {
  77. fprintf(stderr, "n");
  78. fatal("Smtp error: %sn", smtpGetErr());
  79. }
  80. /**
  81.  * Gets the users smtp password from the configuration file.
  82.  * if it does not exist, it will prompt them for it.
  83. **/
  84. static char *
  85. getSmtpPass(void)
  86. {
  87. char *retval = getConfValue("SMTP_AUTH_PASS");
  88. if (!retval) {
  89. retval = getpass("Enter your SMTP Password: ");
  90. }
  91. return retval;
  92. }
  93. /**
  94.  * This function will take the FILE and process it via a
  95.  * Remote SMTP server...
  96. **/
  97. int
  98. processRemote(const char *smtp_serv, int smtp_port, dstrbuf *msg)
  99. {
  100. dsocket *sd;
  101. int retval=0, bytes;
  102. char *smtp_auth=NULL;
  103. char *email_addr=NULL;
  104. char *use_tls=NULL;
  105. char *user=NULL, *pass=NULL;
  106. struct prbar *bar=NULL;
  107. char nodename[MAXBUF] = { 0 };
  108. char *ptr = msg->str;
  109. struct addr *next=NULL;
  110. email_addr = getConfValue("MY_EMAIL");
  111. if (gethostname(nodename, sizeof(nodename) - 1) < 0) {
  112. snprintf(nodename, sizeof(nodename) - 1, "geek");
  113. }
  114. /* Get other possible configuration values */
  115. smtp_auth = getConfValue("SMTP_AUTH");
  116. if (smtp_auth) {
  117. user = getConfValue("SMTP_AUTH_USER");
  118. if (!user) {
  119. fatal("You must set SMTP_AUTH_USER in order to user SMTP_AUTHn");
  120. return ERROR;
  121. }
  122. pass = getSmtpPass();
  123. if (!pass) {
  124. fatal("Failed to get SMTP Password.n");
  125. return ERROR;
  126. }
  127. }
  128. bar = prbarInit(msg->len);
  129. if (Mopts.verbose) {
  130. printf("Connecting to server %s on port %dn", smtp_serv, smtp_port);
  131. }
  132. sd = dnetConnect(smtp_serv, smtp_port);
  133. if (sd == NULL) {
  134. fatal("Could not connect to server: %s on port: %d", 
  135. smtp_serv, smtp_port);
  136. return ERROR;
  137. }
  138. /* Start SMTP Communications */
  139. if (smtpInit(sd, nodename) == ERROR) {
  140. printSmtpError();
  141. goto end;
  142. }
  143. /* Use TLS? */
  144. use_tls = getConfValue("USE_TLS");
  145. #ifndef HAVE_LIBSSL
  146. if (use_tls) {
  147. warning("No SSL support compiled in. Disabling TLS.n");
  148. use_tls = NULL;
  149. }
  150. #endif
  151. if (use_tls && strcasecmp(use_tls, "true") == 0) {
  152. if (smtpStartTls(sd) != ERROR) {
  153. dnetUseTls(sd);
  154. dnetVerifyCert(sd);
  155. if (smtpInit(sd, nodename) == ERROR) {
  156. printSmtpError();
  157. goto end;
  158. }
  159. } else {
  160. printSmtpError();
  161. goto end;
  162. }
  163. }
  164. /* See if we're using SMTP_AUTH. */
  165. if (smtp_auth) {
  166. retval = smtpInitAuth(sd, smtp_auth, user, pass);
  167. if (retval == ERROR) {
  168. printSmtpError();
  169. goto end;
  170. }
  171. }
  172. retval = smtpSetMailFrom(sd, email_addr);
  173. if (retval == ERROR) {
  174. printSmtpError();
  175. goto end;
  176. }
  177. while ((next = (struct addr *)dlGetNext(Mopts.to)) != NULL) {
  178. retval = smtpSetRcpt(sd, next->email);
  179. if (retval == ERROR) {
  180. printSmtpError();
  181. goto end;
  182. }
  183. }
  184. while ((next = (struct addr *)dlGetNext(Mopts.cc)) != NULL) {
  185. retval = smtpSetRcpt(sd, next->email);
  186. if (retval == ERROR) {
  187. printSmtpError();
  188. goto end;
  189. }
  190. }
  191. while ((next = (struct addr *)dlGetNext(Mopts.bcc)) != NULL) {
  192. retval = smtpSetRcpt(sd, next->email);
  193. if (retval == ERROR) {
  194. printSmtpError();
  195. goto end;
  196. }
  197. }
  198. retval = smtpStartData(sd);
  199. if (retval == ERROR) {
  200. printSmtpError();
  201. goto end;
  202. }
  203. while (*ptr != '') {
  204. bytes = strlen(ptr);
  205. if (bytes > CHUNK_BYTES) {
  206. bytes = CHUNK_BYTES;
  207. }
  208. retval = smtpSendData(sd, ptr, bytes);
  209. if (retval == ERROR) {
  210. goto end;
  211. }
  212. if (Mopts.verbose && bar != NULL) {
  213. prbarPrint(bytes, bar);
  214. }
  215. ptr += bytes;
  216. }
  217. retval = smtpEndData(sd);
  218. if (retval != ERROR) {
  219. retval = smtpQuit(sd);
  220. }
  221. end:
  222. prbarDestroy(bar);
  223. dnetClose(sd);
  224. return retval;
  225. }