Encontrar todos los usuarios de un grupo dentro de direcciones de correo electrónico en ciertos dominios

Nuestro servidor compartido de Mailgun está siendo bloqueado en dominios controlados por Microsoft. Quiero enviar un mensaje a las personas de ese grupo que tengan direcciones de correo electrónico de Microsoft.

Busco código en Ruby para encontrar todos los usuarios dentro de un grupo con direcciones de correo electrónico en ciertos dominios.

Esto nos ocurre de vez en cuando, pero generalmente se resuelve por sí solo a medida que ellos gestionan al remitente o remitentes infractores. En algunas ocasiones, he solicitado al soporte de Mailgun que nos asignen una dirección IP menos concurrida y lo han hecho.

¿Estás en el nivel gratuito o en un plan de pago?

Plan “Concepto” de pago. ~30k correos electrónicos al mes.

Otra forma posible: crea un nuevo grupo y agrega automáticamente a los miembros de un dominio específico, luego envía un mensaje a ese grupo:

/g/custom/new

Esto es lo que escribí para extraer las direcciones de correo electrónico de usuarios que tienen correos dentro de un conjunto de dominios y que pertenecen a un conjunto de grupos.

def extract_users_email_addresses_by_named_domains_and_group_names(domain_names=[], group_names=[], output_path=nil, verbose=false)
  
  # TODO: cambiar las llamadas SQL para usar parámetros
  
  results = []
  user_ids = []
  group_ids = []
  users_email_addresses = []
  
  group_names_sql = 'select * from groups where '
  group_names_where = ''
  
  user_emails_sql = 'select user_id from user_emails where '
  user_emails_where = ''
  
  if domain_names.length > 0 and group_names.length > 0 then    
    domain_names.each do |domain_name|
      if user_emails_where.length == 0 then
        user_emails_where = sprintf("email like '%%%s%%'", domain_name)
      else
        user_emails_where = sprintf("%s or email like '%%%s%%'", user_emails_where, domain_name)
      end
    end
    user_emails_sql = sprintf("%s %s", user_emails_sql, user_emails_where)
    if verbose then
      puts "UserEmail.find_by_sql(\"#{user_emails_sql}\")"
    end
    user_emails = UserEmail.find_by_sql(user_emails_sql)
    user_emails.each do |user_email|
      user_ids.push(user_email.user_id)
    end
    
    group_names.each do |group_name|
      if group_names_where.length == 0 then
        group_names_where = sprintf("name like '%%%s%%'", group_name)
      else
        group_names_where = sprintf("%s or name like '%%%s%%'", group_names_where, group_name)
      end
    end
    group_names_sql = sprintf("%s %s", group_names_sql, group_names_where)
    if verbose then
      puts "Group.find_by_sql(\"#{group_names_sql}\")"
    end
    groups = Group.find_by_sql(group_names_sql)
    groups.each do |group|
      group_ids.push(group.id)
    end
    
    group_users = GroupUser.where(group_id: group_ids.to_set, user_id: user_ids.to_set)
    user_ids = []
    group_users.each do |group_user|
      user_ids.push(group_user.user_id)
    end
    
    users = User.where(id: user_ids.to_set)
    users.each do |user|
      users_email_addresses.push(sprintf("%s", user.email))
    end
    
    if output_path then
      file = File.open(output_path, "w")
      first = true
      users_email_addresses.each do |users_email_address|
        if first then
          first = false
          file.write(users_email_address)
        else
          file.write(sprintf(",%s", users_email_address))
        end
      end
      file.write("\n")
      file.close()
    end
  end
  
  return { group_ids: group_ids.to_set, user_ids: user_ids.to_set, users_email_addresses: users_email_addresses }
end

domain_names = ['outlook.com', 'hotmail', 'live.com']
group_names = ['irish-club-members']
output_path = 'irish-club-microsoft-email-list.txt'
verbose = false

extract_users_email_addresses_by_named_domains_and_group_names(domain_names: domain_names, group_names: group_names, output_path: output_path, verbose: verbose)

He logrado que movieran cuentas a nuevas direcciones IP con los planes gratuitos de 10k/mes, a veces en menos de una hora. Definitivamente deberías abrir un ticket.

Parece que ya lo solucionaron… sin necesidad de abrir un ticket :slight_smile:
:cool: