• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * lws-api-test-smtp_client
3  *
4  * Written in 2010-2019 by Andy Green <andy@warmcat.com>
5  *
6  * This file is made available under the Creative Commons CC0 1.0
7  * Universal Public Domain Dedication.
8  */
9 
10 #include <libwebsockets.h>
11 
12 #include <signal.h>
13 
14 static int interrupted, result = 1;
15 static const char *recip;
16 
17 static void
sigint_handler(int sig)18 sigint_handler(int sig)
19 {
20 	interrupted = 1;
21 }
22 
23 static int
done_cb(struct lws_smtp_email * email,void * buf,size_t len)24 done_cb(struct lws_smtp_email *email, void *buf, size_t len)
25 {
26 	/* you could examine email->data here */
27 	if (buf) {
28 		char dotstar[96];
29 		lws_strnncpy(dotstar, (const char *)buf, len, sizeof(dotstar));
30 		lwsl_notice("%s: %s\n", __func__, dotstar);
31 	} else
32 		lwsl_notice("%s:\n", __func__);
33 
34 	/* destroy any allocations in email */
35 
36 	free((char *)email->payload);
37 
38 	result = 0;
39 	interrupted = 1;
40 
41 	return 0;
42 }
43 
main(int argc,const char ** argv)44 int main(int argc, const char **argv)
45 {
46 	int n = 1, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;
47 	struct lws_context_creation_info info;
48 	lws_smtp_sequencer_args_t ss_args;
49 	struct lws_context *context;
50 	lws_smtp_sequencer_t *sseq;
51 	lws_smtp_email_t *email;
52 	struct lws_vhost *vh;
53 	char payload[2048];
54 	const char *p;
55 
56 	/* the normal lws init */
57 
58 	signal(SIGINT, sigint_handler);
59 
60 	if ((p = lws_cmdline_option(argc, argv, "-d")))
61 		logs = atoi(p);
62 
63 	p = lws_cmdline_option(argc, argv, "-r");
64 	if (!p) {
65 		lwsl_err("-r <recipient email> is required\n");
66 		return 1;
67 	}
68 	recip = p;
69 
70 	lws_set_log_level(logs, NULL);
71 	lwsl_user("LWS API selftest: SMTP client\n");
72 
73 	memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */
74 	info.port = CONTEXT_PORT_NO_LISTEN;
75 	info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS;
76 
77 	context = lws_create_context(&info);
78 	if (!context) {
79 		lwsl_err("lws init failed\n");
80 		return 1;
81 	}
82 
83 	vh = lws_create_vhost(context, &info);
84 	if (!vh) {
85 		lwsl_err("Failed to create first vhost\n");
86 		goto bail1;
87 	}
88 
89 	memset(&ss_args, 0, sizeof(ss_args));
90 	ss_args.helo = "lws-abs-smtp-test";
91 	ss_args.vhost = vh;
92 
93 	sseq = lws_smtp_sequencer_create(&ss_args);
94 	if (!sseq) {
95 		lwsl_err("%s: smtp sequencer create failed\n", __func__);
96 		goto bail1;
97 	}
98 
99 	/* attach an email to it */
100 
101 	n = lws_snprintf(payload, sizeof(payload),
102 			"From: noreply@example.com\n"
103 			"To: %s\n"
104 			"Subject: Test email for lws smtp-client\n"
105 			"\n"
106 			"Hello this was an api test for lws smtp-client\n"
107 			"\r\n.\r\n", recip);
108 
109 	if (lws_smtpc_add_email(sseq, payload, n, "testserver",
110 				"andy@warmcat.com", recip, NULL, done_cb)) {
111 		lwsl_err("%s: failed to add email\n", __func__);
112 		goto bail1;
113 	}
114 
115 	/* the usual lws event loop */
116 
117 	while (n >= 0 && !interrupted)
118 		n = lws_service(context, 0);
119 
120 bail1:
121 	lwsl_user("Completed: %s\n", result ? "FAIL" : "PASS");
122 
123 	lws_context_destroy(context);
124 
125 	return result;
126 }
127