1 /*****************************************************************************\
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
8 ** use mailer to send mail about message **
10 \*****************************************************************************/
14 #include <sys/types.h>
15 #include <sys/resource.h>
24 static char *months[] = {
25 "January", "February", "March", "April", "Mai", "June", "July",
26 "August", "September", "October", "November", "December"
31 * create mail with or without sample
32 * the process creates forks to keep pbx running
43 char callerintern[32];
48 static void *mail_child(void *arg)
50 struct mail_args *args = (struct mail_args *)arg;
51 char *email = args->email;
52 char *filename = args->filename;
53 int year = args->year;
55 int mday = args->mday;
56 int hour = args->hour;
58 char *callerid = args->callerid;
59 char *callerintern = args->callerintern;
60 char *callername = args->callername;
61 char *terminal = args->terminal;
68 unsigned char e1, e2, e3;
70 unsigned char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
71 struct sched_param schedp;
74 PDEBUG(DEBUG_EPOINT, "child process started for sending a mail\n");
76 /* lower priority to keep pbx running fluently */
77 if (options.schedule > 0)
79 memset(&schedp, 0, sizeof(schedp));
80 schedp.sched_priority = 0;
81 ret = sched_setscheduler(0, SCHED_OTHER, &schedp);
84 PERROR("Scheduling to normal priority failed (errno = %d).\nExitting child process...\n", errno);
90 SPRINT(command, "%s -f%s %s", SENDMAIL, options.email, email);
91 if ((ph = popen(command, "w")) < 0)
93 PERROR("Cannot send mail using command '%s'\n", command);
98 fprintf(ph, "MIME-Version: 1.0\n");
99 fprintf(ph, "Content-Type: multipart/mixed;\n\tboundary=\"next_part\"\n");
100 fprintf(ph, "From: %s <%s>\n", NAME, options.email);
101 fprintf(ph, "To: %s\n", email);
102 fprintf(ph, "Subject: Message from '%s' recorded.\n\n", callerid);
105 fprintf(ph, "This is a MIME-encapsulated message\n--next_part\n");
106 fprintf(ph, "Content-Type: text/plain; charset=us-ascii\nContent-Transfer-Encoding: 7bit\n\n");
107 fprintf(ph, "\nThe voice box of %s has recorded a message:\n\n * extension: %s\n * from: %s", NAME, terminal, callerid);
109 fprintf(ph, " (intern %s)", callerintern);
111 fprintf(ph, " %s", callername);
112 fprintf(ph, "\n * date: %s %d %d %d:%02d\n\n", months[mon], mday, year+1900, hour, min);
114 /* attach audio file */
116 if ((fh = open(filename, O_RDONLY)))
118 while(strchr(filename, '/'))
119 filename = strchr(filename, '/')+1;
120 fprintf(ph, "--next_part\n");
121 if (strlen(filename) >= 4)
122 if (!strcasecmp(filename+strlen(filename)-4, ".wav"))
123 fprintf(ph, "Content-Type: audio/x-wav;\n\tname=\"%s\"\n", filename);
124 fprintf(ph, "Content-Transfer-Encoding: base64\nContent-Disposition: inline;\n\tfilename=\"%s\"\n\n", filename);
126 /* stream from disk and encode */
129 /* read exactly one line */
130 cnt = read(fh, rbuf, 54);
147 buffer[(i<<2)+3] = base64[e3 & 0x3f];
148 buffer[(i<<2)+2] = base64[((e3>>6)+(e2<<2)) & 0x3f];
149 buffer[(i<<2)+1] = base64[((e2>>4)+(e1<<4)) & 0x3f];
150 buffer[i<<2] = base64[e1 >> 2];
154 buffer[(i<<2)-1] = '=';
156 buffer[(i<<2)-2] = '=';
157 buffer[(i<<2)] = '\n';
158 buffer[(i<<2)+1] = '\0';
160 fprintf(ph, "%s", buffer);
167 SPRINT(buffer, "-Error- Failed to read audio file: '%s'.\n\n", filename);
168 fprintf(ph, "%s", buffer);
169 PERROR("%s", buffer);
175 /* wait for mail to be sent and close process */
179 PDEBUG(DEBUG_EPOINT, "child process done for sending a mail\n");
182 memset(args, 0, sizeof(struct mail_args));
188 void send_mail(char *filename, char *callerid, char *callerintern, char *callername, char *vbox_email, int vbox_year, int vbox_mon, int vbox_mday, int vbox_hour, int vbox_min, char *terminal)
190 struct mail_args *arg;
193 arg = (struct mail_args *)calloc(1, sizeof(struct mail_args));
196 PERROR("failed to alloc memory.\n");
201 SCPY(arg->email, vbox_email);
202 SCPY(arg->filename, filename);
203 arg->year = vbox_year;
205 arg->mday = vbox_mday;
206 arg->hour = vbox_hour;
208 SCPY(arg->callerid, callerid);
209 SCPY(arg->callerintern, callerintern);
210 SCPY(arg->callername, callername);
211 SCPY(arg->terminal, terminal);
213 if ((pthread_create(&tid, NULL, mail_child, arg)<0))
215 PERROR("failed to create mail-thread.\n");
219 PDEBUG(DEBUG_EPOINT, "EPOINT '%s' send mail: child process created for sending a mail\n", terminal);