+ for (; addr; addr = addr->next) {
+ /* weed out group mailboxes, since those are for display only */
+ if (addr->mailbox && !addr->group) {
+ if (!smtp_add_recipient (message, addr->mailbox))
+ SMTPFAIL ("smtp_add_recipient");
+ }
+ }
+
+Done:
+ return ret;
+}
+
+static int
+_send_smtp_auth_interact (auth_client_request_t request,
+ char **result, int fields,
+ void *arg __attribute__ ((unused)))
+{
+ int i;
+
+ for (i = 0; i < fields; i++) {
+ if (request[i].flags & AUTH_USER) {
+ result[i] = SmtpAuthUser;
+ } else if (request[i].flags & AUTH_PASS) {
+ if (SmtpAuthPass) {
+ result[i] = SmtpAuthPass;
+ } else {
+ if (authpass[0] == '\0') {
+ char prompt[STRING];
+
+ snprintf(prompt, sizeof(prompt), "%s%s: ", request[i].prompt,
+ request[i].flags & AUTH_CLEARTEXT ? " (not encrypted)" :
+ "");
+ mutt_get_field_unbuffered(prompt, authpass, sizeof(authpass),
+ M_PASS);
+ }
+ result[i] = authpass;
+ }
+ }
+ }
+
+ return 1;
+}
+
+#define BUFLEN 8192
+
+static const char *
+_send_smtp_messagefp_cb(void **buf, int *len, void *arg)
+{
+ int octets;
+
+ if (*buf == NULL)
+ *buf = xmalloc(BUFLEN);
+
+ if (len == NULL) {
+ rewind ((FILE *) arg);
+ return NULL;
+ }
+
+ if (fgets (*buf, BUFLEN - 2, (FILE *) arg) == NULL) {
+ octets = 0;
+ }
+ else {
+ char *p = strchr (*buf, '\0');
+
+ if (p[-1] == '\n' && p[-2] != '\r') {
+ m_strcpy(p - 1, (char *) *buf + BUFLEN - p + 1, "\r\n");
+ p++;
+ }
+ octets = p - (char *) *buf;
+ }
+
+ *len = octets;
+ return *buf;
+}
+
+static void event_cb (smtp_session_t session __attribute__ ((unused)),
+ int event_no, void *arg,...)
+{
+ va_list alist;
+ int *ok;
+
+ va_start(alist, arg);
+ switch(event_no) {
+ case SMTP_EV_CONNECT:
+ case SMTP_EV_MAILSTATUS:
+ case SMTP_EV_RCPTSTATUS:
+ case SMTP_EV_MESSAGEDATA:
+ case SMTP_EV_MESSAGESENT:
+ case SMTP_EV_DISCONNECT: break;
+ case SMTP_EV_WEAK_CIPHER: {
+ int bits;
+ bits = va_arg(alist, long); ok = va_arg(alist, int*);
+ mutt_message (_("SMTP_EV_WEAK_CIPHER, bits=%d - accepted."), bits);
+ sleep(1);
+ *ok = 1; break;
+ }
+ case SMTP_EV_STARTTLS_OK:
+ mutt_message (_("Using TLS"));
+ sleep(1);
+ break;
+ case SMTP_EV_INVALID_PEER_CERTIFICATE: {
+ long vfy_result;
+ vfy_result = va_arg(alist, long); ok = va_arg(alist, int*);
+ mutt_error (_("Error verifying certificate. Error Code: %lu"), vfy_result);
+ sleep(2);
+ *ok = 1;
+ break;
+ }
+ case SMTP_EV_NO_PEER_CERTIFICATE: {
+ ok = va_arg(alist, int*);
+ mutt_message (_("SMTP_EV_NO_PEER_CERTIFICATE - accepted."));
+ sleep(1);
+ *ok = 1; break;
+ }
+ case SMTP_EV_WRONG_PEER_CERTIFICATE: {
+ ok = va_arg(alist, int*);
+ mutt_message (_("SMTP_EV_WRONG_PEER_CERTIFICATE - accepted."));
+ sleep(1);
+ *ok = 1; break;
+ }
+ case SMTP_EV_NO_CLIENT_CERTIFICATE: {
+ ok = va_arg(alist, int*);
+ mutt_message (_("SMTP_EV_NO_CLIENT_CERTIFICATE - accepted."));
+ sleep(1);
+ *ok = 1; break;
+ }
+ case SMTP_EV_EXTNA_DSN:
+ extna ("DSN");
+ break;
+ case SMTP_EV_EXTNA_STARTTLS:
+ extna ("StartTLS");
+ break;
+ case SMTP_EV_EXTNA_8BITMIME:
+ extna ("8BITMIME");
+ break;
+ default:
+ mutt_message(_("Got unhandled event ID = %d - ignored."), event_no);
+ sleep(1);
+ }
+ va_end(alist);
+}
+
+static void do_dsn_notify (smtp_message_t message, const char* from) {
+ int flags = Notify_NOTSET;
+ smtp_recipient_t self = NULL;
+
+ if (m_strisempty(MTransport.dsn_notify) || !message || m_strisempty(from) ||
+ strstr (MTransport.dsn_notify, "never") != NULL)
+ return;
+
+ if (strstr (MTransport.dsn_notify, "failure") != NULL)
+ flags |= Notify_FAILURE;
+ if (strstr (MTransport.dsn_notify, "delay") != NULL)
+ flags |= Notify_DELAY;
+ if (strstr (MTransport.dsn_notify, "success") != NULL)
+ flags |= Notify_SUCCESS;